nohup: запустить процесс PHP в фоновом режиме - PullRequest
7 голосов
/ 13 марта 2011

Я пытаюсь запустить php-процессы в фоновом режиме и запустить его из php-файла.

Некоторая информация: PHP версии 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, но без результата.

Большое спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 13 марта 2011

Среда CLI PHP может отличаться от веб-среды (mod_php, FCGI и т. Д.). Сценарий вполне может умереть с ошибкой при запуске из командной строки, а не при вызове его через веб-сервер. Отладьте ваш скрипт. Если вы можете, SSH на вашем сервере, su для пользователя веб-сервера и запустить скрипт из командной строки самостоятельно.

Если вы не можете этого сделать, настройте свой собственный сервер разработки, где вы можете это сделать (это не так сложно, если вы знаете немного Linux).

0 голосов
/ 28 марта 2014

За исключением возможной проблемы с разрешением, аналогичный ответ размещен здесь - https://stackoverflow.com/a/22705727/3471333.

nohup /usr/local/bin/php5 /.../../file.php </dev/null 2> /dev/null & echo $!
...