2011-03-13 150 views
6

我尝试在后台运行php进程,并从一个php文件启动。nohup:在后台运行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。用户是根

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 

问题: 好像也没什么happens.To调试一点点我写了一个输出文件

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命令?!我有正确的PID这些PHP进程,但没有结果。

非常感谢您的帮助!

+0

您应该先尝试提供您尝试执行的脚本的绝对路径,而不是像您现在似乎在做的相对路径。 IE浏览器。使用'nohup/usr/local/bin/php5 /absolute/path/to/file.php>/dev/null 2>/dev/null&echo $!' – wimvds 2011-03-13 09:51:30

+0

我有这个文件的绝对路径。我可以从ssh中的每个目录启动nohup。它的工作。不幸的是不使用PHP。 – stoe 2011-03-13 09:58:02

+0

然后它可能是一个权限问题。因此,请检查您的日志(Apache,php错误日志,控制台日志)......如果您正在运行AppArmor/SELinux,请尝试关闭它以测试是否需要更改安全策略以允许执行这些后台任务。 – wimvds 2011-03-13 10:26:09

回答

1

PHP CLI环境可以不同于Web环境(mod_php,FCGI,不管)。当从命令行运行脚本时,脚本完全有可能死掉,而不是通过Web服务器调用脚本。调试你的脚本。如果可以,请通过SSH连接到您的服务器,然后连接到Web服务器用户,并自行从命令行运行脚本。

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