Как я могу заставить этот php cURL работать лучше? - PullRequest
0 голосов
/ 08 мая 2019

Следующее относится к сайту разработки, над которым я работаю. Он работает на облачном сервере в Ionos (1 и 1), который работает на CentOS Linux 7.6.1810 (Core) и PHP 7.2.18.

У меня есть php cronjob, который является родительским процессом. Этот скрипт проверяет базу данных на наличие записей, которые необходимо обработать, и для каждой записи, которая должна быть обработана, родительский процесс порождает дочерний процесс, который вызывается через php cURL. Я использую функцию multi_curl.

В настоящее время я тестирую его с 25 фиктивными записями, и мне нужно будет обрабатывать до 5000 записей, когда я начну работу. В настоящее время дочерние процессы просто записывают результат в файл журнала.

Все 25 дочерних процессов должны запускаться почти одновременно; однако менее 10 (часто 5 или менее) запускаются одновременно, а затем остальные запускаются по завершении предыдущих запросов. Это неприемлемо, и мне нужно знать, что нужно изменить в моей настройке (php / mysql / etc), чтобы решить эту проблему и запустить все дочерние процессы как можно ближе к одновременному.

Родительский процесс выбирает записи для обработки из базы данных, а затем порождает дочерние процессы с помощью:

    $ch = array();
    $mh = curl_multi_init();
    $URLs = array();

    while ($row = mysqli_fetch_assoc($sql_list)) { // process each reservation
    extract($row);

        $url = '/cronjobs/reservation.child.php?jid=' . $j_id;
        array_push($URLs, $url);
}

   foreach ($URLs as $url) {
    $ch[$i] = curl_init();
    curl_setopt($ch[$i], CURLOPT_URL, $url);
    curl_setopt($ch[$i], CURLOPT_HEADER, 0);

    curl_multi_add_handle($mh, $ch[$i]);
    $i++;
}

$active = null;
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($active);


$i = 0;
foreach ($ch AS $i => $c) {
    curl_multi_remove_handle($mh, $c);
}

curl_multi_close($mh);

и порожденный дочерний процесс в настоящее время записывает в файл журнала. Вот и все.

Ниже приведена недавняя запись в журнале:

2019-05-07 13:32:01: Запущены запросы на обработку

2019-05-07 13:32:01: Идентификатор запроса 1: введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 2: введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 3: введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 4: Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 5: Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 6: введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 7: введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 8: введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 9: Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 10: Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 11: Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 12. Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Запрос ID 13: Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Код запроса 14: введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Код запроса 15: введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 16: введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 17: Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 18: введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 19: Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 20: Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 21: Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 22: Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 23: Введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Код запроса 24: введенная очередь обработки и статус обновлены до «Обработка»

2019-05-07 13:32:01: Идентификатор запроса 25: Введенная очередь обработки и статус обновлены до «Обработка»

Пока родительский сценарий php породил 25 дочерних элементов через php cURL… такпока все хорошо. Однако все 25 должны начаться почти одновременно, но это результат:

2019-05-07 13:32:01: Запрос ID 7: Отправлено в 13: 32: 01.97731400и статус обновлен до «Обработан»

2019-05-07 13:32:01: Идентификатор запроса 4: отправлен в 13: 32: 01.98214300, а статус обновлен до «Обработан»

2019-05-07 13:32:02: запрос ID 3: отправлено в 13: 32: 02.99112000 и статус обновлен до «Обработано»

2019-05-07 13:32:02: запрос 11: отправлено в13: 32: 02.99643700 и состояние обновлено до «Обработано»

2019-05-07 13:32:02: Идентификатор запроса 1: Отправлено в 13: 32: 02.99687200 и состояние обновлено до «Обработано»

2019-05-07 13:32:02: Идентификатор запроса 13: Отправлено в 13: 32: 02.99788200 и статус обновлен до «Обработано»

2019-05-07 13:32:03: ЗапросID 5:Отправлено в 13: 32: 03.00521700, статус обновлен до «Обработано»

2019-05-07 13:32:03: Идентификатор запроса 10: Отправлено в 13: 32: 03.00567200, статус обновлен до «Обработано»

2019-05-07 13:32:33: Идентификатор запроса 14: отправлено в 13: 32: 33.97885900 и статус обновлен до «Обработано»

2019-05-07 13:32:34: Идентификатор запроса 25: Отправлено в 13: 32: 34.98112300 и статус обновлен до «Обработано»

2019-05-07 13:32:38: Идентификатор запроса 12: Отправлено в 13: 32: 38.98721700 и статус обновленв "Обработано"

2019-05-07 13:32:38: Идентификатор запроса 6: Отправлено в 13: 32: 38.98854100 и статус обновлен до "Обработано"

2019-05-0713:32:43: запрос ID 21: отправлено в 13: 32: 43.00379900 и статус обновлен до «Обработано»

2019-05-07 13:32:45: запрос 2: отправлено в 13:32: 45.00574600 и статус обновлен до «Обработан»

2019-05-07 13:32:53: Идентификатор запроса 15: отправлен в 13: 32: 53.05596300 и статус обновлен до «Обработан»

2019-05-07 13:32:53:Идентификатор запроса 20: Отправлено в 13: 32: 53.05604100 и статус обновлен до «Обработано»

Из 25 появившихся потомков фактически обработано только 15, и, вместо всех, начиная примерно с 13:32:01,они порождали почти минуту.

Я контролировал top во время обработки, и загрузка процессора никогда не превышала 2.x процентов.

В журналах plesk для сайта некоторые из детей имелиследующая ошибка:

504 GET /cronjobs/reservation.child.php?jid=8&jeid=027093&starttime=1557250321.6883&timeToStartProcess=1557250380&timeToSleep=58307153 HTTP / 1.0

* 1109, а также 11 1111 * 11* mod_fcgid: чтение тайм-аута данных за 45 секунд

и

Конец вывода сценария перед заголовками: jumpseat.reservation.child.php

и

*152510 Тайм-аут восходящего потока (110: Тайм-аут соединения) при чтении заголовка ответа из апстрима

Я использую php 7.2.18, пробовал FastCGI и оба варианта FPM.Я также пробовал различные комбинации настроек PHP-FPM.

Что мне нужно сделать / изменить / настроить, чтобы иметь возможность запускать до нескольких тысяч обработанных почти одновременно.

Спасибо.

1 Ответ

0 голосов
/ 08 мая 2019

Если вы просто нажимаете на URL, взгляните на эту альтернативную реализацию:

https://www.onlineaspect.com/2009/01/26/how-to-use-curl_multi-without-blocking/

Вы можете установить $rolling_window (количество параллельных потоков) по своему вкусу в терминах ресурсов сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...