我有一個運行相當多的數據庫查詢的PHP網站。通過某些參數組合,這些查詢最終可能會運行很長時間,從而觸發一個醜陋的超時消息。我想根據我的站點樣式的其餘部分用主題很好的超時消息替換它。如何讓PHP腳本在等待長時間運行的MySQL查詢時正常超時?
預見通常回答這樣一個問題:
「優化你的查詢,使他們不這麼長時間運行」 - 我記錄長時間運行的查詢和優化他們,但只有我在用戶受到影響後瞭解這些信息。
「增加您的PHP超時設置(例如,set_time_limit,max_execution_time),以便長時間運行的查詢可以完成」 - 有時查詢可以運行幾分鐘。我想告訴用戶在這之前有問題(例如30秒後)。
「使用register_tick_function監視腳本運行了多長時間」 - 這僅在腳本中的代碼行之間執行。當腳本正在等待數據庫的響應時,tick函數不會被調用。
萬一有幫助,該網站是使用Drupal的(有很多定製的)所建,是一個虛擬專用Linux服務器上使用MySQL 5上運行PHP 5.2
這隻涉及到運行php代碼的地方(通常是一個web服務器)和瀏覽器之間的連接 - 而不是web服務器和DBMS – symcbean 2010-05-14 12:00:41
他沒有要求與DBMS通信的東西,只是一種處理腳本超時的機制優雅地說,這就是connection_status()的設計目的。我編輯了我的答案以提供更多信息。 – Mathew 2010-05-14 16:16:19
這聽起來像我需要的解決方案,但我正在努力與重定向。我正在嘗試使用PHP header()函數,但它表示標題已經發送。即使有一個簡單的測試用例: 'set_time_limit(1); register_shutdown_function( 'clean_shutdown');' 而(真){ } 功能clean_shutdown(){ 如果(CONNECTION_STATUS()&CONNECTION_TIMEOUT){ ob_end_clean(); header('Location:http://www.bbc.co.uk',TRUE,500); } } 我仍然收到一個「頭文件已經發送(在第5行)」的消息,但是我看不到它們會被髮送到哪裏。 – 2010-05-17 09:43:33