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桌面中心(二) 数据库写入
Mar 11 PHP
用php解析html的实现代码
Aug 08 PHP
基于PHP开发中的安全防范知识详解
Jun 06 PHP
浅析PHP中的UNICODE 编码与解码
Jun 29 PHP
个人写的PHP验证码生成类分享
Aug 21 PHP
Laravel框架数据库CURD操作、连贯操作总结
Sep 03 PHP
PHP实现CSV文件的导入和导出类
Mar 24 PHP
PHP使用NuSOAP调用Web服务的方法
Jul 18 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
Jul 03 PHP
PHP之多条件混合筛选功能的实现方法
Oct 09 PHP
is_file和file_exists效率比较
Mar 14 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笔记之:php函数range() round()和list()的使用说明
2013/04/26 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
基于JQUERY的多级联动代码
2012/01/24 Javascript
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
Python记录详细调用堆栈日志的方法
2015/05/05 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
python中reload重载实例用法
2020/12/15 Python
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
技术总监岗位职责
2013/12/05 职场文书
村干部培训方案
2014/05/02 职场文书
安全生产标语
2014/06/06 职场文书
医院党员公开承诺书
2014/08/30 职场文书
关于职业道德的心得体会
2016/01/18 职场文书