无论是使用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 graph extremely slow in PHP。另请注意,即使访问令牌已过期,它们也会采用类似的慢速时间,就像在我的pastebin示例中一样。
编辑2:ssl应该存在部分问题。我尝试了基准测试http://graph.facebook.com/4(没有httpS),三次请求导致1.2秒,而相同,但https花了2.2秒。这绝不是一个解决方案,因为对于任何需要访问令牌的请求,我必须使用https。
答案 0 :(得分:8)
file_get_contents
可能会非常慢,因为它不能正确发送/处理标头,导致在文件传输完成时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");
失败时函数返回FALSE。
我看到你说你已经使用过PHP SDK,但也许你没有设置cURL。试试installing or updating它,如果它似乎仍然很慢,你应该使用
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
并查看输出。
答案 1 :(得分:7)
我想知道如果我在没有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);
以下是结果,显示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
第一个请求非常缓慢,差不多一秒钟,与您的体验类似。但是从第二次请求开始(仅0.25秒),您可以看到保持活力有多大差异。
您的浏览器也使用此技术,当然,在浏览器的新实例中加载页面需要相当长的时间。
答案 2 :(得分:2)
只想两个想法:
您是否确认浏览器与Facebook没有预先连接?浏览器没有缓存DNS查找(您可以尝试将graph.facebook.net添加到您的hosts文件以管理/退出DNS)
你当然是在与你的浏览器相同的系统/环境中运行php代码(不是从vm运行,而不是从其他主机运行?还有php运行的浏览器与你的浏览器一样?(同样的)不错的水平等))
答案 3 :(得分:1)
使图形API调用“缓慢”的总体最大因素是 - HTTP连接。
通过调整一些参数或获得更好连接的服务器,可能会有一些小的改进。
但这很可能不会产生大差异,因为HTTP通常被认为是“慢”,而且关于这一点几乎无法做到。
当我需要检查一堆id的数据时,这非常慢。
当然,你可以做的最好的事情是 - 最大限度地减少HTTP请求的数量。
如果您必须连续执行多个Graph API调用,请尝试将其作为Batch Request进行操作。这允许您查询数据的多个部分,同时只生成一个 HTTP请求。
答案 4 :(得分:0)
这纯粹是一种推测,但原因可能是Facebook使用SPDY协议(不确定这是否适用于API)。 PHP无法使用SPDY协议加载页面。