首頁  >  文章  >  後端開發  >  PHP中Socket連線及讀寫資料超時問題分析

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

不言
不言原創
2018-06-02 11:31:561602瀏覽

這篇文章主要介紹了PHP中Socket連接及讀寫資料超時問題,分析了Socket連接的相關設定與使用技巧,需要的朋友可以參考下

本文實例講述了PHP中Socket連線及讀寫資料逾時問題。分享給大家供大家參考,具體如下:

雖然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 )
{
  return false;
}
else
{
  stream_set_timeout( $fp , 3 ) ;
  //发送数据
  fwrite( $fp , $packet ) ;
  $status = stream_get_meta_data( $fp ) ;
  //发送数据超时
  if( $status['timed_out'] )
  {
    echo "Write time out" ;
    fclose( $fp );
    return false;
  }
  //读取数据
  $buf = fread( $fp , 16 ) ;
  $status = stream_get_meta_data( $fp ) ;
  //读取数据超时
  if( $status['timed_out'] )
  {
    echo "Read time out" ;
    fclose( $fp );
    return false;
  }
}

#相關推薦:

##PHP SCOKET傳送大文件,接收端JAVA_PHP教學

#

以上是PHP中Socket連線及讀寫資料超時問題分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn