执行、获取远程代码返回:file_get_contents 超时处理的问题详解


Posted in PHP onJune 25, 2013

天气终于晴了,但问题来了。在实现两个站点间用户数据同步,当使用php函数 file_get_contents抓取执行远程页面时,如果连接超时将会输出一个Fatal Error或相当的慢,结果导致下面的代码不能运行。先了解一下PHP file_get_contents() 函数
定义和用法
file_get_contents() 函数把整个文件读入一个字符串中。
和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。
file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。
语法
file_get_contents(path,include_path,context,start,max_length)参数 描述
path 必需。规定要读取的文件。
include_path 可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。
context 可选。规定文件句柄的环境。
context 是一套可以修改流的行为的选项。若使用 null,则忽略。
start 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 新加的。
max_length 可选。规定读取的字节数。该参数是 PHP 5.1 新加的。
说明
对 context 的支持是 PHP 5.0.0 添加的。
针对超时或页面过慢,一般可采取两个解决方案:

一. 利用file_get_contents()第三个参数

$url = "http://zhoz.com/zhoz.php";      
$ctx = stream_context_create(array(      
‘http' => array(‘timeout' => 10)      
    )      
    );      
$result = @file_get_contents($url, 0, $ctx);      
if($result){      
        var_dump($result);      
    }else{      
echo " Buffer is empty";      
    }      
?>  

此方法1,我经测试在本地反映良好,但如果在外网测试(环境:中国→美国服务器间)基本都是超时的情况。
测试了TimeOut基本没有用了,建议以下方式

二. 使用curl扩展库
$url = "http://zhoz.com/zhoz.php";      
try {      
echo date(‘Y-m-d h:i:s');      
echo "";      
//$buffer = file_get_contents($url);    
$buffer = zhoz_get_contents($url);      
echo date(‘Y-m-d h:i:s');      
if(emptyempty($buffer)) {      
echo " Buffer is empty";      
        } else {      
echo " Buffer is not empty";      
        }      
    } catch(Exception $e) {      
echo "error ";      
    }      
function zhoz_get_contents($url, $second = 5) {      
$ch = curl_init();      
        curl_setopt($ch,CURLOPT_URL,$url);      
        curl_setopt($ch,CURLOPT_HEADER,0);      
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);      
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);      
$content = curl_exec($ch);      
        curl_close($ch);      
return $content;      
    }      
?>

综述,根据系统环境来选择到底应用哪种方法:
function vita_get_url_content($url) {   
if(function_exists(‘file_get_contents')) {   
$file_contents = file_get_contents($url);   
} else {   
$ch = curl_init();   
$timeout = 5;   
curl_setopt ($ch, CURLOPT_URL, $url);   
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);   
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);   
$file_contents = curl_exec($ch);   
curl_close($ch);   
}   
return $file_contents;   
}   
?> 
PHP 相关文章推荐
php 删除cookie和浏览器重定向
Mar 16 PHP
php设计模式 DAO(数据访问对象模式)
Jun 26 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
php curl模拟post请求小实例
Nov 13 PHP
php根据身份证号码计算年龄的实例代码
Jan 18 PHP
PHPAnalysis中文分词类详解
Jun 13 PHP
php找出指定范围内回文数且平方根也是回文数的方法
Mar 23 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
Apr 09 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
php 指定范围内多个随机数代码实例
Jul 18 PHP
thinkphp中U方法按路由规则生成url的方法
Mar 12 PHP
PHP http请求超时问题解决方案
Nov 13 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 #PHP
使用php判断网页是否gzip压缩
Jun 25 #PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 #PHP
深入file_get_contents函数抓取内容失败的原因分析
Jun 25 #PHP
提升PHP性能的21种方法介绍
Jun 25 #PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
Jun 25 #PHP
解析php取整的几种方式
Jun 25 #PHP
You might like
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
JavaScript 学习笔记(四)
2009/12/31 Javascript
动态载入/删除/更新外部 JavaScript/Css 文件的代码
2010/07/03 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
vue2.0全局组件之pdf详解
2017/06/26 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
python 正则式 概述及常用字符
2009/05/07 Python
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
Python玩转Excel的读写改实例
2019/02/22 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
numpy.linalg.eig() 计算矩阵特征向量方式
2019/11/29 Python
Python接口测试文件上传实例解析
2020/05/22 Python
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
《月球之谜》教学反思
2014/04/10 职场文书
2014年外联部工作总结
2014/11/17 职场文书
2014年大学学生会工作总结
2014/12/02 职场文书
大学生入党自传2015
2015/06/26 职场文书
客户答谢会致辞
2015/07/30 职场文书
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP