關於PHP中Socket連線及讀寫資料超時的問題

2021-05-25 01:53:47 字數 1059 閱讀 1752

雖然php中對fsockopen()方法有連線socket的超時引數,但是沒有類似c中的連線成功後對資料的讀寫超時引數設定。沒關係,php中對stream提供了一系列的方法以防止超時

stream_set_blocking( $fp , false )//設定資料流為阻塞模式,以防止資料沒讀完就退出

如果模式為 false, 給定的 socket 描述符將切換到非塊模式, 如果為 true, 則切換到塊模式. 這個效果類似於 fgets() 從 socket 讀的情況. 在非塊模式 fgets() 將會立即返回,而在塊模式將等待資料滿足要求.

stream_set_timeout( $fp , 10 )//設定超時,應該在成功建立連線之後立即加上此句,後面的引數單位為秒

stream_get_meta_data( $fp )//從封裝協議檔案指標中取得報頭/元資料,返回的是乙個陣列,其中格式為

array (

[stream_type] => tcp_socket

[mode] => r+

[unread_bytes] => 0

[seekable] =>

[timed_out] =>

[blocked] => 1

[eof] =>

)其中索引timed_out為超時資訊,超時則為true,未超時則為false,我們可以籍由此來判斷socket是否超時,需要注意的是此句應該加在每次需要等待的語句之後,比如fwrite(),fread(),並且每讀一次,都要判斷一次是否超時,而對於乙個連線只需一次超時設定stream_set_timeout( $fp , 10 )就可以了

**:$fp = @fsockopen( $ip , $port, $errno , $errstr, 30 );

if( !$fp )

else

//讀取資料

$buf = fread( $fp , 16 ) ;

$status = stream_get_meta_data( $fp ) ;

//讀取資料超時

if( $status['timed_out'] )

}

PHP中Socket連線及讀寫資料超時問題分析

雖然php中對fsockopen 方法有連線socket的超時引數,但是沒有類似c中的連線成功後對資料的讀寫超時引數設定。沒關係,php中對stream提供了一系列的方法以防止超時 stream set blocking fp false 設定資料流為阻塞模式,以防止資料沒讀完就退出 如果模式為 f...

Socket 連線錯誤及原因

econnaborted 該錯誤被描述為 software caused connection abort 即 軟體引起的連線中止 原因在於當服務和客戶程序在完成用於 tcp 連線的 三次握手 後,客戶 tcp 卻傳送了乙個 rst 復位 分節,在服務程序看來,就在該連線已由 tcp 排隊,等著服務...

php中關於socket函式無法使用問題

被這個簡單的問題卡了兩個小時,不得不吐槽一下。網上的許多說明還是沒有到位。我用的是wamp整合環境,在搞定server端和client端的 後在命令列中輸入php d wamp www socket server.php執行 顯示 致命錯誤 呼叫未定義函式socket create 在第七行 為此我...