2010-11-01 19 views
2

所以我找到了很多关于运行php脚本作为后台进程的教程/指南,但无论使用哪个代码,该进程仍然在浏览器中可见。PHP后台进程仍然影响页面加载

我正在做的是触发一个可能需要5-10秒才能运行的脚本(依赖于第三方API)。我把触发器放在页面的最底部,以便页面看起来完全呈现,但我注意到浏览器状态栏仍然显示页面正在加载,直到脚本运行。此外,Firebug将一个(随机)图像显示为正在加载,直到php脚本完全运行完毕。我可以在top中查看该脚本,并将其作为单独的进程运行。我怎样才能让浏览器停止等待它完成?

我目前使用的代码是:

shell_exec('sleep 30 >/dev/null 2>/dev/null &'); 

我也使用EXEC尝试()但没有任何区别。

声明:我的最终代码将使用/usr/bin/GET,睡眠只是对发生了什么事情很明显。

回答

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)); 
?> 
+0

这似乎很适合用于后台处理同一脚本中的一些代码。我想我可以调整我的代码来处理这个问题。谢谢。 – Brandon0 2010-11-01 18:05:12

+0

真棒!感谢您的参考,非常适合bg处理 – Benn 2012-10-20 01:40:12

-1
ob_end_flush(); 

ignore_user_abort(1); 

这两个函数将帮助你,如果我正确地理解你的问题。

0

如果这是一个看似随机的图片,不停止加载,那么您可能完全不同。

至少我会检查哪个过程花费太长时间,然后从那里拿走。

+0

是的。也许后台进程使用足够的服务器资源,无法完成发送图像。 – Pickle 2010-11-01 17:02:50

+0

这很奇怪。图像即时显示,图像“加载”所需的时间(根据萤火虫)与运行shell_exec()函数所花费的时间直接相关。 – Brandon0 2010-11-01 17:59:48

1

试图在命令前加nohup的。您需要PHP从流程断开并继续。通常,如果父进程结束,子进程就会被终止。 nohup会阻止这一点,并防止PHP等待子进程完成。

shell_exec('nohup sleep 30 >/dev/null 2>&1 &');