2014-09-12 141 views
0

我正在加快生成html的一些php代碼的響應時間。代碼的一個問題是,當確定一條信息不需要顯示時,它會進行sql調用以從數據庫中刪除該項目。這對用戶是不可見的,直到下次頁面加載時纔會對服務器可見,這樣一旦系統知道應該運行SQL查詢就不需要運行。運行後清理代碼()

我想要做的是返回給用戶的響應,生成的HTML,然後進行SQL查詢。我正在嘗試這flushob_flush,但頁面響應仍然沒有加載,直到我打電話死亡。

有沒有辦法在PHP中調用die()之後運行代碼,以便用戶獲取他們的數據,然後我可以運行我的數據庫清理代碼,並且客戶端不會等待我關閉連接?

+1

http://php.net/register_shutdown_function – 2014-09-12 16:12:21

+1

你應該完全忘記這一點,而是調查爲什麼當'不需要顯示信息'時必須刪除數據庫的行' – Sebas 2014-09-12 16:24:18

+0

@Sebas因爲這個工具拉來自7種不同的(只讀類型)數據庫,並將所有信息編譯到一個頁面上。它有它自己的那些不影響原始數據數據庫的數據的排序條目。因此,如果數據從其中一個數據庫中刪除,直到下一次加載我的頁面纔會發現它。所以,當我的頁面加載時,我需要刪除我不再存在的數據的訂單條目。不,我不能編輯改變數據庫的代碼來改變我的代碼。 – TheBat 2014-09-12 17:13:56

回答

0

感謝@robbrit和@Luis Siquot。我一直在尋找register_shutdown_function因爲Luis的評論,我正在讀該網頁上的評論,和我遇到"When using php-fpm, fastcgi_finish_request() should be used instead of register_shutdown_function() and exit()"

這導致我fastcgi_finish_request它說出來:

"This function flushes all response data to the client and finishes the request. This allows for time consuming tasks to be performed without leaving the connection to the client open."

所以看起來像fastcgi_finish_request()就是我要找的,不是register_shutdown_function()

編輯:看來,fastcgi_finish_request()需要另一個庫,所以改用:

ob_end_clean(); 
header("Connection: close"); 
ignore_user_abort(true); // just to be safe 
ob_start(); 
echo "The client will see this!"; 
$size = ob_get_length(); 
header("Content-Length: $size"); 

//Both of these flush methods must be called, otherwise strange things happen. 
ob_end_flush(); 
flush(); 

echo "The client will never see this"; 
3

可以使用register_shutdown_function註冊關機功能:

register_shutdown_function(function() { 
    // cleanup stuff 
}); 

或者在舊版本的PHP:

function myFunc() { 
    // cleanup stuff 
} 

register_shutdown_function("myFunc"); 
+1

:「關閉回調函數作爲請求的一部分執行,因此可以從它們發送輸出並訪問輸出緩衝區。」關閉功能作爲請求的一部分計算,並且在這種情況下將涉及相同的時間 – 2014-09-12 16:21:08

+0

Luis是對的,儘管該函數在死後被調用,緩衝區並未完全刷新,並且連接保持打開狀態,直到關閉回調完成執行。 – TheBat 2014-09-12 19:22:33