执行、获取远程代码返回: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 相关文章推荐
利用 window_onload 实现select默认选择
Oct 09 PHP
php数组总结篇(一)
Sep 30 PHP
php fckeditor 调用的函数
Jun 21 PHP
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
Sep 09 PHP
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
php用正则表达式匹配URL的简单方法
Nov 12 PHP
ThinkPHP之A方法实例讲解
Jun 20 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
PHP使用正则表达式获取微博中的话题和对象名
Jul 18 PHP
php阿拉伯数字转中文人民币大写
Dec 21 PHP
Yii2 中实现单点登录的方法
Mar 09 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文件操作实现代码分享
2011/09/01 PHP
PHP如何实现跨域
2016/05/30 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
JavaScript 对象模型 执行模型
2009/12/06 Javascript
让firefox支持IE的一些方法的javascript扩展函数代码
2010/01/02 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
js与C#进行时间戳转换
2014/11/14 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
jQuery预加载图片常用方法
2015/06/15 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
2015/11/26 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
Javascript的this详解
2019/03/23 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
vue实现购物车列表
2020/06/30 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
跟老齐学Python之dict()的操作方法
2014/09/24 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
Python编程实现tail-n查看日志文件的方法
2019/07/08 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
物理教育专业毕业生推荐信
2013/11/03 职场文书
学习决心书
2014/03/11 职场文书
宣传口号大全
2014/06/16 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
项目转让协议书
2014/10/27 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python