执行、获取远程代码返回: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中判断一个字符串包含另一个字符串的方法
Mar 19 PHP
php下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
php 批量替换程序的具体实现代码
Oct 04 PHP
php 批量添加多行文本框textarea一行一个
Jun 03 PHP
PHP实现的简单缓存类
Jul 29 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
Dec 17 PHP
网页的分页下标生成代码(PHP后端方法)
Feb 03 PHP
配置Nginx+PHP的正确思路与过程
May 10 PHP
PHP自定义错误用法示例
Sep 28 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 PHP
PHP explode()函数用法讲解
Feb 15 PHP
微信小程序发送订阅消息的方法(php 为例)
Oct 30 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/29 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
理解AngularJs指令
2015/12/10 Javascript
WebView启动支付宝客户端支付失败的问题小结
2017/01/11 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
JavaScript数组push方法使用注意事项
2017/10/30 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
vue写一个组件
2018/04/09 Javascript
原生JS实现$.param() 函数的方法
2018/08/10 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
django 创建过滤器的实例详解
2017/08/14 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
python实现图像拼接功能
2020/03/23 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
采购员的工作职责
2013/12/26 职场文书
严以用权学习心得体会
2016/01/12 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书