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 06 PHP
destoon之一键登录设置
Jun 21 PHP
php中动态修改ini配置
Oct 14 PHP
PHP使用数组依次替换字符串中匹配项
Jan 08 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
Mar 01 PHP
使用php完成常见的文件上传功能(推荐)
Jan 13 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
CI框架附属类用法分析
Dec 26 PHP
PHP-FPM 的管理和配置详解
Feb 17 PHP
浅谈laravel aliases别名的原理
Oct 24 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
2006/12/16 PHP
php获取后台Job管理的实现代码
2011/06/10 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
JS调用Android、Ios原生控件
2017/01/06 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
使用python实现生成用户信息
2017/03/20 Python
python版本的仿windows计划任务工具
2018/04/30 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
vue.js刷新当前页面的实例讲解
2020/12/29 Python
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
澳大利亚运动鞋商店:Platypus Shoes
2019/09/27 全球购物
手机业务员岗位职责
2013/12/13 职场文书
校园报刊亭的创业计划书
2014/01/02 职场文书
党员承诺书怎么写
2014/05/20 职场文书
安全目标责任书
2014/07/22 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
道歉信范文
2015/05/12 职场文书
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS