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 相关文章推荐
smarty+adodb+部分自定义类的php开发模式
Dec 31 PHP
php Undefined index和Undefined variable的解决方法
Mar 27 PHP
Thinkphp多文件上传实现方法
Oct 31 PHP
PHP中文编码小技巧
Dec 25 PHP
php中return的用法实例分析
Feb 28 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
PHP数组操作简单案例分析
Oct 15 PHP
php readfile()修改文件上传大小设置
Aug 11 PHP
PHP html_entity_decode()函数讲解
Feb 25 PHP
JS操作XML中DTD介绍及使用方法分析
Jul 04 PHP
php 函数中静态变量使用的问题实例分析
Mar 05 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 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数组合并array_merge()函数使用注意事项
2014/06/19 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
2010/03/07 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
VUE脚手架的下载和配置步骤详解
2019/04/01 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
python读取与写入csv格式文件的示例代码
2017/12/16 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
对Python _取log的几种方式小结
2019/07/25 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
python的链表基础知识点
2020/09/13 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
智能旅行箱:Horizn Studios
2018/04/30 全球购物
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
关于学习的演讲稿
2014/05/10 职场文书
个人担保书范文
2014/05/20 职场文书
颂军魂爱军营演讲稿
2014/09/13 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
幼儿园心得体会范文
2016/01/21 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
2021/06/11 Python
一行Python命令实现批量加水印
2022/04/07 Python