执行、获取远程代码返回: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入门的学习方法
Jan 02 PHP
腾讯QQ php程序员面试题目整理
Jun 08 PHP
学习php笔记 字符串处理
Oct 19 PHP
php设计模式 Decorator(装饰模式)
Jun 26 PHP
php session劫持和防范的方法
Nov 12 PHP
php实现可以设置中奖概率的抽奖程序代码分享
Jan 19 PHP
从wamp到xampp的升级之路
Apr 08 PHP
php隐藏实际地址的文件下载方法
Apr 18 PHP
WordPress中自定义后台管理界面配色方案的小技巧
Dec 29 PHP
微信支付开发发货通知实例
Jul 12 PHP
PHP入门教程之图像处理技巧分析
Sep 11 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 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遍历数组的方法分享
2012/03/22 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
PHP实现简易blog的制作
2016/10/24 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
PHP实现计算器小功能
2020/08/28 PHP
Javascript的匿名函数小结
2009/12/31 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
js简单实现标签云效果实例
2015/08/06 Javascript
javascript实现简单的可随机变色网页计算器示例
2016/12/30 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
js实现单张图片平移切换效果
2017/10/11 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
JavaScript实现的九种排序算法
2019/03/04 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
js验证账户名是否重复
2020/05/26 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
详解duck typing鸭子类型程序设计与Python的实现示例
2016/06/03 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
Python OS模块实例详解
2019/04/15 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
static关键字的用法
2013/10/07 面试题
联谊活动策划书
2014/01/26 职场文书
银行职员自我鉴定
2014/04/20 职场文书
奖励申请报告范文
2015/05/15 职场文书