我正在努力了解如何利用分页请求对Facebook的Graph API进行批量请求。
我对下面代码的问题是,尽管我试图跟踪数据库中每个facebook_id
的偏移量,但我无法确定特定请求何时出现空白,因此不应该再次请求。
我正在从响应中的分页数组中解析facebook_id
。当没有更多帖子可用时,FB返回一个空的data
数组,因此我无法识别哪个请求没有更多页面,从而减少后续请求。每次我使用$fb_batch_limit
网址查询FB,尽管并非所有请求都返回了上一次呼叫中的寻呼令牌。
真正的程序员将如何解决这个问题?
$posts = array();
//$fb_batch_limit = 30;
$fb_batch_limit = 2;
$fb_req_limit=10;
$facebook = new Facebook(array(
'appId' => $fb_app_id,
'secret' => $fb_app_secret
));
$facebook->setAccessToken($fb_user_token);
$index = 0;
$since = '1Jan14';
$until = 'today';
$num_records_res = $oDB->select("SELECT count(*) as count FROM facebook f");
$num_records_row = mysqli_fetch_array($num_records_res);
$num_records = $num_records_row['count'];
while($index < $num_records) {
printf("# %d to %d\n", $index, $index+$fb_batch_limit);
$res = $oDB->select("SELECT facebook_id FROM facebook f ".
"LIMIT $index, $fb_batch_limit");
$index = $index + $fb_batch_limit;
$offsets = array();
while($rr = mysqli_fetch_array($res)){
$offsets[$rr['facebook_id']] = 0;
}
if (!count($offsets)) {
printf("no more accounts\n");
break;
}
$r=1;
do {
$urls = array();
foreach ($offsets as $fbid => $offset) {
$tmp["method"] = 'GET';
$tmp["relative_url"] = "/".$fbid."/feed?fields=likes.limit(1).summary(true)&offset=$offset&limit=$fb_req_limit";//&since=$since&until=$until";
$tmp["include_headers"] = false;
$urls[] = $tmp;
}
$numurls = count($urls);
printf("$r: fetching %d urls have %d posts\n", $numurls, count($posts));
$response = $facebook->batch($urls);
foreach ($response as $result) {
if (array_key_exists("error", $result)) {
//FIXME handle rate limits somehow
print_r($result);
die;
}
if (array_key_exists("paging", $result)) {
$fbid = substr(parse_url($result['paging']['previous'])['path'],6);
$fbid = substr($fbid, 0, -5);
if (($count = count($result['data'])) > 0) {
$posts = array_merge($posts, $result['data']);
if (array_key_exists("paging", $result) && array_key_exists("next", $result["paging"])) {
if (array_key_exists($fbid, $offsets)) {
$offsets[$fbid] += $count;
}
}
}
else {
printf("$fbid complete with ".
$offsets[$fbid]." posts\n");
unset($offsets[$fbid]);
}
}
else {
// how to stop requesting this single url?
print_r($result);
echo "--\n";
$numurls--;
}
}
} while (++$r && $numurls);
}