팬 페이지의 모든 댓글을 가져와야합니다. 벽뿐만 아니라 앨범, 사진, 메모 등에서도 볼 수 있습니다.팬 페이지의 모든 댓글을 검색하는 방법
그런 식으로이 문제를 해결했습니다. 먼저 팬 페이지의 모든 대상 (앨범, 음표 등)을 가져옵니다. 두 번째로 FQL 다중 쿼리를 사용하여 각 객체에 대한 커밋을 얻습니다.
// Import comment list
$facebook = \Yii::app()->facebook->setUserAccessToken();
$commentsColumns = array(
'xid', 'object_id', 'post_id', 'fromid', 'time', 'text', 'username',
'reply_xid', 'post_fbid', 'app_id', 'likes', 'comments', 'user_likes',
'is_private', 'id',
);
$offset = 0;
$limit = 30;
while (($offset <= count($objectIdList)) && ($offset <= count($postIdList))) {
$currentObjectIdList = array_slice($objectIdList, $offset, $limit);
$currentPostIdList = array_slice($postIdList, $offset, $limit);
$multiQuery = array(
'comments' =>
' SELECT '.implode(', ', $commentsColumns).' '.
' FROM comment '.
' WHERE ((object_id IN ('.implode(',', $currentObjectIdList).')) '.
' OR (post_id IN ('.implode(',', $currentPostIdList).'))) '.
' AND (time >= ' . $lastCommentTime . ') ' .
' ORDER BY time DESC '.
' LIMIT 1000 ',
'users' =>
' SELECT uid, name ' .
' FROM user ' .
' WHERE uid IN (SELECT fromid FROM #comments) ',
'pages' =>
' SELECT page_id, name ' .
' FROM page ' .
' WHERE page_id IN (SELECT fromid FROM #comments) '
);
$multiQueryResult = $facebook->api(array(
'method' => 'fql.multiquery',
'queries' => $multiQuery
));
// Parse multi query results
$from = array();
foreach ($multiQueryResult as $result) {
switch ($result['name']) {
case 'comments':
$commentList = $result['fql_result_set'];
break;
case 'users':
case 'pages':
foreach ($result['fql_result_set'] as $set) {
switch ($result['name']) {
case 'users':
$from[$set['uid']] = $set['name'];
break;
case 'pages':
$from[$set['page_id']] = $set['name'];
break;
}
}
break;
}
}
// Save comments to local DB
foreach ($commentList as $commentData) {
$comment = new Comment();
$comment->fbId = $commentData['id'];
$comment->fbPageId = $this->fbId;
$comment->from = array(
'id' => $commentData['fromid'],
'name' => isset($from[$commentData['fromid']]) ? $from[$commentData['fromid']] : null,
);
$comment->message = $commentData['text'];
$comment->created_time = $commentData['time'];
$comment->likes = $commentData['likes'];
$comment->save();
}
// Next step
$offset = $offset + $limit;
}
이 솔루션은 효과가 있지만 꽤 빠르지는 않습니다. 누구든지 더 나은 해결책을 알고 있습니까?
어떤 사실 상태들 속도가 느려지거나 FQL 다중 쿼리 또는 객체 ID 검색이 느려 집니까? [Batch Requests] (http://developers.facebook.com/docs/reference/api/batch/)를 사용하여 객체 ID를 가져 옵니까? –
개체 ID 검색은 매우 빠릅니다 (일괄 요청 덕분에). 그러나 FQL 쿼리가 너무 느립니다. 아마 그것은 100 개 이상의 대상과 200 개 이상의 게시물에 대해 수행되기 때문일 수 있습니다. – Oleg
당신은 아마, 페이스 북은 천천히 너무 많은 소스에서 데이터를 얻을 필요가 맞습니다. 나는 지옥처럼 느린 단순한 SQL 쿼리를 많이 보았다. 어쩌면 당신은이 작업을 병렬로 실행할 수있는 몇 가지 쿼리를 분할하여 속도를 높일 수 있습니다 ... –