执行、获取远程代码返回: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中使用Oracle数据库(6)
Oct 09 PHP
php5.2时间相差8小时
Jan 15 PHP
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
Jul 21 PHP
PHP Error与Logging函数的深入理解
Jun 03 PHP
析构函数与php的垃圾回收机制详解
Oct 28 PHP
php实现根据url自动生成缩略图的方法
Sep 23 PHP
初识PHP
Sep 28 PHP
php实现通过ftp上传文件
Jun 19 PHP
Twig模板引擎用法入门教程
Jan 20 PHP
PHP自定义函数获取汉字首字母的方法
Dec 01 PHP
PHP中empty,isset,is_null用法和区别
Feb 19 PHP
PHP 多任务秒级定时器的实现方法
May 13 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中把对象数组转换成普通数组的方法
2015/07/10 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
js prototype截取字符串函数
2010/04/01 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
2015/03/03 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
js实现TAB切换对应不同颜色的代码
2015/08/31 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
基于jQuery.i18n实现web前端的国际化
2018/05/04 jQuery
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
详解python的变量缓存机制
2021/01/24 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
卫校中专生个人自我评价
2013/09/19 职场文书
刘胡兰的英雄事迹材料
2014/02/11 职场文书
白酒营销策划方案
2014/08/17 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
安全生产先进个人总结
2015/02/15 职场文书
初中语文教师研修日志
2015/11/13 职场文书
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang
mysq启动失败问题及场景分析
2021/07/15 MySQL