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 相关文章推荐
WHOIS类的修改版
Oct 09 PHP
在IIS上安装PHP4.0正式版
Oct 09 PHP
php中删除字符串中最先出现某个字符的实现代码
Feb 03 PHP
php中操作memcached缓存进行增删改查数据的实现代码
Aug 15 PHP
php递归json类实例
Dec 02 PHP
php获取客户端IP及URL的方法示例
Feb 03 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 PHP
PHP安装BCMath扩展的方法
Feb 13 PHP
PHP implode()函数用法讲解
Mar 08 PHP
Laravel框架Auth用户认证操作实例分析
Sep 29 PHP
用php实现分页效果的示例代码
Dec 10 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+javascript的日历控件
2009/11/19 PHP
PHP 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
详解Vue2 无限级分类(添加,删除,修改)
2017/03/07 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
微信小程序绘制半圆(弧形)进度条
2020/11/18 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
Python设计模式之代理模式简单示例
2018/01/09 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
Python3 读、写Excel文件的操作方法
2018/10/20 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
详解Python循环作用域与闭包
2019/03/21 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
Python进程池Pool应用实例分析
2019/11/27 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
基于Python pyecharts实现多种图例代码解析
2020/08/10 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
中英文自我评价语句
2013/12/20 职场文书
诉讼授权委托书
2014/10/15 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
学习心得体会
2019/06/20 职场文书
如何利用pygame实现打飞机小游戏
2021/05/30 Python