PHP 几种常见超时的设置方法_default_socket_timeout-程序员宅基地

技术标签: 超时设置  PHP笔记  timeout  

一、PHP文件 执行超时

(1)初始设置脚本执行时间

打开php.ini文件,找到:

max_execution_time=30

 修改为:

max_execution_time=600

如果你没有服务器修改权限,可通过内置PHP脚本的方法设置超时时间,在需要执行长时间操作的PHP文件中添加以下代码:

<?php
ini_set('max_execution_time', 600);//秒为单位,自己根据需要定义

还可以通过.htaccess 文件设置超时时间,在文件中添加以下代码:

php_value max_execution_time 600

(2)重新设置脚本执行时间,并重置计时器

set_time_limit ( int $seconds ) : bool

    seconds------最大的执行时间,单位为秒。如果设置为0(零),没有时间方面的限制。

设置允许脚本运行的时间,单位为秒。如果超过了此设置,脚本返回一个致命的错误。默认值为30秒,或者是在php.ini的max_execution_time被定义的值,如果此值存在。

当此函数被调用时,set_time_limit()会从零开始重新启动超时计数器。换句话说,如果超时默认是30秒,在脚本运行了了25秒时调用 set_time_limit(20),那么,脚本在超时之前可运行总时间为45秒。

 

二、PHP Curl 请求超时

Curl 是常用的访问HTTP协议接口的lib库,性能高,还有一些并发支持的功能等。

curl_setopt($ch, opt) 可以设置一些超时的设置,主要包括:

a 、CURLOPT_TIMEOUT 设置CURL允许执行的最长秒数。

b、CURLOPT_TIMEOUT_MS 设置CURL允许执行的最长毫秒数。

c、 CURLOPT_CONNECTTIMEOUT 在发起连接前等待的时间,如果设置为0,则无限等待。

d、 CURLOPT_CONNECTTIMEOUT_MS 尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。

e、 CURLOPT_DNS_CACHE_TIMEOUT 设置在内存中保存DNS信息的时间,默认为120秒。

 

三、PHP Socket 请求超时

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,array("sec"=> 1, "usec"=> 0 ) ); // 接收
socket_set_option($socket,SOL_SOCKET,SO_SNDTIMEO,array("sec"=> 3, "usec"=> 0 ) );  // 发送

虽然PHP中对fsockopen()方法有连接socket的超时参数,但是没有类似C中的连接成功后对数据的读写超时参数设置。没关系,PHP中对stream提供了一系列的方法以防止超时。

stream_set_blocking( $fp , false )

设置数据流为阻塞模式,以防止数据没读完就退出

如果模式为 false, 给定的 socket 描述符将切换到非块模式, 如果为 true, 则切换到块模式. 这个效果类似于 fgets() 从 socket 读的情况. 在非块模式 fgets() 将会立即返回,而在块模式将等待数据满足要求。

stream_set_timeout( $fp , 10 )

设置超时,应该在成功建立连接之后立即加上此句,后面的参数单位为秒

从封装协议文件指针中取得报头/元数据,返回的是一个数组,其中格式为:

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 Socket 相关内容可参考 https://www.jb51.net/Special/70.htm (PHP Socket 用法总结)

 

四、file_get_contents 超时处理(封装socket,file_put_contents类似)

从 PHP5 开始,file_get_content 已经支持 context 了(手册上写着:5.0.0 Added the context support. ),也就是说,从5.0开始,file_get_contents 其实也可以 POST 数据。类似的还有,fopen(也是从PHP5开始加入context支持),file (PHP5加入支持)。

<?php
$get_opts = array(   
  'http'=>array(   
    'method' => "GET",   
    'timeout' => 1,//单位秒, 默认使用php.ini中default_socket_timeout的设置
   )   
);
$post_opts = array(
'http'=>array(   
    'method' => "POST",   
    'timeout' => 60,//单位秒, 可用ini_set('default_socket_timeout', 120);进行默认设置
    'content' =>  http_build_query($param_array, '', '&')
   )   
);

$opts = $get_opts;
$res = file_get_contents($url, FALSE, stream_context_create($opts)); //返回string,失败返回FALSE

五、PHP Soap 请求超时

    ini_set('default_socket_timeout', 30); //定义响应超时为30秒
 
    try {
      $options = array(
        'cache_wsdl' => 0,
        'connection_timeout' => 5, //定义连接超时为5秒,默认php.ini中default_socket_timeout的值
      );
      libxml_disable_entity_loader(false);
      $client = new \SoapClient($url, $options);
      return $client->__soapCall($function_name, $arguments);
 
    } catch (\SoapFault $e) {
      //超时、连接不上
      if($e->faultcode == 'HTTP'){
        throw new TimeoutException('连接或请求超时', $e->getCode());
      }
    }

soap请求也可以使用资源流context,可以将请求超时写到stream_context_create( )中。

try {
         $arrContextOptions=array("ssl"=>array( "verify_peer"=>false, "verify_peer_name"=>false,'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT));

          //$arrContextOptions=array("http"=>array( "method"=>'GET', 'timeout'=>10));
         $options = array(
                 'soap_version'=>SOAP_1_2,
                 'exceptions'=>true,
                 'trace'=>1,
                 'cache_wsdl'=>WSDL_CACHE_NONE,
                 'stream_context' => stream_context_create($arrContextOptions)
         );
         $client = new SoapClient('https://url/dir/file.wsdl', $options);
     
     } catch (Exception $e) {
         echo "<h2>Exception Error!</h2>";
         echo $e->getMessage();
     } 

六、PHP文件 操作超时

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ppxin/article/details/94598462

智能推荐

数据结构 4. 队列_# 如果head节点的右边不为none # 说明队列中已经有元素了 # 就执行下列的操作-程序员宅基地

文章浏览阅读244次。Leetcode部分队列相关练习一、队列1.队列的定义2.队列的实现2.1 用数组实现一个顺序队列2.2 用链表实现一个链式队列2.3 实现一个循环队列练习641. Design Circular Deque(设计一个双端队列)239. 滑动窗口最大值一、队列1.队列的定义队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,..._# 如果head节点的右边不为none # 说明队列中已经有元素了 # 就执行下列的操作

5个酷毙的Python工具-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏21次。工欲善其事必先利其器,一个好的工具能让起到事半功倍的效果,Python社区提供了足够多的优秀工具来帮助开发者更方便的实现某些想法,下面这几个工具给我的工作也带来了很多便利,推荐给追求美好事物的你。Python TutorPython Tutor 是由 Philip Guo 开发的一个免费教育工具,可帮助学生攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。通过这个工具,教师或_0_10_python代码阅读工具

【Go】基础语法学习_go的语法知识-程序员宅基地

文章浏览阅读156次。pass_go的语法知识

Tokyo Tyrant(TTServer)系列-启动参数和配置-程序员宅基地

文章浏览阅读144次。启动参数介绍 ttserver命令可以启动一个数据库实例。因为数据库已经实现了Tokyo Cabinet的抽象API,所以可以在启动的时候指定数据库的配置类型。内存hash数据库内存tree数据库hash数据库B+ tree数据库,命令通过下面的格式来使用,‘dbname’制定数据库名,如果省略,则被视作内存hash数据库。ttserver [-host ...

Git获取项目contributor的贡献值_git contributors-程序员宅基地

文章浏览阅读1k次。Github API_git contributors

微服务springcloud下使用websocket作消息推送几异常错误解决_微服务websocket-程序员宅基地

文章浏览阅读2k次。在微服务中使用websocket,解决向前端推送实时消息,之间遇到的问题及解决方法。引入websocket依赖,并进行配置<!-- webSocket 开始--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artif._微服务websocket

随便推点

Centos7安装WebRTC网关Janus_centos janus 安装-程序员宅基地

文章浏览阅读889次。1.Janus简介Janus 是由Meetecho设计和开发的开源、通用的基于SFU架构的WebRTC流媒体服务器,它支持在Linux的服务器或MacOS上的机器进行编译和安装。由于Janus 是使用C语言进行编写的,因此它的性能十分优秀。Janus 的整体架构图如下图所示。Janus 主要由三个部分组成,分别是Core、Plugin和Transport,下面是相关模块的介绍:Core: Janus的核心部分,其作用是处理数据流的转发,以及各种协议的接入,是WebRTC技术的具体实现。 P_centos janus 安装

freeRTOS-程序员宅基地

文章浏览阅读181次。打印系统任务的一些信息//打印系统运行的任务信息void pritf_sysState(void){ UINT32 TotalRunTime; UBaseType_t ArraySize,x; TaskStatus_t *StatusArray; KEY_DEBUG(" "); KEY_DEBUG("/**************************pritf_sysState***************************/"); ArraySize = uxTaskGet

谣言检测论文精读——1.IJCAI2016-Detecting Rumors from Microblogs with Recurrent Neural Networks-程序员宅基地

文章浏览阅读915次。本文提出了一种学习微博事件的连续表示以识别谣言的新方法。所提出的模型基于循环神经网络 (RNN),用于学习捕获相关帖子的上下文信息随时间变化的隐藏表示。RNN 方法优于使用手工特征的最先进的谣言检测模型;基于 RNN 的算法的性能通过复杂的循环单元和额外的隐藏层进一步提高;基于RNN的方法比现有技术更快速、更准确地检测谣言,包括领先的在线谣言揭穿服务。_detecting rumors from microblogs with recurrent neural networks

Qt 之 自定义按钮 在鼠标 悬浮、按下、松开后的效果(转载)_qt按钮设置悬停时-程序员宅基地

文章浏览阅读2.4k次。———————————————— 版权声明:本文为CSDN博主「前行中的小猪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/goforwardto..._qt按钮设置悬停时

JS函数_js节流函数 没有定义方法名-程序员宅基地

文章浏览阅读278次。JS函数有两种定义方式:声明和表达式。区分函数声明和表达式最简单的方法是看 function 关键字出现在声明中的位置(不仅仅是一行代码,而是整个声明中的位置)。如果 function 是声明中 的第一个词,那么就是一个函数声明,否则就是一个函数表达式。一、函数声明:函数声明必须带有标示符(Identifier)(就是大家常说的函数名称)function foo(){} // 声明,因为它是程序的..._js节流函数 没有定义方法名

Python 回调函数实现异步处理-程序员宅基地

文章浏览阅读745次。说到异步处理大家应该会联想到Ajax 处理,那我们先来说说什么是Ajax 请求。Ajax 就相当于是模拟了一个信息发送请求,你可以在很多网站上注册的时候会发现,比如用户名输入“123”,那么它可能会提示你该用户已经存在,而给你的感觉是页面并没刷新,也就是并没有提交表单,而用户名又是存放在数据库内的,也就是说要查询用户名是否存在,就必须得发送表单的里的用户名,然后再在数据库中去查询。而这个过程就是用了Ajax 来处理的,用户输入用户名,当表单的焦点发生变化的时候,则会触发Ajax,然后Aj..

推荐文章

热门文章

相关标签