让PHP执行PHP

让PHP执行PHP,php,exec,command-line-interface,Php,Exec,Command Line Interface,我试图通过让PHP执行PHP,同时将输出管道化到/dev/null,并在后台运行cmd来分叉一个进程 在我安静地运行之前-我想检查cmd是否按预期运行-但是当PHP执行命令时,主进程和forked进程都不会终止,浏览器永远无法连接 代码如下: $script = '/home/username/application/bg_job.php'; $args = 'foo bar'; $cmd = "php -f $script $args"; $return = exec($cmd, $arr_

我试图通过让PHP执行PHP,同时将输出管道化到/dev/null,并在后台运行cmd来分叉一个进程

在我安静地运行之前-我想检查cmd是否按预期运行-但是当PHP执行命令时,主进程和forked进程都不会终止,浏览器永远无法连接

代码如下:

$script = '/home/username/application/bg_job.php';
$args = 'foo bar';

$cmd = "php -f $script $args";
$return = exec($cmd, $arr_output, $code);

var_dump($return);
我通过执行以下操作检查了运行脚本的Apache用户

whoami
这是用户名-所以我以root用户身份登录并运行

sudo -u username php -f /home/username/application/bg_job.php foo bar
它是有效的

你知道我做错了什么吗

编辑-仅供参考-以下是bg_job.php的内容

<?php
    file_put_contents('/home/username/test.txt', 'Hello !');
?>

我认为你是在试图挑起一项背景任务。在Linux上,这可以通过以下方式完成:

还有更多的细节

因此,您的命令将变成:

$cmd = "php -f $script $args &";

我发现,如果你想让后台进程运行,你必须使用proc_open

我还没有完全理解为什么会这样,但是每当你关闭一个proc资源时,程序并不会停止执行

如果操作正确,也不会导致任何东西挂起

这就是我的意思

$sCommand = "php -f /home/username/application/bg_job.php > /dev/null 2>&1 &";

$aPipes = array();

$rProcedure = proc_open($sCommand, array(), $aPipes);
proc_close($rProcedure);

你会看到它会在后台运行,当Apache完成它所做的工作时,它不会死掉。

您想从浏览器中按您的描述运行此脚本,还是从cli中按您的标记运行此脚本cli代码只是为了显示脚本没有运行语法或权限错误-调用子进程的浏览器很可能是您遇到权限错误。由于您实际上是通过web浏览器调用命令的,即RUN_USER=www data和RUN_GROUP=www data,因此您的后台脚本必须设置必要的位,以便您的web进程可以执行bg_job.php。另外,您希望bg_job.php编写的输出文件也必须设置了正确的权限位。已尝试-无更改-是的,我将使这成为一项后台任务-但只有在它工作时。即使是&-my child脚本也从未运行过:哦,我不是从你的问题中得到的。我以为你说它正在运行,并且会保持Apache进程打开,等待exec回来。请参阅:但是,当PHP执行该命令时,主进程和forked进程都不会终止,浏览器也永远无法连接。。。。这不仅仅意味着它正在工作,但它不工作——bg_job.php所做的只是写入一个文本文件——但该文本文件从未被创建。
$sCommand = "php -f /home/username/application/bg_job.php > /dev/null 2>&1 &";

$aPipes = array();

$rProcedure = proc_open($sCommand, array(), $aPipes);
proc_close($rProcedure);