执行、获取远程代码返回: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 auth_http类库进行身份效验
Mar 19 PHP
PHP memcache扩展的三种安装方法
Apr 26 PHP
PHP版网站缓存加快打开速度的方法分享
Jun 03 PHP
深入PHP curl参数的详解
Jun 17 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
php 表单提交大量数据发生丢失的解决方法
Mar 03 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
Aug 15 PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 PHP
ThinkPHP连接Oracle数据库
Apr 22 PHP
php+html5+ajax实现上传图片的方法
May 14 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
在Laravel 中实现是否关注的示例
Oct 22 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和ACCESS写聊天室(九)
2006/10/09 PHP
PHP 分页原理分析,大家可以看看
2009/12/21 PHP
兼容firefox,chrome的网页灰度效果
2011/08/08 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
PHP实现的增强性mhash函数
2015/05/27 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
js文件中调用js的实现方法小结
2009/10/23 Javascript
Jquery中对数组的操作代码
2011/08/12 Javascript
JS跨域总结
2012/08/30 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
JS调用打印机功能简单示例
2016/11/28 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
2017/06/25 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
python递归实现快速排序
2018/08/18 Python
python设置环境变量的原因和方法
2019/06/24 Python
python中的global关键字的使用方法
2019/08/20 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
利用Python中的Xpath实现一个在线汇率转换器
2020/09/09 Python
Python编写单元测试代码实例
2020/09/10 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
外贸实习生自荐信范文
2013/11/24 职场文书
简历中的自我评价范文
2014/02/05 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
走群众路线学习心得体会
2014/10/31 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书