2009-11-01 50 views
14

例如,有一個非常簡單的PHP腳本,用於更新數據庫中的某些表,但這個過程需要很長時間(可能需要10分鐘)。因此,即使用戶關閉了瀏覽器,我也希望此腳本繼續處理,因爲有時用戶不會等待,他們會關閉瀏覽器或轉到其他網頁。即使用戶關閉瀏覽器,PHP腳本能否繼續運行?

+0

因此,如果我想解除執行作業的瀏覽器請求,我如何請求另一個php腳本,同時用戶的當前請求繼續正常。 因此,當用戶請求任何網址時,此請求將啓動另一個腳本(獨立於用戶瀏覽器和其他請求工作)。用戶將繼續在網站上正常衝浪 – 2009-11-01 22:09:04

+0

好問題兄弟! +1 – 2011-08-31 06:01:27

回答

7

直接回答你的問題,請參見ignore_user_abort

更廣泛地說,你可能有一個架構問題就在這裏。

如果許多用戶可以啓動這些東西,那麼您會希望Web應用程序將作業添加到某種類型的隊列中,並擁有一定數量的後臺進程來咀嚼所有工作。

-1

無論客戶端在做什麼,服務器端腳本都會繼續執行。

編輯:順便說一句,你確定你想要打開10分鐘的網頁嗎?我建議你使用一個任務隊列(其項目由cron及時執行)並將用戶重定向到「好的,我在上面」頁面。

+0

...不完全正確:通常,有警衛「殺死」長時間運行的PHP腳本:這些腳本採取crontab條目的形式。 – jldupont 2009-11-01 21:50:36

+1

並非總是如此:http://php.net/manual/en/function.ignore-user-abort.php – timdev 2009-11-01 21:51:12

+0

@jldupont:我不是php的傢伙,但是這些腳本與客戶端有什麼關係? – shanyu 2009-11-01 21:53:26

3

如果腳本完全基於服務器(沒有反饋給用戶),即使客戶端關閉,也會執行此操作。

PHP的通用體系結構是客戶端向腳本發送請求,以向用戶提供答覆。如果沒有返回給用戶,即使用戶不在另一邊,腳本仍然會執行。更簡單一點:在常規腳本中,它們在服務器和客戶端之間沒有固定的連接。

+1

注意總是對的:http://php.net/manual/en/function.ignore-user-abort.php – timdev 2009-11-01 21:50:13

1

您可以使用包含時間和運行命令的crontab文件每20分鐘運行一次PHP腳本,在這種情況下,它將是php腳本。

+0

這是除了在這裏問的問題... – jldupont 2009-11-01 21:49:37

0

是的。服務器不知道用戶是否關閉了瀏覽器。至少它沒有立即注意到。

否:服務器可能(取決於它的配置方式)不允許php腳本運行10分鐘。在廉價的共享主機上,我不會依賴運行時間超過合理響應時間的腳本。

15

如果任務需要10分鐘,請不要使用瀏覽器直接執行它。您有許多其他選項:

  • 使用cronjob定期執行任務 。
  • 讓瀏覽器 請求插入新行到 數據庫表,以便定期 的cronjob可以處理新行和 與 適當的參數
  • 有 瀏覽器請求寫的消息執行PHP腳本到 隊列系統,其具有用戶 監聽這樣的事件(然後 執行腳本)。

雖然其中一些建議可能是矯枉過正您的具體情況,關鍵,結合特點是取消夫婦從作業的執行瀏覽器請求,以便它可以異步完成。

如果您需要瀏覽器窗口隨進度一起更新,則需要使用定期執行的AJAX請求來檢索作業狀態。

+1

+1爲我的答案更好,更具體的版本。 – timdev 2009-11-01 21:58:39

+0

所以如果我想解除執行作業的瀏覽器請求,我怎麼能請求另一個php腳本,而用戶的當前請求繼續正常。所以,當用戶請求任何url時,這個請求將啓動另一個腳本(它獨立於用戶瀏覽器和其他請求)。用戶將繼續在網站上正常衝浪 我該怎麼做? – 2009-11-01 22:09:56

+0

查看這些要點?這些都是做到這一點的方法。在大多數情況下,設置一個保存後臺進程輸入的小數據庫表格可以正常工作。然後,您可以啓動一些PHP腳本來執行作業,通過cron或其他方法。 – timdev 2009-11-01 22:19:11

4

PHP腳本將在客戶端終止連接後繼續運行(不這樣做會帶來安全風險),但最多隻能到max_execution_time(在php.ini中設置或通過PHP腳本設置,默認通常爲30秒) ..

例如:

<?php 
    $fh = fopen("bluh.txt", 'w'); 
    for($i=0; $i<20; $i++) { 
     echo $i."<br/>"; 
     fwrite($fh,$i."\n"); 
     sleep(1); 
    } 
    fclose($fh); 
?> 

開始運行在瀏覽器中並關閉瀏覽器完成之前。您會發現20秒後該文件包含$i的所有值。

將for循環的上限更改爲100而不是20,並且您會發現它僅從0運行到29個。由於PHP的max_execution_time腳本超時並死亡。

相關問題