nohup:在后台运行 PHP 进程

2022-01-03 00:00:00 process cron background nohup php

我尝试在后台运行 php 进程并从 php 文件启动它.

i try to run php processes in background and start this from an php file.

一些信息:PHP 5.2.17 版本,php safe_mode 关闭,linux 系统.我用 exec 启动进程,已经试过 shell_exec.我将所有文件设置为 0755、0777.

Some informations: PHP Version 5.2.17, php safe_mode is off, linux system. I start the process with exec, tried already shell_exec. I set all files to 0755, 0777.

$pid = exec("nohup $cmd > /dev/null 2> /dev/null & echo $!");

如果我打印这个语句,我得到这个并且pid没问题:

If i print this statement, i get this and the pid is okay:

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

如果我在 ssh 下寻找进程

If i look for processes under ssh with

top

我看到我的 php5 进程具有正确的 pid.用户是root

i see my php5 process with the correct pid. user is 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    

如果我启动过程手册顶部看起来像这样:

if i start the process manual top looks like this:

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 

问题:似乎什么也没发生.为了调试一点,我在文件中写了一个输出

The problem: it seems like nothing happens.To debug a little bit i wrote a output in the file

ob_start();
echo "STARTING...";
writeLog(ob_get_contents());
//...
function writeLog($info){
    $handle = fopen("file.log", "a+");
    fwrite($handle, $info);
    fclose($handle);
} 
exit;

我的文件中没有日志.如果我在浏览器中启动此文件,它会正确处理并获取包含调试"信息的 file.log.

No logs in my file. If I start this file in my browser, it processes correctly and get my file.log with the "debugging" information.

为什么这在浏览器中有效,而在 exec/shell_exec 命令中无效??!我有正确的pid这些php进程,但没有结果.

Why this is working in browser and not on exec/shell_exec command??! i have exactly these php processes with correct pid, but no result.

非常感谢您的帮助!

推荐答案

PHP CLI 环境可以不同于 Web 环境(mod_php、FCGI 等等).从命令行运行脚本时,脚本完全有可能因错误而死亡,而不是通过网络服务器调用它时.调试您的脚本.如果可以,通过 SSH 连接到您的服务器,su 到网络服务器用户,然后自己从命令行运行脚本.

The PHP CLI environment can be different from the web environment (mod_php, FCGI, whatever). It's entirely possible for a script to die with an error when run from the commandline and not when you invoke it through a webserver. Debug your script. If you can, SSH into your server, su to the webserver user and run the script from the commandline yourself.

如果你做不到,建立你自己的开发服务器,在那里你可以做到这一点(如果你知道一些 Linux,这并不难).

If you can't do that, set up your own development server where you can do this (it's not that hard if you know some Linux).

相关文章