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 中英文混合排版中处理字符串常用的函数
Apr 12 PHP
php下清空字符串中的HTML标签的代码
Sep 06 PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
php实现压缩多个CSS与JS文件的方法
Nov 11 PHP
php将字符串转换成16进制的方法
Mar 17 PHP
php实现的递归提成方案实例
Nov 14 PHP
Yii使用技巧大汇总
Dec 29 PHP
php基于PDO实现功能强大的MYSQL封装类实例
Feb 27 PHP
PHP获取文本框、密码域、按钮的值实例代码
Apr 19 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
Jun 27 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
thinkPHP框架中执行原生SQL语句的方法
Oct 25 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
玛琪朵 Macchiato
2021/03/03 咖啡文化
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
javascript Object与Function使用
2010/01/11 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
2015/12/08 Javascript
jquery取消事件冒泡的三种方法(推荐)
2016/05/28 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
JS不完全国际化&本地化手册 之 理论篇
2016/09/27 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
使用python实现链表操作
2018/01/26 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
python实现猜数字游戏
2020/03/25 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
关于打架的检讨书
2014/01/17 职场文书
翻译学院毕业生自荐书
2014/02/02 职场文书
品质主管岗位职责
2014/03/16 职场文书
自我推荐信格式模板
2015/03/24 职场文书
医者仁心观后感
2015/06/17 职场文书
医院病假条范文
2015/08/17 职场文书
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers