执行、获取远程代码返回: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 相关文章推荐
解析dedeCMS验证码的实现代码
Jun 07 PHP
关于Sphinx创建全文检索的索引介绍
Jun 25 PHP
php读取文件内容的三种可行方法示例介绍
Feb 08 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
Apr 09 PHP
php中的观察者模式简单实例
Jan 20 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
Mar 23 PHP
php cookie 详解使用实例
Nov 03 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
Jan 16 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
May 04 PHP
老生常谈PHP 文件写入和读取(必看篇)
May 22 PHP
360搜索引擎自动收录php改写方案
Apr 28 PHP
PHP抽象类基本用法示例
Dec 28 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
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
使用jscript实现二进制读写脚本代码
2008/06/09 Javascript
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
把html页面的部分内容保存成新的html文件的jquery代码
2009/11/12 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
Bootstrap面板使用方法
2017/01/16 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
python中global用法实例分析
2015/04/30 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
Java文件与类动手动脑实例详解
2019/11/10 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
html5 datalist标签使用示例(自动完成组件)
2014/05/04 HTML / CSS
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
final, finally, finalize的区别
2012/03/01 面试题
自我评价200字分享
2013/12/17 职场文书
心得体会范文
2014/01/04 职场文书
大学生英语演讲稿
2014/04/24 职场文书
贯彻落实“八项规定”思想汇报
2014/09/13 职场文书
主持人开幕词
2015/01/29 职场文书
自主招生英文自荐信
2015/03/25 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
Python中相见恨晚的技巧
2021/04/13 Python
vue如何清除浏览器历史栈
2022/05/25 Vue.js