执行、获取远程代码返回: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下打开URL地址的几种方法小结
May 16 PHP
解析PHP中常见的mongodb查询操作
Jun 20 PHP
Zend Studio 实用快捷键一览表(精心整理)
Aug 10 PHP
学习php过程中的一些注意点的总结
Oct 25 PHP
php preg_replace替换实例讲解
Nov 04 PHP
CodeIgniter使用phpcms模板引擎
Nov 12 PHP
php实现webservice实例
Nov 06 PHP
PHP简单实现文本计数器的方法
Apr 28 PHP
php is_executable判断给定文件名是否可执行实例
Sep 26 PHP
10个值得深思的PHP面试题
Nov 14 PHP
PHP读取、解析eml文件及生成网页的方法示例
Sep 04 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
Oct 12 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
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
php简单获取复选框值的方法
2016/05/11 PHP
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
jquery实现点击变换导航样式的方法
2015/08/31 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
python如何统计代码运行的时长
2019/07/24 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
Aveda美国官网:天然护发产品、洗发水、护发素和沙龙
2016/12/09 全球购物
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
机械设计制造专业个人求职信
2013/09/25 职场文书
校园元旦活动总结
2014/07/09 职场文书
模范教师材料大全
2014/12/16 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
python 实现体质指数BMI计算
2021/05/26 Python
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js