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

By ego008 at 2013-06-16 20:32:01 • 1551次点击

前段时间有人反映说新用户用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 2

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

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

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);

curl, file, get, contents, 问题


别人做过的关于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

ego008 at 2013-06-16 20:35:47
1

@ego008

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

1.6版本

天晨 at 2013-08-23 17:43:01
2

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

admin at 2013-08-23 19:16:59
3

@admin

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

天晨 at 2013-08-23 23:03:21
4

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

admin at 2013-08-24 08:33:03
5

@admin

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

天晨 at 2013-08-24 19:45:50
6

@admin

@ego008

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

天晨 at 2013-08-24 19:57:29
7

@天晨


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

admin at 2013-08-24 20:56:36
8

@admin

执行qqsetname文件?

天晨 at 2013-08-24 21:02:15
9

@admin

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

天晨 at 2013-08-24 21:09:47
10

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

admin at 2013-08-24 21:29:21
11

@admin

直接打开的话http://www.xxx.com/templates/default/qqsetname.php 1

出现404页面

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

天晨 at 2013-08-24 21:39:09
12

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

jat001 at 2013-08-24 21:45:25
13

@jat001

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

天晨 at 2013-08-24 21:47:28
14

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

jat001 at 2013-08-24 21:49:32
15

太谢谢了。 @jat001

搞了两天了。。。终于搞好了。

天晨 at 2013-08-24 21:53:25
16

@jat001

@admin


这个怎么解决?

天晨 at 2013-08-24 22:01:50
17

@jat001

@admin

@ego008

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

天晨 at 2013-08-24 22:10:27
18

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

admin at 2013-08-24 22:14:03
19

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

天晨 at 2013-08-24 22:25:32
20
登录 后发表评论