2012-10-04 197 views
2

我想知道 - 因爲我寫了一段代碼,可以更新多達10,000行,並可能需要幾秒鐘才能完成,如果通過ajax請求訪問文件時,發送查詢發送到PHP文件,然後關閉瀏覽器,文件得到完全執行?假設完成請求大約需要25秒,用戶可能不會等待25秒,足以「ping」這個文件並讓用戶在mysql查詢發生時瀏覽或關閉其瀏覽器窗口?瀏覽器關閉時服務器是否「關閉」? PHP - MYSQL

+1

只是一個猜測,但我會說,一旦命令發送,瀏覽器的工作就完成了。熟悉打印工作可能:您可以關閉圖片,打印圖片 – Sprottenwels

回答

-1

一旦關閉瀏覽器,它就會在獲得答覆之前斷開與服務器的連接。我不知道在這種情況下服務器有多不同,但我認爲大多數服務器會中止正在處理的線程來回復請求。

此外,事情可能會因不同的操作而不同 - 即文件I/O或數據庫操作。如果它是一個原子數據庫操作,我的假設是,它會完成任何操作。

+1

但OP沒有要求假設(並且您知道他們[對他們說](http://www.youtube.com/看?v = wg4trPZFUwc))。請參考手冊,不要猜測。 – CodeCaster

2

該請求具有3份

  1. 連接到網絡服務器,它是由查詢在DB服務器運行的服務器
  2. 執行
  3. PHP腳本瀏覽器

當你關閉瀏覽器,關閉與服務器的連接。服務器可能會或可能不會終止已啓動的PHP腳本(如果PHP作爲apache模塊運行,它將被終止,除非調用ignore_user_abort)。此外,Web服務器可能會有請求的時間限制,並殺死腳本或僅向客戶端發送連接超時消息,而不會終止腳本,但不會讓其有機會向瀏覽器發送任何內容。

這是一個棘手的部分 - 更新在數據庫中運行,它不會被Web服務器殺死,也不會被PHP殺死。

所以你想要實現的是ping一個PHP腳本,即執行查詢,但客戶端不會等待結果。您可能希望或不希望查詢本身是異步的(PHP腳本不要等待查詢),但是您必須告訴客戶端請求已完成,例如通過發送內容長度爲0,並刷新輸出(實際上是http頭文件),並使用ignore_user_abort運行PHP,以便繼續執行。

2

使用ignore-user-abort繼續運行該客戶端已斷開,即使腳本

ignore_user_abort(true); 
set_time_limit(0); 

您可以使用connection_status跟蹤如果連接已經斷開

if (connection_status()!=0) { //connection disconnected 
0

通常不會,但您的腳本通過ABORTED狀態。

更多細節在手冊中有關連接處理http://www.php.net/manual/en/features.connection-handling.php

在PHP內部,連接狀態得以維持。有3種 可能的狀態:

0 - 師範大學

1 - 中止

2 - TIMEOUT

當PHP腳本運行正常正常狀態時,是有效的。如果 遠程客戶端斷開連接,ABORTED狀態標誌打開。 A 遠程客戶端斷開連接通常是由用戶點擊其「停止」按鈕導致的。