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 相关文章推荐
jq的get传参数在utf-8中乱码问题的解决php版
Jul 23 PHP
PHP中防止SQL注入实现代码
Feb 19 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
Jun 27 PHP
2014年最新推荐的10款 PHP 开发框架
Aug 01 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
curl和libcurl的区别简介
Jul 01 PHP
PHP实现的一致性哈希算法完整实例
Nov 14 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
Jan 03 PHP
PHP 微信扫码支付源代码(推荐)
Nov 03 PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 PHP
java解析json方法总结
May 16 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 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
php开启安全模式后禁用的函数集合
2011/06/26 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
php内核解析:PHP中的哈希表
2014/01/30 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
iframe 异步加载技术及性能分析
2011/07/19 Javascript
jQuery ui插件的使用方法代码实例
2013/05/08 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
2015/09/19 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python处理csv数据的方法
2015/03/11 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
django 发送手机验证码的示例代码
2018/04/25 Python
python读取Excel实例详解
2018/08/17 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
pytorch下的unsqueeze和squeeze的用法说明
2021/02/06 Python
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
思想品德自我鉴定
2013/10/12 职场文书
大学生军训广播稿
2014/01/24 职场文书
求职意向书
2014/04/01 职场文书
5.12护士节演讲稿
2014/04/30 职场文书
求职信怎么写范文
2014/05/26 职场文书
趣味运动会开幕词
2015/01/28 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书