执行、获取远程代码返回: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安装全攻略:APACHE
Oct 09 PHP
php HandlerSocket的使用
May 02 PHP
php模块memcache和memcached区别分析
Jun 14 PHP
Smarty foreach控制循环次数的实现详解
Jul 03 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
php中ftp_chdir与ftp_cdup函数用法
Nov 18 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
PHP实现的多文件上传类及用法示例
May 06 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
PHP swoole和redis异步任务实现方法分析
Aug 12 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
laravel中Redis队列监听中断的分析
Sep 14 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使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
js apply/call/caller/callee/bind使用方法与区别分析
2009/10/28 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
详解JS浏览器事件循环机制
2019/03/27 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
Vue使用screenfull实现全屏效果
2020/09/17 Javascript
Python实现比较两个列表(list)范围
2015/06/12 Python
Python编码类型转换方法详解
2016/07/01 Python
python tornado微信开发入门代码
2018/08/24 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
如何在Cloud Studio上执行Python代码?
2019/08/09 Python
Django之form组件自动校验数据实现
2020/01/14 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
2020/02/11 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
志愿者工作心得体会
2016/01/15 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server