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模拟HTTP认证
Oct 09 PHP
PHP 文件上传源码分析(RFC1867)
Oct 30 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
php获取url参数方法总结
Nov 13 PHP
PHP学习笔记(二):变量详解
Apr 17 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
Apr 02 PHP
PHP中file_exists使用中遇到的问题小结
Apr 05 PHP
WordPress中的shortcode短代码功能使用详解
May 17 PHP
php导出csv文件,可导出前导0实例代码
Nov 16 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
PHP守护进程化在C和PHP环境下的实现
Nov 21 PHP
PHP区块查询实现方法分析
May 12 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压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
PHP CLI模式下的多进程应用分析
2013/06/03 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
jQuery UI Autocomplete 体验分享
2012/02/14 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
Nodejs实现多人同时在线移动鼠标的小游戏分享
2014/12/06 NodeJs
JavaScript设计模式之抽象工厂模式介绍
2014/12/28 Javascript
Javascript编写2048小游戏
2015/07/07 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
2019/06/18 Javascript
vue实现日历备忘录功能
2020/09/24 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
详解如何修改 node_modules 里的文件
2020/05/22 Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
2020/09/22 Javascript
python解析xml文件操作实例
2014/10/05 Python
用实例分析Python中method的参数传递过程
2015/04/02 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
2019/08/08 Python
python默认参数调用方法解析
2020/02/09 Python
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
省级四好少年事迹材料
2014/01/25 职场文书
社会工作专业自荐信
2014/09/26 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL