0

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

这个问题涉及:

php执行一个后台进程

我试图在我的 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 脚本。

非常感谢您的帮助。

4

3 回答 3

2

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

于 2013-07-06T14:37:32.933 回答
1

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

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

于 2013-07-06T15:27:08.150 回答
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 上对其进行了测试,并且可以正常工作

于 2013-07-06T14:48:27.110 回答