9

我尝试在后台运行 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 命令上工作??!我有这些具有正确 pid 的 php 进程,但没有结果。

非常感谢您的帮助!

4

3 回答 3

2

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

如果你不能这样做,请设置你自己的开发服务器,在那里你可以做到这一点(如果你知道一些 Linux,这并不难)。

于 2011-03-13T10:51:06.117 回答
0

除了可能的权限问题外,此处发布了类似的答案 - https://stackoverflow.com/a/22705727/3471333

nohup /usr/local/bin/php5 /.../../file.php </dev/null 2> /dev/null & echo $!
于 2014-03-28T08:39:32.053 回答
0
$arg1 = escapeshellarg("Hello World");
$pid = shell_exec("php file.php {$arg1} >/dev/null 2>&1 &");

文件.php

$argument = $argv[1];
于 2020-09-22T07:42:44.660 回答