inside22
@inside22

Как как создавать асинхронные cURL HTTP-запросы в PHP?

Доброго утра.

Есть готовый Backend с которым можно работать посредством REST API, мы начали делать Frontend на PHP и столкнулись со следующей проблемой.

В двух вкладках браузера открываю следующие адреса:

frontend/client/123
происходит следующее, NGINX на стороне frontend получает эти запросы и отправляет их PHP.
PHP сразу же для формирования ответа отправляет 10 запросов к Backend API.

frontend/client/456
происходит следующее, NGINX на стороне frontend получает эти запросы и отправляет их PHP и все! Этот запрос не обрабатывается ровно до того момента, пока cURL не отработает по первому запросу.

В связи с этой проблемой, у меня есть несколько вопросов, на которые я пока не могу найти ответа.
Буду очень признателен, если вы меня дадите подсказку.

1) Можно ли заставить cURL работать асинхронно?
2) Если десять разных пользователей с разных компьютеров обратяться к Frontend, cURL будем обрабатывать все запросы последовательно? Или последовательно отрабатываются запросы только в рамках одной PHP-сессии?

3) Что выбрать на замену PHP, чтобы получить асинхронную обработку запросов? hhvm, PHP 7 или Python?
  • Вопрос задан
  • 3013 просмотров
Пригласить эксперта
Ответы на вопрос 4
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Или последовательно отрабатываются запросы только в рамках одной PHP-сессии?

Именно так.
Дело не в curl, скорее всего, а в том, что у вас в первом запросе открывается сессия и не закрывается. Поскольку сессия хранится в файле, он блокируется на всё время выполнения выполнения запроса и второй запрос ждёт разблокировки.

Session data is usually stored after your script terminated without the need to call session_write_close(), but as session data is locked to prevent concurrent writes only one script may operate on a session at any time. When using framesets together with sessions you will experience the frames loading one by one due to this locking. You can reduce the time needed to load all the frames by ending the session as soon as all changes to session variables are done.

php.net/manual/ru/function.session-write-close.php
Ответ написан
Комментировать
@Nc_Soft
ok google curl_multi_init()
Ответ написан
Комментировать
MisterX
@MisterX
На сколько я понимаю, у Вас долго генерируется страница. И пока генерируется первая страница, конект из браузера занят ей. Если вы внимательно посмотрите конекты к нжинксу, то увидите, что второй реквест не приходит. Это же можно проверить, если открыть эти 2 страницы, одну в обычном режиме, вторую в анонимном, тогда описанной проблемы не будет, все страницы отправят запрос к вебсерверу одновременно, не используя одно соединение.
Ответ написан
Комментировать
@vshvydky
фрондэнд на пхп на стороне сервера? это как-то не ясно.
В чем проблема во фронтэнде (в браузере) юзера отправлять пост/гет запрос в бекэнд и получать асинхронно ответы в бразузер?
Если есть проблема с кросдоменкой, банальный пхп-прокси делаете на локалхосте, но зхапросы все равно шлет браузер.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы