ego008
ego008
5208 20 0

用curl 代替file_get_contents 解决自动获取微博、QQ头像超时的问题

前段时间有人反映说新用户用QQ或微博登录后,在点设置名字后就不动的现象。原因是获取第三方头像时延时或超时,当时只让用户测试 file_get_contents 能否取到头像,没给出解决办法,个人主要在SAE 或BAE 上使用,没遇到这个问题,最近尝试在vps 上使用,也遇到了这个问题,特别是国外的vps。

用curl 代替file_get_contents 的原因是curl 性能比较好,但可能要额外安装(如果你的服务器没有这个模块)。

在phpinfo() 上看有没有curl 的信息,若没有则先安装,ubuntu 下可使用下面命令安装。

sudo apt-get install php5-curl

参考 http://php.net/manual/en/curl.installation.php

参考 http://stackoverflow.com/questions/8540800/php-how-can-use-curl-instead-file-get-contents

稍完善一下得到下面的函数:

function curl_file_get_contents($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

把上面的函数放到/common.php 里,再修改/qqsetname.php 和 /wbsetname.php

屏蔽这一句
//$context = stream_context_create($opts);

//$avatardata = file_get_contents($imgurl, false, $context);
改为
$avatardata = curl_file_get_contents($imgurl);

0

See Also

Nearby


Discussion (20)

ego008
ego008 2013-06-16 12:35

别人做过的关于curl和file_get_contents的测试:

file_get_contents抓取google.com需用秒数:

2.31319094   
2.30374217   
2.21512604   
3.30553889   
2.30124092  

curl使用的时间:

0.68719101   
0.64675593   
0.64326   
0.81983113   
0.63956594
0
天晨
天晨 2013-08-23 09:43

@ego008
bae可以直接改代码使用么?

1.6版本

0
admin
admin 2013-08-23 11:16

@天晨 最好的办法是先备份,修改后试一下。

0
天晨
天晨 2013-08-23 15:03

@admin
在bae用1.6版,用QQ登陆,然后就会出现设置名称页面,但是页面是空白,什么都没有?怎么回事?

0
admin
admin 2013-08-24 00:33

@天晨 这个不知道问题出在哪里,你测试一下,看代码可实行到哪里。

0
天晨
天晨 2013-08-24 11:45

@admin
这个怎么看代码实行到哪了啊?

0
天晨
天晨 2013-08-24 11:57

@admin @ego008
就执行到设置名字那里,就空白了

0
admin
admin 2013-08-24 12:56

@天晨

exit("here n");
来跟踪。

0
天晨
天晨 2013-08-24 13:02

@admin
执行qqsetname文件?

0
天晨
天晨 2013-08-24 13:09

@admin
执行qqsetname到最下边,都能执行

0
admin
admin 2013-08-24 13:29

@天晨 那可能是/templates/default/qqsetname.php 的问题,看看这个文件能实行到哪里。

0
天晨
天晨 2013-08-24 13:39

@admin
直接打开的话http://www.xxx.com/templates/default/qqsetname.php 出现404页面

直接用手机登陆主页点击QQ登陆,把exit("here n");放到templates/default/qqsetname.php,没反应

0
jat001
jat001 2013-08-24 13:45

@天晨 看 qqsetname.php 最后几行
$pagefile = ROOT . '/templates/default/'.$tpl.'setname.php';
是 templates/default/setname.php
不是 templates/default/qqsetname.php
别搞错了

0
天晨
天晨 2013-08-24 13:47

@jat001
1.6版本电脑版登陆正常,就是手机版不能登陆,刚在你的博客请教,你回复说没有手机QQ登陆模板,能告诉我怎么添加么?

0
jat001
jat001 2013-08-24 13:49

@天晨 看我第二个回复,有模板,名字错了。把 templates/default/ios_qqsetname.php 改成 ios_setname.php 就行。

0
天晨
天晨 2013-08-24 13:53

太谢谢了。@jat001
搞了两天了。。。终于搞好了。

0
天晨
天晨 2013-08-24 14:01
0
天晨
天晨 2013-08-24 14:10

@jat001 @admin @ego008
如何实现让本论坛系统支持在APP内置浏览器访问,传图功能?

0
admin
admin 2013-08-24 14:14

@天晨 目前使用的是http post form 来上传图片,有些设备不支持也没法了,如苹果。
若支持的要上传图片就切换到桌面版。要么是自己添加那个上传代码。

0
天晨
天晨 2013-08-24 14:25

@admin代码我已经添加,但是,除了苹果 ,安卓的部分机型也不可以。。。

0
Login Topics