2012-06-16 37 views
0

我的web应用程序构建了Facebook图形API的批量请求。该批次是通过进行第一次API调用来获取用户的朋友。然后,我遍历好友列表并为每个(为该用户的特定访问令牌)添加一个特定的请求,并将每个请求添加到批处理中。所以它最终是两个API调用。不幸的是,它真的很慢,我听说FQL请求更快。将Facebook API批量请求转换为FQL多查询

所以我的问题是,我可以用FQL做到这一点吗?我已阅读the documentation,但我无法弄清楚我将如何返回,例如,朋友的工作历史记录(需要每个朋友的访问令牌)的所有朋友都带有一个FQL查询。这可能吗?显然,我可以建立一个批量请求的FQL请求,但这会让我回到我开始的地方。

更新: 我已经做了一些测试,FQL肯定比批处理请求更快。我FQL multiquery看起来是这样的:

$multiQuery = array(
"query1"=>"SELECT uid2 FROM friend WHERE uid1 = me()", //LIST OF FRIEND IDs 
"query2"=>"SELECT uid, name, work, education, is_app_user FROM user WHERE uid IN (SELECT uid2 FROM #query1)", //FRIEND PROFILES 
"query3"=>"SELECT uid2 FROM friend WHERE uid1 IN (SELECT uid FROM #query2 WHERE is_app_user=1)", 
"query4"=>"SELECT uid, name, work, education FROM user WHERE uid IN (SELECT uid2 FROM #query3)" 
); 

$multiQueryResult = $facebook->api(array(
'method' => 'fql.multiquery', 
'queries' => $multiQuery 
)); 

var_dump($multiQueryResult); 

查询工作,但这里有两个问题:

  1. QUERY3返回所有用户ID,不只是谁已经授权 我的应用程序的人。

  2. query4不返回工作/教育领域......大概是因为 API请求被称为当前用户的 访问令牌(而不是从QUERY3特定用户的)。我已将授权用户的访问令牌存储在数据库中,但我不知道在此情况下是否可以使用它们。

这可以用FQL来完成吗?我可以在FQL多查询中定义唯一的访问令牌吗?

+0

你能弄清楚这一点吗?我试图让它工作。 – dang

回答

0

这不是我原来的问题的答案,因为它似乎并不是一个问题。看起来在写这篇文章的时候,Facebook的批量请求确实很慢......这太糟糕了,因为它基本上打败了它的全部目的。

0

朋友的工作历史的所有朋友(这需要每个朋友的访问令牌)

如果你需要不同的访问令牌,那么显然就没有在一个单个请求做这件事的方式......但其中无论如何,你是否会让我的每个朋友访问令牌,如果他们最近不会与您的应用进行交互?如果他们有,你可以得到他们的工作信息,然后把它放到你自己的数据库中,这样你就可以使用我的朋友的uid进行查找。否则,我认为这是而不是真的是你的方式去。

它宁愿是这样的:

如果用户的朋友成立了自己的隐私设置,使他们愿意与大家分享您的用户正在使用的应用程序的工作方式,那么你就可以得到这些信息而不需要为每个这样的朋友提供单独的访问令牌。然后,你只想做一个FQL查询这个样子,

SELECT uid, name, work FROM user WHERE uid IN 
    (SELECT uid1 FROM friend WHERE uid2 = me()) 

这会给你的用户的朋友的工作信息 - 但显然只对那些愿意分享这些信息应用程式的朋友使用。

+0

我已将自己的访问令牌存储在我的数据库中。这个应用程序的重点是找到“朋友的朋友”之间的联系。因此,例如,当前用户在他们的任何朋友或他们的朋友知道的任何人(已经授权该应用)的个人资料中搜索信息。 – emersonthis

+0

我希望FQL multiquery可以让我做我想做的事情。我已经更新了我的问题以显示我目前的思维方向。这有什么可能吗? – emersonthis

+0

对于它的价值,我只用批量的FQL查询测试了我的原始代码,它的速度与批量图形请求一样慢。所以“批”似乎是问题的根源。最后一个问题是,是否有其他方式来做我想做的事情。 – emersonthis