2010-11-01 67 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 &');