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之第五天
Oct 09 PHP
多php服务器实现多session并发运行
Oct 09 PHP
PHP执行linux系统命令的常用函数使用说明
Apr 27 PHP
『PHP』PHP截断函数mb_substr()使用介绍
Apr 22 PHP
PHP中ob_start函数的使用说明
Nov 11 PHP
PHP入门之常量简介和系统常量
May 12 PHP
PHP自定session保存路径及删除、注销与写入的方法
Nov 18 PHP
CI框架中site_url()和base_url()的区别
Jan 07 PHP
php版微信返回用户text输入的方法
Nov 14 PHP
laravel自定义分页效果
Jul 23 PHP
PHP实现简单计算器小程序
Aug 28 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 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
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
2015/01/20 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
Laravel如何友好的修改.env配置文件详解
2017/06/07 PHP
html读出文本文件内容
2007/01/22 Javascript
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
python ChainMap 合并字典的实现步骤
2019/06/11 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
python修改文件内容的3种方法详解
2019/11/15 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
2021/01/27 Python
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
远程调用的原理
2014/07/05 面试题
擅自离岗检讨书
2014/02/11 职场文书
个人租房协议书
2014/04/09 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL