PHP超时的设置方法有哪些

本篇文章给大家介绍一下php超时的设置方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

PHP超时的设置方法有哪些

一、PHP文件 执行超时

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

打开php.ini文件,找到:

max_execution_time=30

登录后复制

 修改为:

max_execution_time=600

登录后复制

如果你没有服务器修改权限,可通过内置PHP脚本的方法设置超时时间,在需要执行长时间操作的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 请求超时

 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;  }}

登录后复制

四、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加入支持)。

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 "

Exception Error!

";         echo $e->getMessage();     }

登录后复制

推荐学习:php视频教程

以上就是PHP超时的设置方法有哪些的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2514132.html

(0)
上一篇 2025年3月5日 15:23:45
下一篇 2025年2月23日 12:58:47

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 什么是PHP 数组吗?PHP 数组如何使用?

    大家了解什么是php 数组吗?自己会用php写一些关于数组的东西吗?本文带大家了解一下php 数组,快来一起学习吧!!! 什么是数组: 数组是一个能在单个变量中存储多个值的特殊变量。 php数组,本意就是PHP中的数组。他的特点就是将val…

    2025年3月5日
    100
  • php加载文件的方法有哪些

    php加载文件的方法:1、使用“include ‘文件名’”语句加载;2、使用“require ‘文件名’”语句加载;3、使用“include_once ‘文件名’”语…

    2025年3月5日 编程技术
    200
  • php explode中文乱码怎么办

    解决方法:1、在php.ini配置文件中,查找并设置“defalut_charset”项的值为“utf-8”即可;2、在php程序中,使用“@ini_set(‘default_charest’,’utf-…

    2025年3月5日
    200
  • php如何不递归实现遍历目录下所有文件

    实现方法:1、创建一个数组,将要遍历的这个目录放入;2、循环处理这个数组,循环结束的条件是数组为空;3、每次循环,处理数组中的一个元素,并将元素删除;4、如果这个元素是目录,则将目录下所有的子元素加入数组,接着处理元素,直至数组为空。 本教…

    2025年3月5日
    200
  • php实现301跳转的方法是什么

    php实现301跳转的方法:首先使用“header(“HTTP/1.1 301 Moved Permanently”);”语句设置301状态码;然后使用“header(“Location:your_des…

    2025年3月5日
    200
  • php怎么删除所有文件夹

    php删除所有文件夹的方法:首先创建一个PHP示例文件;然后设置需要删除的文件夹;最后通过遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件即可。 本文操作环境:windows7系统、PHP7.1版,DELL G3电…

    2025年3月5日
    200
  • php怎么替换连续空格

    php替换连续空格的方法:首先创建一个PHP示例文件;然后通过“static public function merge_spaces ( $string){…}”实现替换去除多个连续空格即可。 本文操作环境:windows7系…

    2025年3月5日
    200
  • php浏览器删除cookie

    php浏览器删除cookie的方法:1、设置cookie的过期时间;2、设置cookie的值为空;3、使用setcookie方法来设置cookie。 本文操作环境:windows7系统、PHP7.1版,DELL G3电脑 php服务器删除浏…

    2025年3月5日
    200
  • php 魔术方法 call是什么

    php __call是php魔术方法中的一个,当程序调用到当前类中未声明或没权限调用的方法时,就会调用__call方法。 本文操作环境:Windows7系统、PHP7.1版,DELL G3电脑 php魔术方法__call         _…

    2025年3月5日
    200
  • linux 虚拟机上怎么安装php

    linux虚拟机上安装php的方法:1、安装依赖包;2、安装libmcrypt;3、通过“wget”下载PHP并使用“tar -zxvf”进行解压安装;4、配置域名;5、分割日志;6、在主机的hosts里,将域名指向虚拟机的IP即可。 本文…

    2025年3月5日
    200

发表回复

登录后才能评论