Не могу понять, Promise - помогают справится с адом колбеков в асинхронных операциях, но РНР не выполняется асинхронно (в отличие от JS)
1. какую проблему решают Promise в PHP? (guzzle/promises, reactphp/promise)
2. Можно ли выполнять операции асинхронно\паралельно в PHP используя промисы? (в реализации reactphp/promise и guzzle/promises - нет асинхроности и паралельности)
РНР может быть асинхронным, но для этого нужно использовать
а. Thread, или
б. pcntl_fork, или
в. воротить курлами запросы самому себе
1. о какой асинхронности идет речь, если я могу сделать тяжелый запрос (или просто поставить sleep(10)) и все будут его ждать, т.к. ниодна из библиотек (guzzle/promises, reactphp/promise) не реализует ни Thread, ни pcntl_fork.
2. возможно. различие здесь очень тонкое, наверно асинхронность - это частный случай паралельности (задачи можно обрабатывать паралельно и синхронно, а можно паралельно и асинхронно). Но асинхронность подразумевает паралельное выполнение - а это значит неблокирование задач друг другом, в JS это есть из коробки (ну или они это хорошо эмулируют) РНР я не могу себе представить асинхронным\паралельным.
Max Gulturyan: а вы путаете асинхронность с многопоточностью?
какие есть события, которые надо ждать:
- ответ базы
- получение данных в потоке
больше в пхп нет таких вещей, которые можно не ждать
1. вы можете сделать тяжёлый запрос и не ждать ответа. используя mysqli и poll. пхп изначально не был заточен под события, с помощью которых реализовывается асинхронность.
мне кажется, вы не совсем понимаете как работает асинхронность в js и как она внутри себя ведёт. что такое блокирующие блоки и т.д.
В js, в отличие от пхп, выполняется всего один поток на все (!) соединения. В пхп на каждое соединение свой поток (грубо говоря) и ему нет смысла переключаться на другой контекст.
2. Асинхронность — это способ, при котором время ожидания тратиться на выполнение задач из стека задач, но при возникновении события, текущая задача прерывается и поток возвращается к предыдущей, которое стояло в ожидании. И так работает js. Вроде бы асинхронно, но задачи всё равно выполняются одним потоком, а значит одна за другой, а не параллельно. В пхп же можно сделать трушную асинхронность с параллельным выполнением задач, всё как вы сказали использую pthread, fork и epoll.
В пхп да, сложнее релизовать, потому что не нативно, хотя к этому двигается, хоть и очень медленно (я про появление pthread и poll — это нативные системные инструмены для параллельности и асинхронности).
romy4:
1. в рамках одного риквеста - РНР однопоточный и не асинхронный, отсюда и вопрос: зачем однопоточному РНР (в рамках одно го риквеста) Promise?
mysqli и poll - ничего не решают, ведь есть postgres, лперации с файлами и много чего в РНР - это блокирующие поток функции.
Max Gulturyan: как же не решают. Вы можете любой хендлер скормить poll и делать что-нибудь ещё, но в целом это мало когда нужно.
Promise в пхп используется для ветвления вашей логики. Реализация, так сказать state-machine.
Но и в js промисы нужны только там, где у вас куча несвязанных событий (тобишь в интерфейсе). А в случае с backend js та же фигня выходит. Вам всё равно надо ждать ответ базы, например.
С просимами ещё можно подготовить шаблоны и потом после положительного решения делать вставку. Небольшая экономия.
Иногда это просто меинстрим, иногда необходимость. Зависит от решений, используемых внутри сайта.
Max Gulturyan, дак вы полностью правы! - promises реализует только promises он не должен делать код синхронным, в php есть другие методы позволяющие делать код синхронным с неблокирующим контекстом как в js ( ну или близко к этому ) Суть то в том что promises это просто обертка которая вам позволяет удобно работать с синхронность/много поточностью но она не должна их реализовывать для этого есть другие инструменты.