Att*_*emi 9 php curl facebook-graph-api
无论是使用Facebook PHP SDK,还是仅使用curl加载数据$contents = file_get_contents("https://graph.facebook.com/$id?access_token=$accessToken"),响应都需要大约一秒钟.
当我需要检查一堆id的数据时,这非常慢.
在浏览器中,如果我输入一个facebook图形网址,我几乎可以立即得到结果,在PHP的十分之一时间内.
是什么导致了这个问题,我怎样才能像在任何浏览器中那样快速地制作它?我知道浏览器可以做到这一点.必须有一种方法可以在PHP中快速实现它.
IDEA:也许我需要在cURL中配置一些东西?
我尝试过的:
file_get_contents()是因为我希望PHP SDK没有正确配置.setopt($ch, CURLOPT_SSL_VERIFYPEER, false);.它没有任何区别.在回答编辑之后:实际上,这与重复使用卷曲手柄一起使后续请求非常快.编辑:这是我用来衡量执行请求所需时间的代码的粘贴框:http://pastebin.com/bEbuqq5g.我将过去常说微秒的文本更正为秒.这就产生了类似于我在这个问题的评论中所写的结果:Facebook图形在PHP中非常慢.另请注意,即使访问令牌已过期,它们也会采用类似的慢速时间,就像在我的pastebin示例中一样.
编辑2:ssl应该有部分问题.我尝试了http://graph.facebook.com/4(没有httpS)的基准测试,它导致三个请求的1.2秒,而相同,但https花了2.2秒.这绝不是一个解决方案,因为对于任何需要访问令牌的请求,我必须使用https.
file_get_contents在PHP中可能会非常慢,因为它不能正确发送/处理标头,导致在文件传输完成时HTTP连接无法正常关闭.我也读过有关DNS问题的内容,但我没有任何相关信息.
我强烈建议的解决方案是使用PHP SDK,它用于对Facebook进行API调用,或者使用cURL(SDK使用).使用cURL,您可以真正配置请求的许多方面,因为它基本上是为了进行这样的API调用而设计的.
PHP SDK信息:https://developers.facebook.com/docs/reference/php/
PHP SDK源代码:https://github.com/facebook/facebook-php-sdk
如果您选择在没有SDK的情况下执行此操作,您可以查看他们如何在base_facebook.php中使用cURL .这里有一些您可以使用cURL获取的示例代码:
function get_url($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, FALSE); // Return contents only
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // return results instead of outputting
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10) // Give up after connecting for 10 seconds
curl_setopt($ch, CURLOPT_TIMEOUT, 60); // Only execute 60s at most
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // Don't verify SSL cert
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
$contents = get_url("https://graph.facebook.com/$id?access_token=$accessToken");
Run Code Online (Sandbox Code Playgroud)
该函数将在失败时返回FALSE.
我看到你说你已经使用过PHP SDK,但也许你没有设置cURL.尝试安装或更新它,如果它似乎仍然很慢,你应该使用
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
Run Code Online (Sandbox Code Playgroud)
并检查输出.
我想知道如果我不进行两次后续curl_exec()调用会发生什么情况curl_close(),启用HTTP Keep-Alive.
测试代码:
$ch = curl_init('https://graph.facebook.com/xxx');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// FIRST REQUEST
curl_exec($ch);
print_r(curl_getinfo($ch));
// SECOND REQUEST
curl_exec($ch);
print_r(curl_getinfo($ch));
curl_close($ch);
Run Code Online (Sandbox Code Playgroud)
以下是结果,显示了以下部分输出curl_getinfo():
// FIRST REQUEST
[total_time] => 0.976259
[namelookup_time] => 0.008271
[connect_time] => 0.208543
[pretransfer_time] => 0.715296
// SECOND REQUEST
[total_time] => 0.253083
[namelookup_time] => 3.7E-5
[connect_time] => 3.7E-5
[pretransfer_time] => 3.9E-5
Run Code Online (Sandbox Code Playgroud)
第一个请求非常慢,几乎整整一秒,与您的体验相似.但是从第二次请求(仅0.25秒)开始,您可以看到保持活力有多大差异.
您的浏览器也使用这种技术,当然,在浏览器的新实例中加载页面需要相当长的时间.