Запуск PHP скрипт из командной строки в качестве фонового процесса
Я пытаюсь запустить PHP script постоянно в фоновом режиме через командную строку в Linux. Я пробовал команду php filename.php &
, но похоже, что выполнение script завершается очень быстро, в то время как оно должно продолжаться до тех пор, пока процесс не будет завершен.
Любые предложения?
Ответы
Ответ 1
Вы уверены, что скрипт не содержит ошибок? Это то, что обычно делает "выполнение заканчивается очень быстро".
Сначала добавьте:
error_reporting(E_ALL); ini_set('display_errors', 1);
вверху вашего скрипта, чтобы вывести на экран все возможные ошибки, вы можете использовать:
nohup php filename.php &
nohup запускает команду, даже если сеанс отключен или пользователь выходит из системы.
ИЛИ ЖЕ
nohup php filename.php >/dev/null 2>&1 &
То же, что и выше, но не создает файл nohup.out
.
Вы также можете использовать:
ignore_user_abort(1);
Установите, должно ли отключение клиента прерывать выполнение скрипта
set_time_limit(0);
Ограничивает максимальное время выполнения скрипта, в этом случае он будет работать до тех пор, пока процесс не завершится или процесс apache не перезапустится.
Заметки
Пути php
и filename.php
могут предоставляться как полный путь, вместо php
и filename.php
вы можете использовать /usr/bin/php
и /full/path/to/filename.php
.
Рекомендуется использовать полный путь, чтобы избежать ошибок в файле.
Ответ 2
процесс может быть закрыт, когда сеанс закрыт.
попробуйте использовать nohup php filename.php
Ответ 3
nohup /path/to/command-name arg1 arg2 &
Где:
command-name
: имя оболочки script или имя команды. Вы можете передать аргумент команде или оболочке script.
&
: nohup автоматически не запускает команду, выполняемую в фоновом режиме; вы должны сделать это явно, закончив командную строку символом a и.
Ответ 4
nohup php file.php > /dev/null 2>&1 &
Большие-thans (>
) в командах, подобных этим, перенаправляют выводимые программы где-то. В этом случае что-то перенаправляется на /dev/null
, и что-то перенаправляется на &1
Стандартный вход, выход и ошибка
Существует три стандартных источника ввода и вывода для программы. Стандартный ввод обычно поступает с клавиатуры, если его интерактивная программа или из другой программы, если ее обработка выводится другими программами. Обычно программа печатает на стандартный вывод и иногда печатает стандартную ошибку. Эти три дескриптора файла (вы можете думать о них как "каналы данных" ) часто называются STDIN, STDOUT, and STDERR
.
Иногда они не называются, theyre пронумерованы! Встроенные номера для них 0, 1, and 2
, в этом порядке. По умолчанию, если вы не указали имя или номер один явно, вы говорите о STDOUT
.
приведенная выше команда перенаправляет стандартный вывод на /dev/null
, который является местом, где вы можете сбросить все, что вам не нужно, а затем перенаправляет стандартную ошибку в стандартный вывод (вам нужно поставить &
перед пунктом назначения, когда вы это делаете).
Таким образом, краткое объяснение состоит в том, что "все данные этой команды должны быть записаны в черную дыру". Это хороший способ сделать программу очень тихой!
&
в конце ставит команду в фоновом режиме.
ref: https://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/