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 页面执行时间计算代码
Dec 04 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 PHP
关于crontab的使用详解
Jun 24 PHP
PHP临时文件的安全性分析
Jul 04 PHP
php文件夹的创建与删除方法
Jan 24 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
php表单处理操作
Nov 16 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
Oct 14 PHP
PHP实现的敏感词过滤方法示例
Mar 06 PHP
thinkPHP事务操作简单案例分析
Oct 17 PHP
PHP number_format函数原理及实例解析
Jul 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开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
Yii实现Command任务处理的方法详解
2016/07/14 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
jQuery autocomplete插件修改
2009/04/17 Javascript
javascript 写类方式之二
2009/07/05 Javascript
jquery 表单下所有元素的隐藏
2009/07/25 Javascript
javascript 基础篇4 window对象,DOM
2012/03/14 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
常用的javascript设计模式
2017/01/11 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
Python中关于使用模块的基础知识
2015/05/24 Python
python实现学生管理系统
2018/01/11 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
python 标准差计算的实现(std)
2019/07/29 Python
如何定义TensorFlow输入节点
2020/01/23 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
银行会计财务工作个人的自我评价
2013/10/29 职场文书
大学生最新职业生涯规划书范文
2014/01/12 职场文书
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
小学教师培训感言
2014/02/11 职场文书
员工自我评价范文
2015/03/11 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
合同审查法律意见书
2015/06/04 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
SQL之各种join小结详细讲解
2021/08/04 MySQL
python中urllib包的网络请求教程
2022/04/19 Python