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 相关文章推荐
教你如何把一篇文章按要求分段
Oct 09 PHP
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
Mar 29 PHP
php面向对象全攻略 (七) 继承性
Sep 30 PHP
php 高效率写法 推荐
Feb 21 PHP
PHP之生成GIF动画的实现方法
Jun 07 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
Jun 27 PHP
php创建、获取cookie及基础要点分析
Jan 26 PHP
typecho插件编写教程(三):保存配置
May 28 PHP
php将html转成wml的WAP标记语言实例
Jul 08 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
Jan 07 PHP
PHP实现的构造sql语句类实例
Feb 03 PHP
PHP+JQuery+Ajax实现分页方法详解
Aug 06 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
COM in PHP (winows only)
2006/10/09 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
vue教程之toast弹框全局调用示例详解
2020/08/24 Javascript
JavaScript实现移动端页面按手机屏幕分辨率自动缩放的最强代码
2017/08/18 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
简单解析Django框架中的表单验证
2015/07/17 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
python 实现UTC时间加减的方法
2018/12/31 Python
python3实现表白神器
2019/04/09 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
python 动态绘制爱心的示例
2020/09/27 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
商得四方公司面试题(gid+)
2014/04/30 面试题
中学生打架检讨书
2014/10/13 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
赤壁观后感(2)
2015/06/15 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
JavaScript的function函数详细介绍
2021/11/20 Javascript
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android