Запуск PHP-скрипта из PHP-скрипта без блокировки
-
19-09-2019 - |
Вопрос
Я создаю паука, который будет проходить по различным сайтам и собирать с них данные.
Поскольку мне нужно получить каждую страницу отдельно, это может занять ОЧЕНЬ много времени (возможно, 100 страниц).Я уже установил set_time_limit равным 2 минутам на страницу, но похоже, что Apache уничтожит скрипт через 5 минут, несмотря ни на что.
Обычно это не проблема, поскольку это запускается из cron или чего-то подобного, не имеющего этого ограничения по времени.Однако мне также хотелось бы, чтобы администраторы могли запускать выборку вручную через HTTP-интерфейс.
Не важно, чтобы Apache оставался активным в течение всего времени, я собираюсь использовать AJAX для запуска выборки и время от времени проверять с помощью AJAX.
Моя проблема заключается в том, как начать выборку из PHP-скрипта без прекращения выборки, когда вызывающий ее сценарий умирает.
Возможно, я мог бы использовать system('script.php &'), но я не уверен, что это поможет.Есть еще идеи?
Решение
$cmd = "php myscript.php $params > /dev/null 2>/dev/null &";
# when we call this particular command, the rest of the script
# will keep executing, not waiting for a response
shell_exec($cmd);
При этом все STDOUT и STDERR отправляются в /dev/null, и ваш скрипт продолжает выполняться.Даже если «родительский» сценарий завершится раньше myscript.php, myscript.php завершит выполнение.
Другие советы
если вы не хотите использовать exec, вы можете использовать встроенную функцию PHP!
ignore_user_abort(true);
это заставит сценарий возобновить работу, даже если соединение между браузером и сервером прервано;)