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的历史和优缺点
Oct 09 PHP
PHP中实现图片的锐化
Oct 09 PHP
在线短消息收发的程序,不用数据库
Oct 09 PHP
php中截取字符串支持utf-8
Jan 18 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
Aug 15 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
Oct 10 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
Dec 27 PHP
PHP单例模式简单用法示例
Jun 23 PHP
PHP实现git部署的方法教程
Dec 19 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
Apr 02 PHP
Laravel创建数据库表结构的例子
Oct 09 PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 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
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
php 指定范围内多个随机数代码实例
2016/07/18 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
简略的前端架构心得&&基于editor为例子的编码小技巧
2010/11/25 Javascript
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
Vue.js实现列表清单的操作方法
2017/11/15 Javascript
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
Vue中keep-alive 实现后退不刷新并保持滚动位置
2020/03/17 Javascript
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
python模拟enum枚举类型的方法小结
2015/04/30 Python
python交互界面的退出方法
2019/02/16 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
python为什么会环境变量设置不成功
2020/06/23 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
python 实现有道翻译功能
2021/02/26 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
三分钟英语演讲稿
2014/04/24 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
贷款担保书范本
2015/09/22 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书