PHP中Socket连接及读写数据超时问题分析


Posted in PHP onJuly 19, 2016

本文实例讲述了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程序设计有所帮助。

PHP 相关文章推荐
PHP 获取远程文件内容的函数代码
Mar 24 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
Jul 13 PHP
需要注意的几个PHP漏洞小结
Feb 05 PHP
下拉列表多级联动dropDownList示例代码
Jun 27 PHP
php中hashtable实现示例分享
Feb 13 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
Feb 12 PHP
PHP处理会话函数大总结
Aug 05 PHP
php中删除、清空session的方式总结
Oct 09 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
Mar 28 PHP
PHP操作Postgresql封装类与应用完整实例
Apr 24 PHP
Laravel 自定命令以及生成文件的例子
Oct 23 PHP
WordPress伪静态规则设置代码实例
Dec 10 PHP
在PHP语言中使用JSON和将json还原成数组的方法
Jul 19 #PHP
JSON两种结构之对象和数组的理解
Jul 19 #PHP
深入理解PHP JSON数组与对象
Jul 19 #PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
Jul 18 #PHP
完美利用Yii2微信后台开发的系列总结
Jul 18 #PHP
PHP中set_include_path()函数相关用法分析
Jul 18 #PHP
PHP中spl_autoload_register()函数用法实例详解
Jul 18 #PHP
You might like
使用php+xslt在windows平台上
2006/10/09 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
php中上传文件的的解决方案
2018/09/25 PHP
javascript this用法小结
2008/12/19 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
JavaScript 五大常见函数
2018/03/23 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
了解重排与重绘
2019/05/29 Javascript
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
JavaScript如何获取一个元素的样式信息
2019/07/29 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python实现探测socket和web服务示例
2014/03/28 Python
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
python 读写txt文件 json文件的实现方法
2016/10/22 Python
Python登录并获取CSDN博客所有文章列表代码实例
2017/12/28 Python
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
BAILEY 44官网:美国制造的女性服装
2019/07/01 全球购物
纪念9.18事变演讲稿
2014/09/14 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
结婚喜宴祝酒词
2015/08/10 职场文书
2019职场单身人才调研报告:互联网行业单身比例最高
2019/08/07 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS
解决IIS7下无法绑定https主机的问题
2022/04/29 Servers