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+SqlServer实现分页显示
Oct 09 PHP
PHP+DBM的同学录程序(1)
Oct 09 PHP
php include的妙用,实现路径加密
Jul 29 PHP
php数组函数序列之array_sum() - 计算数组元素值之和
Oct 29 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
Jul 04 PHP
PHP实现的折半查询算法示例
Oct 09 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
Nov 20 PHP
Ajax请求PHP后台接口返回信息的实例代码
Aug 21 PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 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安全配置
2006/12/06 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
php用正则表达式匹配中文实例详解
2013/11/06 PHP
PHP之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
ajax 文件上传应用简单实现
2009/03/03 Javascript
JQuery开发的数独游戏代码
2010/10/29 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
js转html实体的方法
2016/09/27 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
[01:33]真香警告!DOTA2勇士令状不朽珍藏Ⅱ饰品欣赏
2018/06/26 DOTA
手把手教你python实现SVM算法
2017/12/27 Python
深入浅析python 中的匿名函数
2018/05/21 Python
浅谈Python大神都是这样处理XML文件的
2019/05/31 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
python怎么对数字进行过滤
2020/07/05 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
建筑专业自荐信范文
2014/01/05 职场文书
致跳远运动员加油稿
2014/02/11 职场文书
人事专员的岗位职责
2014/03/01 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
我爱我校演讲稿
2014/05/21 职场文书
忠诚奉献演讲稿
2014/09/12 职场文书
指导教师推荐意见
2015/06/05 职场文书
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python