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 相关文章推荐
使用apache模块rewrite_module (转)
Feb 14 PHP
PHP 解决utf-8和gb2312编码转换问题
Mar 18 PHP
收集的二十一个实用便利的PHP函数代码
Apr 22 PHP
php文章内容分页并生成相应的htm静态页面代码
Jun 07 PHP
PHP四舍五入精确小数位及取整
Jan 14 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
Apr 24 PHP
PHP获取表单所有复选框的值的方法
Aug 28 PHP
Symfony2 session用法实例分析
Feb 04 PHP
ThinkPHP发送邮件示例代码
Oct 08 PHP
PHP中的多种加密技术及代码示例解析
Oct 20 PHP
Nginx下ThinkPHP5的配置方法详解
Aug 01 PHP
PHP使用Nginx实现反向代理
Sep 20 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桌面中心(二) 数据库写入
2007/03/11 PHP
php csv操作类代码
2009/12/14 PHP
如何判断php数组的维度
2013/06/10 PHP
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
jquery()函数的三种语法介绍
2013/10/09 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
理解javascript闭包
2015/12/15 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
Promise扫盲贴
2019/06/24 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
一篇不错的Python入门教程
2007/02/08 Python
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
python获取代码运行时间的实例代码
2018/06/11 Python
使用Python操作FTP实现上传和下载的方法
2019/04/01 Python
python中 * 的用法详解
2019/07/10 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
Python 文件数据读写的具体实现
2020/01/24 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
Python爬虫入门有哪些基础知识点
2020/06/02 Python
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
Gap英国官网:Gap UK
2018/07/18 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
九州传奇上机题
2014/07/10 面试题
大学新生军训感言
2014/02/25 职场文书
岗位明星事迹材料
2014/05/18 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
关于感恩的作文
2019/08/26 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python