Я пытаюсь запустить php-процессы в фоновом режиме и запустить это из php-файла.
Некоторая информация: PHP Version 5.2.17, php safe_mode выключен, Linux-система. Я запускаю процесс с помощью exec, уже пробовал shell_exec. Я установил все файлы в 0755, 0777.
$pid = exec("nohup $cmd > /dev/null 2> /dev/null & echo $!");
Если я напечатаю это заявление, я получаю это, и pid в порядке:
nohup /usr/local/bin/php5 /.../../file.php > /dev/null 2> /dev/null & echo $!
Если я ищу процессы под ssh с
top
Я вижу, что мой php5-процесс с правильным pid. пользователь root
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3533 xxxxxxxx 20 0 21356 8868 4580 S 0 0.4 0:00.13 php5 3536 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5 3539 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5 3542 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5 3545 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5 3548 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5 3551 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5
если я начинаю руководство по началу процесса, выглядит так:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 8141 xxxxxxxx 22 2 24048 9.9m 5344 S 10 0.5 0:00.31 php5
Проблема: кажется, ничего не происходит. Чтобы немного отладить, я написал вывод в файле
ob_start(); echo "STARTING..."; writeLog(ob_get_contents()); //... function writeLog($info){ $handle = fopen("file.log", "a+"); fwrite($handle, $info); fclose($handle); } exit;
В моем файле нет журналов. Если я запустил этот файл в своем браузере, он корректно обработает и получит файл file.log с информацией об отладке.
Почему это работает в браузере, а не в команде exec / shell_exec?! У меня есть именно эти php-процессы с правильным pid, но результата нет.
Большое спасибо за помощь!
Среда PHP CLI может отличаться от веб-среды (mod_php, FCGI, что угодно). Возможно, сценарий умеет с ошибкой при запуске из командной строки, а не при вызове через веб-сервер. Отлаживайте свой скрипт. Если вы можете, SSH на свой сервер, обратитесь к пользователю веб-сервера и запустите скрипт из командной строки самостоятельно.
Если вы не можете этого сделать, настройте свой собственный сервер разработки, где вы можете это сделать (это не так сложно, если вы знаете какой-то Linux).
За исключением возможной проблемы с разрешением, аналогичный ответ размещен здесь – https://stackoverflow.com/a/22705727/3471333 .
nohup /usr/local/bin/php5 /.../../file.php </dev/null 2> /dev/null & echo $!