PHP file_get_contents设置超时处理方法
发布时间:2023-10-18 05:56:46
file_get_contents的超时处理
话说,从PHP5开始,file_get_content已经支持context了(手册上写着:5.0.0 Added the context support. ),也就是说,从5.0开始,file_get_contents其实也可以POST数据。
今天说的这篇是讲超时的,确实在跨服务器提交的时候,不可避免的会遇到超时的情况,这个时候怎么办?set_time_limit是没有用的,只有用context中的timeout时间来控制。相反,我们不是要抑止,而是要管理。比如在超时返回错误后,进行一次尝试,就象js中的 settimeout那样,对函数重新处理。错误超过3次或者5次后,我们就确实的认为无法连接服务器而彻底放弃。这,是一个好办法,应该值得推荐使用。其实。不全是file_get_contents,只要支持context的都应该加上,避免超时浪费时间。这样可以被支持的函数大致有:fsocketopen(该函数的最后一个参数。好象比较推荐在读stream的时候,使用stream_time_out函数进行控制),fopen(也是从PHP5开始加入context支持),file(PHP5加入支持),curl(curl有自已的变量 CURLOPT_TIMEOUT)等 。
在使用file_get_contents函数的时候,经常会出现超时的情况,在这里要通过查看一下错误提示,看看是哪种错误,比较常见的是读取超 时,这种情况大家可以通过一些方法来尽量的避免或者解决。这里就简单介绍两种:
一、增加超时的时间限制
这里需要注意:set_time_limit只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时 间。
我一开始以为set_time_limit也能影响到file_get_contents,后来经测试,是无效的。真正的修改 file_get_contents延时可以用resource $context的timeout参数:
$opts = array(
'http'=>array(
'method'=>"GET",
'timeout'=>1,//单位秒
)
);
$cnt=0;
while($cnt<3 && ($bb=file_get_contents("https://www.jb51.net", false, stream_context_create($opts)))===FALSE) $cnt++;
echo $cnt;
echo $bb;
二、一次有延时的话那就多试几次
有时候失败是因为网络等因素造成,没有解决办法,但是可以修改程序,失败时重试几次,仍然失败就放弃,因为file_get_contents()如果失 败将返回 FALSE,所以可以下面这样编写代码:
$cnt=0;
while($cnt<3 && ($bb=file_get_contents("https://www.jb51.net", false, stream_context_create($opts)))===FALSE) $cnt++;
以上方法对付超时已经OK了。那么Post呢?细心点有人发现了'method'=>”GET”, 对!是不是能设置成post呢?百度找了下相关资料,还真可以!而且有人写出了山寨版的post传值函数,如下:
function Post($url, $post = null){
$context = array ();
if (is_array ( $post )) {
ksort ( $post );
$context ['http'] = array (
'timeout' => 60,
'method' => 'POST',
'content' => http_build_query( $post, '', '&' )
);
}
return file_get_contents ( $url, false, stream_context_create ( $context ) );
}
$data = array (
'name' => 'test',
'email' => 'admin@admin.com',
'submit' => 'submit',
);
echo Post ( 'https://www.aspxhome.com', $data );
OK , 上面函数完美了,既解决了超时控制又解决了Post传值。


猜你喜欢
- 使用ES做搜索引擎拉取数据的时候,如果数据量太大,通过传统的from + size的方式并不能获取所有的数据(默认最大记录数10000),因
- 前段时间前在网上看到一段面试题,要求如下:employee文件中记录了工号和姓名 cat employe
- 一基础理解: var e = document.getElementById("selectId");e. option
- 开放源代码社区为了扩展MySQL的使用范围,开发出了.Net框架(.NET Framework)中可以使用的数据库连接器。我们就来学习一下如
- 本文实例为大家分享了python遗传算法的具体代码,供大家参考,具体内容如下1、基本概念遗传算法(GA)是最早由美国Holland教授提出的
- Python字典的遍历方法有好几种,其中一种是for...in,这个我就不说明,在Python了几乎随处都可见for...in。下面说的这种
- 使用使用navicat连接远程linux mysql数据库出现10061未知故障,设置使用ssh连接后出现2013故障本机环境:win10
- 本文实例讲述了Python callable()函数用法。分享给大家供大家参考,具体如下:python中的内建函数callable( ) ,
- 以读取VOC2012语义分割数据集为例,具体见代码注释:VocDataset.pyfrom PIL import Imageimport t
- 先给大家介绍下python交互模式下输入换行/输入多行命令的方法换行方法 \如:>>> print 'aaa
- 需要把一个从csv文件里读取来的数据集等距抽样分割,这里用到了列表表达式和dataframe.iloc先生成索引列表:index_list
- 题目:输入字符串将大写转换成小写,小写转换成大写?<strong>js字母大小写转换方法:1、转换成大写:toUpperCase
- 许多人在编写程序的时候因为贪图方便或不小心使用到程式的保留字,有时明明程序没有错,就是无法正确执行。您知道有哪些常见的保留字吗? 下面的都是
- 1、检测指定路径下所有文件所占用内存import osdef check_memory(path, style='M'):
- 1、什么是路由懒加载官方的解释:当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不
- 步骤——1:定位在通过与客户,或与和客户接触的业务人员交流,做出一个准确的定位.定位的准确与否,虽然不能决定一定通过,但如果定位不准或相差太
- #!/usr/bin/py2# -*- coding: utf-8 -*-#encoding=utf-8'''
- 一个JavaScript代码编写的图片展示特效,效果很棒。效果图:演示:<!DOCTYPE HTML PUBLIC "-//
- Laravel 的上一个 LTS(长期支持)版本是 Laravel 5.1,发布于 2015 年 6 月,按照对 LTS 版本的约定,两年的
- 1.安装pyserialhttps://pypi.python.org/pypi/pyserialDoc:http://pythonhost