执行、获取远程代码返回: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 相关文章推荐
实用函数2
Nov 08 PHP
php include,include_once,require,require_once
Sep 05 PHP
PHP COOKIE设置为浏览器进程
Jun 21 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
Nov 08 PHP
php新浪微博登录接口用法实例
Dec 23 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
Jun 13 PHP
利用PHP抓取百度阅读的方法示例
Dec 18 PHP
YII2 实现多语言配置的方法分享
Jan 11 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
Aug 17 PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 PHP
php精度计算的问题解析
Jun 21 PHP
laravel利用中间件做防非法登录和权限控制示例
Oct 21 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常用函数小技巧
2008/09/11 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
Python中的Classes和Metaclasses详解
2015/04/02 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
使用django自带的user做外键的方法
2020/11/30 Python
Python截图并保存的具体实例
2021/01/14 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
CSS3的first-child选择器实战攻略
2016/04/28 HTML / CSS
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
德国足球商店:OUTFITTER
2019/05/06 全球购物
大学毕业生自我鉴定
2013/11/05 职场文书
关于中国梦的演讲稿
2014/04/23 职场文书
保证书格式范文
2014/04/28 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
给朋友的道歉短信
2015/05/12 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏
详细介绍python操作RabbitMq
2022/04/12 Python