Следующее относится к сайту разработки, над которым я работаю. Он работает на облачном сервере в 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.
Что мне нужно сделать / изменить / настроить, чтобы иметь возможность запускать до нескольких тысяч обработанных почти одновременно.
Спасибо.