Как обрабатывать несколько параллельных запросов от одного клиента к одному сценарию PHP

У меня есть веб-страница, на которой пользователи переходят к нескольким (10-20) Ajax-запросам сразу к одному PHP-скрипту, который в зависимости от параметров в запросе возвращает другой отчет с сильно агрегированными данными.

Проблема заключается в том, что для получения многих данных во многих отчетах требуются тяжелые вызовы SQL, а в некоторых случаях загрузка отчета может занять несколько секунд.
В результате, поскольку один клиент отправляет несколько запросов одному и тому же сценарию PHP, вы в конечном итоге видите, что отчеты медленно загружаются на страницу по одному. Другими словами, создание отчетов не выполняется параллельно, что приводит к тому, что страница полностью загружается.

Есть ли способ обойти это в PHP и сделать так, чтобы все запросы от одного клиента к одному скрипту PHP обрабатывались параллельно, чтобы страница и все ее отчеты могли загружаться быстрее?

Спасибо.

3

Решение

Насколько я знаю, это можно сделать многопоточность в PHP.
Посмотри на расширение pthreads.

Что вы можете сделать, так это сделать генерацию отчетов частью / функцией скрипта, который будет выполняться параллельно. Это обеспечит выполнение каждой функции в отдельном потоке и будет намного быстрее получать ваши результаты. Кроме того, установите максимальное количество одновременных потоков <= 10, чтобы он не превратился в боров ресурса.

Вот это базовый учебник, с которого можно начать работу с pthreads.

И несколько больше примеров что может быть полезным (в частности, пример SQLWorker в вашем случае)

3

Другие решения

Настройка сервера

Это скорее проблема конфигурации сервера и зависит от того, как PHP установлен в вашей системе: если вы используете php-fpm Вы должны увеличить pm.max_children вариант. Если вы используете PHP через (F) CGI, вам нужно настроить сам веб-сервер, чтобы использовать больше детей.

База данных

Вы также должны убедиться, что ваш сервер базы данных позволяет запускать много параллельных процессов. Это не принесет пользы, если у вас достаточно запущенных процессов PHP, но половина из них должна ждать, пока база данных заметит их.

Например, в MySQL настройка для этого max_connections,

Ограничения браузера

Другая проблема, с которой вы сталкиваетесь, заключается в том, что браузеры не будут выполнять 10-20 параллельных запросов к одним и тем же хостам. Это зависит от браузера, но, насколько мне известно, современные браузеры одновременно открывают только 2-6 подключений к одному хосту (домену). Таким образом, любые другие запросы будут помещаться в очередь независимо от конфигурации сервера.

альтернативы

Если вы используете MySQL, вы можете попытаться объединить все ваши вызовы в один запрос и использовать параллельные запросы SQL, используя MySQLi :: Опрос ().

Если это невозможно, вы можете попробовать вызвать дочерние процессы или разветвиться в своем PHP-скрипте.

1

По вопросам рекламы [email protected]