执行、获取远程代码返回: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 xml 入门学习资料
Jan 01 PHP
codeigniter框架批量插入数据
Jan 09 PHP
php中url函数介绍及使用示例
Feb 13 PHP
PHP引用(&)各种使用方法实例详解
Mar 20 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
Jul 28 PHP
PHP代码优化技巧小结
Sep 29 PHP
Laravel手动分页实现方法详解
Oct 09 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
Dec 15 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
PHP simplexml_load_string()函数实例讲解
Feb 03 PHP
Yii框架函数简单用法分析
Sep 09 PHP
PHP 技巧 * SVG 保存为图片(分享图生成)
Apr 02 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
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
深入apache host的配置详解
2013/06/09 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
用PHP和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
linux下php上传文件注意事项
2016/06/11 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
json 入门基础教程 推荐
2009/10/31 Javascript
Dom操作之兼容技巧分享
2011/09/20 Javascript
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
BootStrap 动态表单效果
2017/06/02 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
纯javascript实现选择框的全选与反选功能
2019/04/08 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
python字符串排序方法
2014/08/29 Python
对python多线程与global变量详解
2018/11/09 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
python解包用法详解
2021/02/17 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
实习护士自我鉴定
2013/10/13 职场文书
海飞丝的广告词
2014/03/20 职场文书
酒桌上的开场白
2015/06/01 职场文书
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫
部分武汉产收音机展览
2022/04/07 无线电
Windows server 2012搭建FTP服务器
2022/04/29 Servers