在 PHP 內部,系統維護著(zhù)連接狀態(tài),其狀態(tài)有三種可能的情況:
當 PHP 腳本正常地運行 NORMAL 狀態(tài)時(shí),連接為有效。當遠程客戶(hù)端中斷連接時(shí),ABORTED 狀態(tài)的標記將會(huì )被打開(kāi)。遠程客戶(hù)端連接的中斷通常是由用戶(hù)點(diǎn)擊 STOP 按鈕導致的。當連接時(shí)間超過(guò) PHP 的時(shí)限(請參閱 set_time_limit() 函數)時(shí),TIMEOUT 狀態(tài)的標記將被打開(kāi)。
可以決定腳本是否需要在客戶(hù)端中斷連接時(shí)退出。有時(shí)候讓腳本完整地運行會(huì )帶來(lái)很多方便,即使沒(méi)有遠程瀏覽器接受腳本的輸出。默認的情況是當遠程客戶(hù)端連接中斷時(shí)腳本將會(huì )退出。該處理過(guò)程可由 php.ini 的 ignore_user_abort 或由 httpd.conf 設置中對應的“php_value ignore_user_abort”以及 ignore_user_abort() 函數來(lái)控制。如果沒(méi)有告訴 PHP 忽略用戶(hù)的中斷,腳本將會(huì )被中斷,除非通過(guò) register_shutdown_function() 設置了關(guān)閉觸發(fā)函數。通過(guò)該關(guān)閉觸發(fā)函數,當遠程用戶(hù)點(diǎn)擊 STOP 按鈕后,腳本再次嘗試輸出數據時(shí),PHP 將會(huì )檢測到連接已被中斷,并調用關(guān)閉觸發(fā)函數。
腳本也有可能被內置的腳本計時(shí)器中斷。默認的超時(shí)限制為 30
秒。這個(gè)值可以通過(guò)設置 php.ini 的
max_execution_time 或 httpd.conf
設置中對應的“php_value max_execution_time
”參數或者
set_time_limit()
函數來(lái)更改。當計數器超時(shí)的時(shí)候,腳本將會(huì )類(lèi)似于以上連接中斷的情況退出,先前被注冊過(guò)的關(guān)閉觸發(fā)函數也將在這時(shí)被執行。在該關(guān)閉觸發(fā)函數中,可以通過(guò)調用
connection_status()
函數來(lái)檢查超時(shí)是否導致關(guān)閉觸發(fā)函數被調用。如果超時(shí)導致了關(guān)閉觸發(fā)函數的調用,該函數將返回 2。
需要注意的一點(diǎn)是 ABORTED 和 TIMEOUT 狀態(tài)可以同時(shí)有效。這在告訴 PHP 忽略用戶(hù)的退出操作時(shí)是可能的。PHP 將仍然注意用戶(hù)已經(jīng)中斷了連接但腳本仍然在運行的情況。如果到了運行的時(shí)間限制,腳本將被退出,設置過(guò)的關(guān)閉觸發(fā)函數也將被執行。在這時(shí)會(huì )發(fā)現函數 connection_status() 返回 3。