我怎样才能在后台运行php进程?

时间:2013-07-06 10:43:41

标签: php linux apache

我想在后台运行一个php脚本,因为它需要很长时间而且我不想等待它。

这个问题涉及:

php execute a background process

我试图在我的linux centos机器上完成这项工作,但不幸的是它似乎没有起作用。

这是我的代码:

$cmd = 'php '.realpath($_SERVER["DOCUMENT_ROOT"]).'/test/sample.php';

exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));
exec(sprintf("$s > $s 2>&1 & echo $1", $cmd, $outputfile),$pidArr); 

sleep(2);

print_r($outputfile);
print_r($pidfile);

我包含sleep(2)以确保sample.php脚本完成。 sample.php只包含echo'Hello world';我尝试了两个exec选项,但没有一个工作。上面的脚本没有显示任何输出。

我尝试在linux命令行中运行相同的$ cmd,它向我展示了sample.php脚本的输出。

我想首先运行此操作,但此外我还想将变量发送到sample.php脚本。

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您可以使用set_time_limit(0)允许脚本无限期运行,ignore_user_abort()可以在后台运行脚本,即使选项卡的浏览器已关闭也是如此。这样,如果您将浏览器重定向到其他位置,脚本将继续在后台运行。

答案 1 :(得分:1)

这种在后台运行php脚本的方法似乎有点尴尬。根据您是否根据用户输入传递其他参数,还可以创建一个攻击者可以注入其他命令的场景。

对于这样的用例,您可以使用cron,如果您不需要立即响应,或者使用像Gearman这样的作业管理器,您可以使用Gearman服务器来管理我们之间的通信请求和后台工作。

答案 2 :(得分:0)

我做了一些调整

$cmd = 'php '.realpath($_SERVER["DOCUMENT_ROOT"]).'/test/sample.php';
$outputfile = 'ouput.txt';
$pidfile = 'pid.txt';
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));
exec(sprintf("$s > $s 2>&1 & echo $1", $cmd, $outputfile),$pidArr); 

sleep(2);

print_r(file_get_contents($outputfile));
print_r(file_get_contents($pidfile));

不确定您之前是否定义了变量。我在Windows上测试它并且它可以工作