Ene*_*oma 14 php performance facebook fql.multiquery facebook-graph-api
我尝试从Facebook上的管理员页面获得一些见解.
我的代码做了什么,它通过mySQL获取我想要使用的页面的ID.我没有包括那部分.
在此之后,我获取每个facebook ID的page_id,name和fan_count并保存在fancounts[].
我有两个问题.
我的问题是,如何修改代码以提高性能并显示上述数据?我读到了关于fql.multiquery的内容.可以在这里使用吗?
请提供代码示例.谢谢
hoh*_*ner 12
目前,你正在对Facebook的数据库进行两次单独的调用,这会减慢一切.Facebook提供多种查询,以便您可以在尽可能少的数据库调用中完成所有操作.所以你应该考虑使用的电话是:
"query1":"SELECT page_id, name, fan_count FROM page WHERE page_id IN ($pagesIds)"
Run Code Online (Sandbox Code Playgroud)
因为它们允许您引用先前的查询,所以您可以在#之后包含它:
"query2":"SELECT message FROM stream WHERE source_id IN (SELECT page_id FROM #pages) LIMIT 2"
Run Code Online (Sandbox Code Playgroud)
您需要使用的PHP是这样的:
$query = array(
"pages"=>"SELECT page_id, name, fan_count FROM page WHERE page_id IN ($pagesIds)",
"messages"=>"SELECT message FROM stream WHERE source_id IN (SELECT page_id FROM #pages) LIMIT 2"
);
$fql_url = $facebook->api(array(
'method' => 'fql.multiquery',
'queries' => $query
));
print_r($fql_url);
Run Code Online (Sandbox Code Playgroud)
如果第二个查询未通过,请尝试仅使用此查询测试FB DB,看看它是否有效.如果查询本身没有返回任何内容,则问题可能是权限(即访问敏感表 - 但我不认为是这种情况).我经常遇到的另一个问题是FQL如何使用空格自行启动,因此请尝试省略数组中所有可能的空格:
$query = array("pages"=>"SELECT page_id, name, fan_count FROM page WHERE page_id IN ($pagesIds)","messages"=>"SELECT message FROM stream WHERE source_id IN (SELECT page_id FROM #pages) LIMIT 2");
Run Code Online (Sandbox Code Playgroud)
哇,这是可读的...这是从Facebook的 FQL 文档中获取的,因此如果使用第三方库,您可能需要根据Web应用程序进行调整.您的所有数据都保存在$fql_url.您需要做的就是遍历它并回显您想要的信息.如果您想查看其中包含的所有内容的摘要,请考虑使用print_r()或var_dump()仅仅为了获得您的方位.
编辑
您为第二个查询接收空数组的原因是因为您似乎没有该stream表的权限.如果您查看Facebook的文档,他们会提到访问此表所需的条件:
要读取所需的流表
read_stream当前会话用户能够查看的所有帖子的权限read_insights权限,以查看由当前会话用户拥有的网页所做的任何帖子的帖子展示次数
要检查您拥有的权限,可以运行以下查询:
$check_query = $facebook->api(array(
"method" => "fql.query",
"query" => "SELECT * FROM permissions WHERE uid=me()"
));
foreach($check_query[0] as $k => $v) {
if($v === "1") {
echo "<strong>$k</strong> permission is granted.<br>";
} else {
echo "<strong>$k</strong> permission is not granted.<br>";
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有n页面,则脚本会进行n+1查询.这是您的脚本的主要缺点.这是性能低下的原因.
您可以使用批处理请求来组合查询.您可以使用以下脚本来实现您的目标.我已将这些n+1查询合并到一个批处理查询中.所以它会比你的脚本更快.
我也纠正了这个echo部分.现在,脚本将显示您在问题中声明的输出.
// Get the IDs
$pages = array();
$pagesIds = implode(',', $pages);
// fancounts[] holds the page_id, name and fan_count of the Ids I work with
$fancounts = array();
$q = "SELECT page_id, name, fan_count FROM page WHERE page_id IN ({$pagesIds})";
$queries[] = array('method'=>'GET', 'relative_url' => 'method/fql.query?query=' . urlencode($q) );
$messages = array();
foreach( $pages as $id)
{
$q = "SELECT message FROM stream WHERE source_id = '$id' LIMIT 2";
$queries[] = array('method'=>'GET', 'relative_url' => 'method/fql.query?query=' . urlencode($q) );
}
// The batch query
$batchResponse = $facebook->api('?batch='.json_encode($queries), 'POST');
$pagesFanCounts = json_decode($batchResponse[0]['body'], TRUE);
foreach ($pagesFanCounts as $page)
{
$fancounts[] = number_format($page['page_id'],0,'','')."-".$page['name']."-".$page['fan_count'];
}
for($i=0; $i < count($fancounts); $i++)
{
echo '</br>',$fancounts[$i],'<br>';
$temp = json_decode($batchResponse[$i+1]['body'], TRUE);
foreach ($temp as $msg)
{
echo ($msg['message']);
echo "</br>";
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1707 次 |
| 最近记录: |