Назад | Перейти на главную страницу

Как остановить внутренние PHP-скрипты, вызванные веб-сервером Apache?

Я вызываю некоторые внутренние скрипты PHP на веб-сервере Apache, которые запрограммированы на работу в течение нескольких дней. Проблема в том, что я не могу найти способ остановить эти скрипты (кроме перезапуска сервера с помощью sudo apachectl restart).

Обычно я бегал ps -aux | grep script_name получить PID и убить его.

Но в этом случае, когда я делаю это с помощью PHP ( shell_exec("ps -aux | grep script_name") Я не вижу процесса .. моя гипотеза заключается в том, что при вызове скриптов через apache он запускает их внутри, поэтому они не видны.

Есть идеи, как проверить, какие скрипты запущены, и прервать их при необходимости?

Запускать вещи, которые требуют времени в рамках веб-запроса, просто неправильно - даже в 2020 году с http / 2.

Можно достичь результата идентификации и завершения соответствующего процесса из командной строки (подсказка mod_status), но это проблема XY.

Видеть - https://stackoverflow.com/questions/2212635/best-way-to-manage-long-running-php-script

Хорошо, из информации, которую я получил из ваших комментариев, я думаю, что вы используете mod_php модуль apache для включения скриптов php. Это также объясняет, почему вам нужно перезапустить apache, который с точки зрения убивает все потоки, включая бегунов php.

Поскольку php работает как поток в вашем apache, у вас не будет шансов использовать kill или тому подобное, потому что парсер php не разветвляется или вообще не является отдельным процессом.

Самое чистое решение (с моей точки зрения) - это регулярно проверять, установлен ли флаг. Я предполагаю, что ваш скрипт выполняет некоторые тяжелые вычислительные операции, которые вызывают задержку. Вы можете разделить вычислительные усилия на более мелкие части. Если задержки возникают из-за вещей, связанных с вводом-выводом, вам может потребоваться разделить это или установить тайм-ауты.

Затем вы регулярно проверяете, установлен ли определенный флаг (пусть это будет настройка БД, папка или что-то подобное). Если да, то пользователь запросил аборт, и вы даже можете корректно остановить вычисления.

Все, что вам нужно сделать сейчас, это определить дополнительный скрипт, который устанавливает флаг. Не забудьте снять флаг, когда завершение работы основного воркера было остановлено и все снова наладилось.