Проблема: У меня есть страница на моем сайте, которая делает запрос к другому ресурсу на localhost, используя cURL. Если будет сделано больше одновременных запросов, чем число дочерних процессов php -pm, сервер остановится до истечения времени ожидания всех запросов. В замороженном состоянии взгляд сверху показывает, что все процессоры php -fpm спят. Эта проблема возникает только в том случае, если cURL запрашивает ресурс на локальном хосте в том же или другом виртуальном хосте, поэтому кажется, что происходит какой-то тип блокировки?
Ниже приведен пример страницы, которая вызывает другую страницу с использованием cURL:
serverOne. php
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1/serverTwo.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
Время ожидания всех запросов истекает с 504 Gateway Timeout, и сервер снова становится отзывчивым.
Ожидаемое поведение Сервер должен легко обрабатывать гораздо больше запросов, чем этот, но зависает при наличии более 25 запросов (это то, что установлено в pm.max_children). Любая другая страница может обрабатывать тысячи запросов.
Я создал хранилище, чтобы обеспечить минимальную репликацию проблемы параллелизма, с которой я столкнулся после обновления приложения php с mod_ php до php - FPM. https://github.com/paul-rchds/php-fpm-curl-issue
Чтобы повторить проблему. Пожалуйста, клонируйте связанный репозиторий и запустите:
docker-compose up --build
И запустите мой python сценарий, который выполняет одновременные подключения:
docker-compose run python python stress_test.py
Сценарий python сделает 50 одновременных запросов к страница serverOne. php, эта страница делает запрос curl к serverTwo. php. Как вы увидите, сервер будет зависать до истечения времени ожидания. Изменяя URL-адрес сценариев python для запроса непосредственно к serverTwo. php, вы можете легко увеличить количество запросов до 1000+ без каких-либо задержек.