У меня есть веб-страница, на которой пользователи переходят к нескольким (10-20) Ajax-запросам сразу к одному PHP-скрипту, который в зависимости от параметров в запросе возвращает другой отчет с сильно агрегированными данными.
Проблема заключается в том, что для получения многих данных во многих отчетах требуются тяжелые вызовы SQL, а в некоторых случаях загрузка отчета может занять несколько секунд.
В результате, поскольку один клиент отправляет несколько запросов одному и тому же сценарию PHP, вы в конечном итоге видите, что отчеты медленно загружаются на страницу по одному. Другими словами, создание отчетов не выполняется параллельно, что приводит к тому, что страница полностью загружается.
Есть ли способ обойти это в PHP и сделать так, чтобы все запросы от одного клиента к одному скрипту PHP обрабатывались параллельно, чтобы страница и все ее отчеты могли загружаться быстрее?
Спасибо.
Насколько я знаю, это можно сделать многопоточность в PHP.
Посмотри на расширение pthreads.
Что вы можете сделать, так это сделать генерацию отчетов частью / функцией скрипта, который будет выполняться параллельно. Это обеспечит выполнение каждой функции в отдельном потоке и будет намного быстрее получать ваши результаты. Кроме того, установите максимальное количество одновременных потоков <= 10, чтобы он не превратился в боров ресурса.
Вот это базовый учебник, с которого можно начать работу с pthreads.
И несколько больше примеров что может быть полезным (в частности, пример SQLWorker в вашем случае)
Это скорее проблема конфигурации сервера и зависит от того, как PHP установлен в вашей системе: если вы используете php-fpm
Вы должны увеличить pm.max_children
вариант. Если вы используете PHP через (F) CGI, вам нужно настроить сам веб-сервер, чтобы использовать больше детей.
Вы также должны убедиться, что ваш сервер базы данных позволяет запускать много параллельных процессов. Это не принесет пользы, если у вас достаточно запущенных процессов PHP, но половина из них должна ждать, пока база данных заметит их.
Например, в MySQL настройка для этого max_connections
,
Другая проблема, с которой вы сталкиваетесь, заключается в том, что браузеры не будут выполнять 10-20 параллельных запросов к одним и тем же хостам. Это зависит от браузера, но, насколько мне известно, современные браузеры одновременно открывают только 2-6 подключений к одному хосту (домену). Таким образом, любые другие запросы будут помещаться в очередь независимо от конфигурации сервера.
Если вы используете MySQL, вы можете попытаться объединить все ваши вызовы в один запрос и использовать параллельные запросы SQL, используя MySQLi :: Опрос ().
Если это невозможно, вы можете попробовать вызвать дочерние процессы или разветвиться в своем PHP-скрипте.