Обновление с mod_ php до fpm мое приложение зависает, когда к странице, которая использует cURL, запрашивает другой ресурс на локальном хосте, несколько запросов - PullRequest
0 голосов
/ 20 апреля 2020

Проблема: У меня есть страница на моем сайте, которая делает запрос к другому ресурсу на 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+ без каких-либо задержек.

...