所以我找到了一些运行php脚本作为后台进程的教程/指南,但无论我使用哪种代码,该过程仍然会在浏览器中显示。
我正在做的是触发一个可能需要5-10秒才能运行的脚本(依赖于第三方API)。我将触发器放在页面的最底部,以便页面看起来完全呈现,但我注意到浏览器状态栏仍然显示页面为加载,直到脚本运行。另外,Firebug显示一个(随机?)图像加载,直到php脚本完全运行完毕。我可以在top
中查看脚本,它作为一个单独的进程运行。我怎样才能让浏览器停止等待它完成呢?
我目前使用的代码是:
shell_exec('sleep 30 >/dev/null 2>/dev/null &');
我也尝试过使用exec(),但没有任何区别。
免责声明:我的最终代码将使用/usr/bin/GET
,睡眠只是显而易见的事情。
答案 0 :(得分:3)
这是一个非常小的解决方案,基于http://php.net/features.connection-handling#71172:
<?php
ob_end_clean();
ob_start();
?>
<!doctype html>
<html>
<head>
<title>sleep test</title>
</head>
<body>
<h1>sleep test</h1>
<p>going to sleep</p>
</body>
</html>
<?php
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
$start = date(DATE_RSS);
sleep(10);
file_put_contents('sleep-test.txt', $start."\n".date(DATE_RSS));
?>
答案 1 :(得分:1)
尝试在命令前添加nohup。您需要PHP断开与进程的连接并继续。通常,如果父进程结束,则子进程将被终止。 nohup会阻止这种情况,也会阻止php等待子进程完成。
shell_exec('nohup sleep 30 >/dev/null 2>&1 &');
答案 2 :(得分:0)
如果它是一个看似随意的图像,不会停止加载,你可能只是完全有另一个问题。
至少我会检查哪个过程耗时太长,并从那里开始。
答案 3 :(得分:-1)
ob_end_flush();
ignore_user_abort(1);
如果我理解你的问题,这两个功能将对你有帮助。
答案 4 :(得分:-1)
目前无法实现。