php 中file_get_contents超时问题的解决方法

最近开发遇到一个file_get_contents超时的问题,主要是因为访问腾讯服务器导致php脚本超时,下面我来总结file_get_contents超时问题的解决方法总结

1.创建一个可以控制的资源句柄,通过控制资源句柄超时来控制file_get_contents超时时间

$context = stream_context_create(
    array(
         'http' => array(
          'timeout' => 3000 //超时时间,单位为秒
         ) 
));  
// Fetch the URL's contents 
$contents = file_get_contents('http://xxx', 0, $context);

2.增加超时的时间限制

这里需要注意: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'=>60,
)
);
$context = stream_context_create($opts);
$html =file_get_contents('http://xxxx', false, $context);

3.一次有延时的话那就多试几次

有时候失败是因为网络等因素造成,没有解决办法,但是可以修改程序,失败时重试几次,仍然失败就放弃,因为file_get_contents()如果失败将返回 FALSE,所以可以下面这样编写代码:

$cnt=0; 

while($cnt < 3 && ($str=@file_get_contents('http://xxxx'))===FALSE) $cnt++;

以上方法对付超时已经OK了。那么Post呢?细心点有人发现了'method'=>"GET", 对!是不是能设置成post呢?

<?php
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' => 'test@qq.com',
    'submit' => 'submit',
);

$res = Post('http://xxxxxx', $data);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程坑太多

springboot(20)Actuator使用

17940
来自专栏bdcn

Flask跨域请求的处理方法 原

15920
来自专栏云计算教程系列

如何使用fsck - 快速解答

fsck是文件系统一致性检查的缩写,是一个实用程序,用于检查文件系统是否存在错误,并尝试在可能的情况下修复它们。它使用内置工具的组合来检查磁盘并生成其结果的报告...

15130
来自专栏吴伟祥

Linux系统关机过程 原

最常用的Linux关机命令用init、shutdown、halt和reboot等。这些命令都可以达到关机重启的目的,但是每个命令的内部工作过程是不同的。下面就详...

19910
来自专栏测试驿栈

Jmeter(二十二)_jenkins配置gitlab插件与ant插件

服务器中的Jenkins通过Gitlab插件读取远程Git远程仓库中的代码,然后通过ant插件进行构建

15340
来自专栏无所事事者爱嘲笑

react-native Execution failed for task ':app:prepareRnReduxReactNativeUpdateUnspecifiedLibrary'报错

37290
来自专栏Duncan's Blog

RESTful web service

REST架构就是为了HTTP协议设计的。RESTful web services的核心概念是管理资源。资源是由URIs来表示,客户端使用HTTP当中的’POST...

10630
来自专栏黑泽君的专栏

eclipse复制粘贴项目,需要修改的几处地方

2、修改访问的根目录:项目名右键 --> Properties --> Web Project Setting

50120
来自专栏Vamei实验室

Python标准库04 文件管理 (部分os包,shutil包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 在操作系统下,用户可以通过操作系统的命令来...

22890
来自专栏阿炬.NET

解决Android系统短信群发时提示”正在发送大量短信“

53150

扫码关注云+社区

领取腾讯云代金券