Facebook图形在PHP中极其缓慢

时间:2012-07-10 11:31:02

标签: php facebook-graph-api curl

无论是使用Facebook PHP SDK,还是只使用curl加载数据$contents = file_get_contents("https://graph.facebook.com/$id?access_token=$accessToken"),响应都需要大约一秒钟。

当我需要检查一堆id的数据时,这非常慢。

在浏览器中,如果我输入一个facebook图形网址,我几乎可以立即得到结果,只需花费PHP的十分之一时间。

是什么导致了这个问题,我怎样才能像在任何浏览器中那样快速地制作它?我知道浏览器可以做到这一点。必须有一种方法可以在PHP中快速实现。

IDEA:也许我需要在cURL中配置一些东西?

我尝试过:

  • 使用PHP SDK。这很慢。我首先尝试使用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。

5 个答案:

答案 0 :(得分:8)

PHP中的{p> 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)

只想两个想法:

  1. 您是否确认浏览器与Facebook没有预先连接?浏览器没有缓存DNS查找(您可以尝试将graph.facebook.net添加到您的hosts文件以管理/退出DNS)

  2. 你当然是在与你的浏览器相同的系统/环境中运行php代码(不是从vm运行,而不是从其他主机运行?还有php运行的浏览器与你的浏览器一样?(同样的)不错的水平等))

答案 3 :(得分:1)

使图形API调用“缓慢”的总体最大因素是 - HTTP连接。

通过调整一些参数或获得更好连接的服务器,可能会有一些的改进。

但这很可能不会产生差异,因为HTTP通常被认为是“慢”,而且关于这一点几乎无法做到。

  

当我需要检查一堆id的数据时,这非常慢。

当然,你可以做的最好的事情是 - 最大限度地减少HTTP请求的数量。

如果您必须连续执行多个Graph API调用,请尝试将其作为Batch Request进行操作。这允许您查询数据的多个部分,同时只生成一个 HTTP请求。

答案 4 :(得分:0)

这纯粹是一种推测,但原因可能是Facebook使用SPDY协议(不确定这是否适用于API)。 PHP无法使用SPDY协议加载页面。