社会专题
靓丽女人 黑白社会 硬件网络 天下军事 教育咨询 星新一代 汽车电子 幽默笑话 农村特色 有书有道 软件技术 玄幻奇幻 办公达人 便民服务 免费资源 代码效果 美文园地 寻医问药 健康保健 时尚酷玩 天文地理 科技科幻 美食天下 游山玩水 历史天空 制作教程
FLASH频道
女生游戏 益智游戏 有声艺术 有声故事 电脑运用 休闲游戏 MTV类 运动游戏
聚划算
商旅游玩 装潢装饰 家电家具 服装服饰 健康保健 二手特色 生活必备 数码产品
映讯频道
喜剧片 国内片 情感片 动作片 战争片 纪录之窗 欧美剧集 明星云集 动漫片 港澳台剧 大陆剧 科幻片 恐怖片 浓缩电影 教育教学 艺术无界 一技之长 邻国热剧
下载中心
音体美合 信息社政 英语外语 科学自然 常用软件 语文数学 手机软件 红绿软件
图片中心
制作美图 生活图片 美女欣赏 实物图片 艺术欣赏 风景欣赏
领券购
热销女装 热血男装 生活必须 电子电器 手机电脑 旅游出行 学习艺术 吃货优选
新闻中心
一语惊人 奇闻趣事 热点专栏 曝光台 消费警示 今日观察 IT业界 消费主张 动态备忘 专利之窗
关闭
当前位置:首页社会专题硬件网络
file_get_contents()在本地可用Linux服务器不可用的问题解决

首先想到的是 是不是有些配置项没有打开造成的

检查一遍发现allow_url_fopen为开启状态,而且也不是max_execution_time的问题 更不是set_limit_time的毛病。

接着想改用curl也是同样返回false 我就那个晕了。。。

后来 想到用fsockopen()检测一下,问题终于出来了 原来服务器不能连接外网 我靠。。。

检测程序如下:

$file='www.baidu.com'; 

$fp = fsockopen($file, 80, $errno, $errstr); 

if (!$fp) { 

echo "999"; 

echo "$errstr ($errno) <br />\n"; 

} else { 

echo "hello"; 

输出结果:999(0)

开通访问外网权限后一切正常!!!

下面是搜索到的其他解决方案(不适合我 但是 可能适合你解决问题)

file_get_contents函数不能使用的解决方法

有些主机服务商把php的allow_url_fopen选项是回闭了,就是没法直接使用file_get_contents来获取远程web页面的内容。那就是可以使用另外一个函数curl。

下面是file_get_contents和curl两个函数同样功能的不同写法

file_get_contents函数的使用示例: 

< ?php

$file_contents = file_get_contents('http://www.ccvita.com/');

echo $file_contents;

?>

换成curl函数的使用示例: 

< ?php

$ch = curl_init();

$timeout = 5; 

curl_setopt ($ch, CURLOPT_URL, 'http://www.ccvita.com');

curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 

curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

$file_contents = curl_exec($ch);

curl_close($ch);

echo $file_contents;

?>

利用function_exists函数来判断php是否支持一个函数可以轻松写出下面函数

< ?php

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;

}

?>

其实上面的这个函数还有待商榷,如果你的主机服务商把file_get_contents和curl都关闭了,上面的函数就会出现错误。

前几天公司在用的一台服务器出现了file_get_contents不能使用的问题.查了N多地方也不知道为什么会这样.所有的设置都没问题,最后没办法,采用exec呼叫底层curl函数的方法来代替了.这一页翻过.

昨天朋友的一台服务器同样出现了这个问题,一直以为是系统或者机房的原因,重装系统也试过了,给机房打电话也检查过了,就是不行. 郁闷之极

今天上午朋友QQ上告诉我,原因查到了,是双线的缘故.因为机器上有两块网卡,而原来的LINUX没有针对两块网卡进行配置,设置2个IP地址,而导致了这个问题.后来把机器换成了WIN2003,然后对网卡进行了配置后,就可以正常运行了.

如果你的PHP代码中,file_get_contents返回空白,没有任何信息.或许你也应该检查一下是否双线服务器设置了双网卡哦.

三 (这个比较经典了)

PHP 技巧:file_get_contents的超时处理

话说,从PHP5开始,file_get_content已经支持context了(手册上写着:5.0.0 Added the context support. ),也就是说,从5.0开始,file_get_contents其实也可以POST数据,关于这个,我在通过file_get_contents来 Post数据的实例也有所介绍。

今天说的这篇是讲超时的,确实在跨服务器提交的时候,不可避免的会遇到超时的情况,这个时候怎么办?set_time_limit是没有用的,只有用context中的timeout时间来控制。相反,我们不是要抑止,而是要管理。比如在超时返回错误后,进行一次尝试,就象js中的 settimeout那样,对函数重新处理。错误超过3次或者5次后,我们就确实的认为无法连接服务器而彻底放弃。这,是一个好办法,应该值得推荐使用。其实。不全是file_get_contents,只要支持context的都应该加上,避免超时浪费时间。这样可以被支持的函数大致有:fsocketopen(该函数的最后一个参数。好象比较推荐在读stream的时候,使用stream_time_out函数进行控制),fopen(也是从PHP5开始加入context支持),file(PHP5加入支持),curl(curl有自已的变量CURLOPT_TIMEOUT)等 。

下面开始看原文吧:http://xinsync.xju.edu.cn/index.php/archives/6840。

因为要用php去向我的虚拟主机管理系统发送开通空间等的请求,需要Post传值,由于开通空间过程很慢,同时需要延时处理。以下找到了一下 file_get_contents的超时处理,网上有人用2个方法解决:

在使用file_get_contents函数的时候,经常会出现超时的情况,在这里要通过查看一下错误提示,看看是哪种错误,比较常见的是读取超 时,这种情况大家可以通过一些方法来尽量的避免或者解决。这里就简单介绍两种:

一、增加超时的时间限制

这里需要注意:set_time_limit只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时 间。

我一开始以为set_time_limit也能影响到file_get_contents,后来经测试,是无效的。真正的修改 file_get_contents延时可以用resource $context的timeout参数: 

PHP代码
  1. $opts = array(   

  2. 'http'=>array(   

  3. 'method'=>"GET",   

  4. 'timeout'=>60,   

  5. )   

  6. );   

  7. $context = stream_context_create($opts);   

  8. $html =file_get_contents('http://www.example.com', false, $context);   

  9. fpassthru($fp);  

二、一次有延时的话那就多试几次

有时候失败是因为网络等因素造成,没有解决办法,但是可以修改程序,失败时重试几次,仍然失败就放弃,因为file_get_contents()如果失 败将返回 FALSE,所以可以下面这样编写代码: 

PHP代码
  1. $cnt=0;   

  2. while($cnt < 3 && ($str=@file_get_contents('http...'))===FALSE) $cnt++;  

以上方法对付超时已经OK了。那么Post呢?细心点有人发现了’method’=>”GET”, 对!是不是能设置成post呢?百度找了下相关资料,还真可以!而且有人写出了山寨版的post传值函数,如下: 

PHP代码
  1. function Post($url$post = null)   

  2. {   

  3. $context = array();   

  4. if (is_array($post)) {   

  5. ksort($post);   

  6. $context['http'] = array (   

  7. 'timeout'=>60,   

  8. 'method' => 'POST',   

  9. 'content' => http_build_query($post'''&'),   

  10. );   

  11. }   

  12. return file_get_contents($url, false, stream_context_create($context));   

  13. }   

  14. $data = array (   

  15. 'name' => 'test',   

  16. 'email' => 'test@gmail.com',   

  17. 'submit' => 'submit',   

  18. );   

  19. echo Post('http://www.example.com'$data);  

OK , 上面函数完美了,既解决了超时控制又解决了Post传值。再配合康盛的改良版RC4加密解密算法,做一个安全性很高的webservice就简单多了。

通过以上函数的组合,终于实现了PHP和我的ASP版虚拟主机管理软件的通信。.net相信也很容易了,因为已经有了.net版本的 authcode类。未来再做一个java版的就天下大同了。

--EOF--

我只能说这样的处理好是好,只是还得注意文件头的Set_time_out,否则整个文件都得超时了。呵呵

提示:输入修改代码都可运行!
0
酒精度
91
顶一下
相关阅读
内容加载中……