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 发送带附件邮件示例
Jan 23 PHP
ThinkPHP中自定义错误页面和提示页面实例
Nov 22 PHP
php模拟登陆的实现方法分析
Jan 09 PHP
php简单分页类实现方法
Feb 26 PHP
php自动给网址加上链接的方法
Jun 02 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 PHP
Symfony2 session用法实例分析
Feb 04 PHP
Linux平台php命令行程序处理管道数据的方法
Nov 10 PHP
thinkphp项目如何自定义微信分享描述内容
Feb 20 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
PHP5.6读写excel表格文件操作示例
Feb 26 PHP
PHP 实现 WebSocket 协议原理与应用详解
Apr 22 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
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
python多线程扫描端口示例
2014/01/16 Python
Python功能键的读取方法
2015/05/28 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
深入解析Python中的descriptor描述器的作用及用法
2016/06/27 Python
python数据处理实战(必看篇)
2017/06/11 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
python Celery定时任务的示例
2018/03/13 Python
python 文件转成16进制数组的实例
2018/07/09 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Python API自动化框架总结
2019/11/12 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
C#如何进行LDAP用户校验
2012/11/21 面试题
普通院校学生的自荐信
2013/11/27 职场文书
迎新晚会邀请函
2014/02/01 职场文书
《跨越海峡的生命桥》教学反思
2014/02/24 职场文书
贷款承诺书范文
2014/05/19 职场文书
大学生毕业求职信
2014/06/12 职场文书
小学三好学生事迹材料
2014/08/15 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
小学元宵节活动总结
2015/02/06 职场文书
Python中的tkinter库简单案例详解
2022/01/22 Python