提高Facebook FQL的性能和可用性

Ene*_*oma 14 php performance facebook fql.multiquery facebook-graph-api

我尝试从Facebook上的管理员页面获得一些见解.
我的代码做了什么,它通过mySQL获取我想要使用的页面的ID.我没有包括那部分.

在此之后,我获取每个facebook ID的page_id,name和fan_count并保存在fancounts[].

我有两个问题.

  1. 它的性能非常慢
  2. 我找不到像这样回显数据的方法:

我的问题是,如何修改代码以提高性能并显示上述数据?我读到了关于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)


Teb*_*ing 5

如果您有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)