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 Image Resize图片大小调整的函数代码
Jan 17 PHP
php foreach循环中使用引用的问题
Nov 06 PHP
php inc文件使用的风险和注意事项
Nov 12 PHP
php实现图片添加水印功能
Feb 13 PHP
php获得url参数中具有&的值的方法
Mar 05 PHP
php判断电脑访问、手机访问的例子
May 10 PHP
Symfony2安装的方法(2种方法)
Feb 04 PHP
CodeIgniter连贯操作的底层原理分析
May 17 PHP
yii通过小物件生成view的方法
Oct 08 PHP
php实现单笔转账到支付宝功能
Oct 09 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 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脚本的10个技巧(1)
2006/10/09 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
详解YII关联查询
2016/01/10 PHP
php好代码风格的阶段性总结
2016/06/25 PHP
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
jquery zTree异步加载简单实例分享
2013/02/05 Javascript
使用js写的一个简易的投票
2013/11/27 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
基于vue的短信验证码倒计时demo
2017/09/13 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
2019/12/09 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
Windows下安装python2和python3多版本教程
2017/03/30 Python
神经网络(BP)算法Python实现及应用
2018/04/16 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
python 实现音频叠加的示例
2020/10/29 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
广告学毕业生求职信
2014/01/30 职场文书
楼面经理岗位职责范本
2014/02/18 职场文书
幼儿园教师获奖感言
2014/03/11 职场文书
临床护理求职信
2014/04/26 职场文书
计划生育诚信协议书
2014/11/02 职场文书
骨干教师考核评语
2014/12/31 职场文书
涨价通知
2015/04/23 职场文书
2015年话务员工作总结
2015/04/29 职场文书
清明节随笔
2015/08/15 职场文书
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server
数据库之SQL技巧整理案例
2021/07/07 SQL Server