我想在后台运行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";我尝试了两种高管选择,但都不起作用。上面的脚本没有显示任何输出。
我尝试在linux命令行中运行相同的$cmd,它显示了sample.php脚本的输出。
我想先运行这个,但除此之外,我还想将变量发送到sample.php脚本。
非常感谢你的帮助。
您可以使用set_time_limit(0)
来允许脚本无限期运行,使用ignore_user_abort()
来保持脚本在后台运行,即使选项卡的浏览器已经关闭。这样,若您将浏览器重定向到其他地方,脚本将继续在后台运行。
这种在后台运行php脚本的方法似乎有点尴尬。根据您是否根据用户输入传递额外的参数,还可能创建攻击者可以注入额外命令的场景。
对于这样的用例,如果您不需要立即响应,您可以使用cron,或者使用像Gearman这样的作业管理器,在那里您可以使用Gearman服务器来管理we请求和后台作业之间的通信。
我对进行了一些调整
$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上测试了它,它可以在上运行