php監聽客戶端連線狀態

2022-04-05 12:58:08 字數 2205 閱讀 4681

一,在php 內部,系統維護著連線狀態,其狀態有三種可能的情況:

1,返回0- normal(正常)

2,返回1 - aborted(異常退出)

3,返回2 - timeout(超時)

當 php 指令碼正常地執行 normal 狀態時,連線為有效。當遠端客戶端中斷連線時,aborted 狀態的標記將會被開啟。遠端客戶端連線的中斷通常是由使用者點選 stop 按鈕導致的。當連線時間超過 php 的時限時,timeout 狀態的標記將被開啟。

可以決定指令碼是否需要在客戶端中斷連線時退出。有時候讓指令碼完整地執行會帶來很多方便,即使沒有遠端瀏覽器接受指令碼的輸出。預設的情況是當遠端客戶端連線中斷時指令碼將會退出。該處理過程可由php.ini的 ignore_user_abort 或由ignore_user_abort()函式來控制。如果沒有告訴 php 忽略使用者的中斷,指令碼將會被中斷,除非通過register_shutdown_function()設定了關閉觸發函式。通過該關閉觸發函式,當遠端使用者點選 stop 按鈕後,指令碼再次嘗試輸出資料時,php 將會檢測到連線已被中斷,並呼叫關閉觸發函式。

指令碼也有可能被內建的指令碼計時器中斷。預設的超時限制為 30 秒。這個值可以通過設定php.inimax_execution_time。當計數器超時的時候,指令碼將會類似於以上連線中斷的情況退出,先前被註冊過的關閉觸發函式也將在這時被執行。在該關閉觸發函式中,可以通過呼叫connection_status()函式來檢查超時是否導致關閉觸發函式被呼叫。如果超時導致了關閉觸發函式的呼叫,該函式將返回 2。

需要注意的一點是 aborted 和 timeout 狀態可以同時有效。這在告訴 php 忽略使用者的退出操作時是可能的。php 將仍然注意使用者已經中斷了連線但指令碼仍然在執行的情況。如果到了執行的時間限制,指令碼將被退出,設定過的關閉觸發函式也將被執行。在這時會發現函式connection_status()返回 3。

二,舉例說明

1,ignore_user_abort來監聽使用者連線狀態

<?php  

ignore_user_abort(false); //不忽視使用者中斷

sleep(5); //等待5秒

var_dump(connection_status()); //顯示使用者的連線狀態

echo "test";

ob_flush(); //存在輸出快取中的內容取出來,設定為等待輸出狀態

flush(); //將等待輸出快取中內容,傳給使用者

//記錄時間,以檢視是否已經執行

$aaa = fopen("test.txt","a+");

fwrite($aaa, date("y-m-d h:i:s")."\n");

fclose($aaa);

?>

2,connection_aborted來判斷使用者是否中斷

<?php  

error_reporting(e_all); //顯示報錯資訊

var_dump(connection_status()); //顯示使用者的連線狀態

sleep(10); //等待10秒

if(connection_aborted()) die; //如果使用者連線中斷,停止執行

echo "test";

ob_flush(); //存在輸出快取中的內容取出來,設定為等待輸出狀態

flush(); //將等待輸出快取中內容,傳給使用者

//記錄時間,以檢視是否已經執行

$aaa = fopen("test.txt","a+");

fwrite($aaa, date("y-m-d h:i:s")."\n");

fclose($aaa);

?>

上面二個例子,都可以測試使用者的連線狀態,當我們向這個頁面傳送請求時,在等待的時候,在瀏覽器上點選停止按鈕,或者直接將瀏覽器關閉掉後,在檢視一下test.txt中的時間變化。當然使用者中斷操作時,就停止程式,可以節約很多系統效能,我想這也是預設的原因。

阿里雲訊息佇列MQTT監聽客戶端狀態

順便在這裡附上官方文件 當前最新的 rocketmq mqtt 1.環境準備,需要購買阿里雲的mqtt以及rocketmq。2.在阿里雲賬號控制台找到rocketmq,選擇你所購買的region,建立乙個topic,並建立乙個group以備用。3.切換到mqtt,建立乙個group,例如 devic...

Redis 客戶端連線

redis 通過監聽乙個 tcp 埠或者 unix socket 的方式來接收來自客戶端的連線,當乙個連線建立後,redis 內部會進行以下一些操作 在 redis2.4 中,最大連線數是被直接硬編碼在 裡面的,而在2.6版本中這個值變成可配置的。maxclients 的預設值是 10000,你也可...

SFTP客戶端連線

最近專案使用sftp很多,在使用過程中遇到很多問題,把自己用到的和同事指導後的 整理出發,記錄一下 需要引用的jar jsch 0.1.53.jar sftpclient類 public class sftpclient public static final sftpclient connect ...