##1.php中定時計劃任務的實現原理php
###1.鏈接處理:瀏覽器
在 PHP 內部,系統維護着鏈接狀態,其狀態有三種可能的狀況:函數
0 - NORMAL(正常) normalcode
1 - ABORTED(異常退出) abortedorm
2 - TIMEOUT(超時) timeoutip
aborted 報錯 英 [ə'bɔːtɪd] 美 全球發音 跟讀 口語練習 adj. 流產的;夭折的
- 當 PHP 腳本正常地運行 NORMAL 狀態時,鏈接爲有效。
2.當遠程客戶端中斷鏈接時,ABORTED 狀態的標記將會被打開。遠程客戶端鏈接的中斷一般是由用戶點擊 STOP 按鈕致使的。it
3.當鏈接時間超過 PHP 的時限時,TIMEOUT 狀態的標記將被打開。io
默認的狀況是當遠程客戶端鏈接中斷時腳本將會退出,但咱們能夠決定腳本是否須要在客戶端中斷鏈接時退出。function
有時候讓腳本完整地運行會帶來不少方便,即便沒有遠程瀏覽器接受腳本的輸出。原理
###2.忽略腳本中斷
該處理過程可由 php.ini
的 ignore_user_abort
或由 Apache .conf
設置中對應的"php_value ignore_user_abort
以及ignore_user_abort()
函數來控制。
腳本觸發函數:
若是沒有告訴 PHP 忽略用戶的中斷,腳本將會被中斷,除非經過 register_shutdown_function() 設置了關閉觸發函數。
經過該關閉觸發函數,當遠程用戶點擊 STOP 按鈕後,腳本再次嘗試輸出數據時,PHP 將會檢測到鏈接已被中斷,並調用關閉觸發函數。
腳本也有可能被內置的腳本計時器中斷。默認的超時限制爲 30 秒。
這個值能夠經過設置 php.ini 的 max_execution_time 或 Apache .conf 設置中對應的"php_value max_execution_time"參數或者 set_time_limit() 函數來更改。
當計數器超時的時候,腳本將會相似於以上鍊接中斷的狀況退出,先前被註冊過的關閉觸發函數也將在這時被執行。
在該關閉觸發函數中,能夠經過調用 connection_status() 函數來檢查超時是否致使關閉觸發函數被調用。若是超時致使了關閉觸發函數的調用,該函數將返回 2。
須要注意的一點是 ABORTED 和 TIMEOUT 狀態能夠同時有效。這在告訴 PHP 忽略用戶的退出操做時是可能的。PHP 將仍然注意用戶已經中斷了鏈接但腳本仍然在運行的狀況。若是到了運行的時間限制,腳本將被退出,設置過的關閉觸發函數也將被執行。 在這時會發現函數 connection_status() 返回 3。
###3. 相關函數: 忽略用戶中斷
int ignore_user_abort ( [bool setting] ) This function sets whether a client disconnect should cause a script to be aborted. It will return the previous setting and can be called without an argument to not change the current setting and only return the current setting.
鏈接中斷
int connection_aborted ( void ) Returns TRUE if client disconnected.
鏈接狀態
int connection_status ( void ) Returns the connection status bitfield.