2010-11-25 1 views
9

나는 PHP/FQL을 사용하여 모든 친구의 연결을 선택하려고합니다. 내 UID (540 명의 친구)를 사용합니다. 이는 12,000 개 이상의 연결을 의미하며, 그 중 6500 개 이상은 고유합니다. 따라서이 코드 이 모든 연결을 반환해야하지만, Facebook은 분명히 FQL 쿼리에 4999/5000 행 제한을 가지고 있습니다.페이스 북의 상호 친구 및 FQL 4999/5000 레코드 한도

// select mutual unique friends 
$unique_connections = $facebook->api_client->fql_query(" 

    SELECT uid1, uid2 FROM friend 
    WHERE uid1 IN 
    (SELECT uid2 FROM friend WHERE uid1=$uid) 
    AND uid2 IN 
    (SELECT uid2 FROM friend WHERE uid1=$uid) 
"); 

나는 원래 코드는 내 친구 목록을 통해 루프를 작성하기 때문에 위의 번호를 알고 그들 각각에 대해 getMutualFriend 쿼리를 보냅니다.

foreach ($friends as $key) 
{ 
    $mutual_friends = $facebook->api_client->friends_getMutualFriends($key); 
    foreach ($mutual_friends as $f_uid) 
    { 
     array_push($all_connections, array($key,$f_uid)); 
    } 
} 

물론이 스크립트를 실행하는 데는 약 3 분이 걸리지 만 FQL 쿼리는 5 초 내에 반환됩니다. 이 답변을 검색 한 후 나는 결론을 내 렸습니다.이 문제를 해결할 수있는 유일한 방법은 두 가지 방법을 혼합하여 사용하는 것입니다. 글쎄, 여기에 게시하십시오. 이 스크립트를 작성하고 4999/5000 행 한계를 능가하는 더 좋은 방법에 대한 아이디어가 있습니까?

위와 동일하게 수행해야하는 fql_multiquery가 있습니다. 또한 4999/5000으로 제한됩니다.

$queries = '{ 
"user_friends":"SELECT uid2 FROM friend WHERE uid1 = '.$uid.'", 
"mutual_friends":"SELECT uid1, uid2 FROM friend WHERE uid1 IN (SELECT uid2 FROM #user_friends) AND uid2 IN (SELECT uid2 FROM #user_friends)" 
}'; 

$mq_test = $facebook->api_client->fql_multiquery(trim($queries)); 
print_r($mq_test); 
+0

친구 또는 친구의 친구가 필요합니까? 모든 친구들을위한 독창적 인 친구의 수는 아마도 FB API에서 끌어낼 수있는 가장 무의미한 통계 일 것입니다. Facebook의 API는 로그인 한 사용자의 친구 만 조회 할 수 있으므로 친구의 친구를 가질 수 없습니다. – Matt

+0

나는 상호적인 친구를 의미했다. 나는 그것을 제목에서 바로 잡을 것입니다. 무의미 ​​함은 당신의 관점에 달려 있습니다. 나는 데이터를 내보내는 사람들을위한 앱을 만들었고, 아마도 시각화를 위해 상호 친구를 사귀는 것은 지금까지 가장 많이 요청 된 기능이다. – ow3n

+0

그래프 API에서 배치 요청과'mutualfriends' 연결을 사용하여이를 달성 할 수 있어야합니다. https://developers.facebook.com/docs/reference/api/batch/ 시간이있을 때 예를 들어 완전한 답을 게시 할 것입니다. –

답변

7

그래서 원래의 질문에 대한 답변을 게시하고 있습니다. 필자는 적절하게 이름 붙여진 array_chunk() PHP 함수를 사용하여 UID의 배열을 청크하고 미니 쿼리를 실행하기 위해 청크를 반복 한 다음 하나의 배열에 모두 다시 추가하여 FQL 쿼리의 5000 행 제한을 우회 할 수있었습니다 . 전체 스크립트는 12,000 개 이상의 행에 대해 평균 14 초이므로 크게 개선됩니다. 여기에 직장에서 응용 프로그램을 볼 수 있습니다 : givememydata.com

아, 그리고 페이 스북 (여전히 문서화되지 않은) FQL 행 제한을 재고해야합니다. 서버에 과세되는 것은 무엇입니까? 5 초 만에 실행되는 단일 쿼리 또는 180 초가 걸리는 500 개의 쿼리? 죄송합니다. 환기를시켜야했습니다. ;-)

+0

나는 같은 보트에있어! total_count 필드에 대한 link_stat 테이블을 쿼리하면 500 개의 결과에서 멈 춥니 다. 나는이 쿼리를 cron으로 갈 것이지만 나는 그들 사이의 가장 작은 간격을 테스트해야한다. – brainondev

1

대안은 fql.multiquery 방법을 사용하고 각 친구에 대한 별도의 FQL 쿼리 (또는 FQL 쿼리 당 친구의 그룹)을 구축,하지만 여전히 같은 요청에서 모든 쿼리를 전송하는 것입니다.

+0

그래서 멀티 쿼리의 합계는 제한되지 않습니까? 이상한 공백 문자 문제를 테스트 한 것처럼 보이지만 멀티 쿼리로 원래의 쿼리를 반복 할 수는 없습니다. – ow3n

+0

좋아요, 나는 멀티 쿼리 코드를 알아 냈지만 그것도 제한적입니다. 나는 그것을 위에 붙여 넣었다. 이견있는 사람? – ow3n

+0

@ ow3n : 다중 쿼리 내의 각 FQL 쿼리는 여전히 제한되어 있지만 쿼리를 더 작은 쿼리로 분할합니다. 따라서 모든 400 명의 친구에 대해 하나의 큰 쿼리를 실행하는 대신 40 명의 친구 대신 각각 10 개의 쿼리를 실행합니다. – Matt

0

FQL은 일반 SQL과 마찬가지로 LIMIT을 지원합니다. 시도해 볼 수 있습니다. http://developers.facebook.com/docs/guides/performance

그렇지 않으면, 그때 크로스 오버를 얻기 위해 가입 자신을 수행하는 SQL 테이블에 그 저장, 각 사용자의 친구 ID를 얻는 것이 좋습니다. 친구 목록을 한 번 가져온 다음 목록을 최신 상태로 유지하기 위해 실시간 업데이트에 가입 할 수 있습니다. http://developers.facebook.com/docs/api/realtime

+0

페이스 북은 0,100 LIMIT 구문을 지원하는지 구체적으로 밝히지는 않았지만 이것이 내가 5K 한도를 초과해야한다고 제안한 것입니다. –

+0

Gotcha. 위의 모든 것에서 LIMIT를 시도했지만 슬프게도 작동하지 않았습니다. – ow3n

1

흥미로운 관찰 : 나는 서로 친구가 모든 사람을 찾을 때 제가 사용자가 다음과 같은 쿼리가

SELECT UID1, 친구로부터 UID2가 WHERE UID1 IN (친구로부터 UID2 SELECT WHERE UID1 = $ uid)

위의 내용에서 알 수 있듯이 AND 절을 제거한 것 외에는 쿼리와 매우 유사합니다.

다음과 같은 오류 메시지가 나타납니다. "208733의 모든 친구를 조회 할 수 없습니다. 로그인 한 사용자 또는 로그인 한 사용자의 앱 사용자 만 조회 할 수 있습니다."

내 생각에 페이스 북은 내가하고 싶지 않은 일을하려고한다는 것을 알기에 충분히 똑똑하다고 생각한다. 그것은 어떻게 든 내 친구의 친구들을 모두 찾으려고하는 동안 친구 인 친구의 친구 만 찾으려한다는 사실을 감지합니다.

0

하나의 트릭은 테이블에서 인덱싱 할 수있는 열 (strpos (column_name, character/number) 사용)을 기반으로 쿼리를 제한하지 않는 것입니다.

예 :

$fql = "SELECT pid,src_big,owner FROM photo WHERE album_object_id IN 
     (SELECT object_id FROM privacy WHERE 
      (object_id IN (SELECT object_id FROM album WHERE owner IN (SELECT uid2 FROM friend WHERE 
        (uid1 = " . $this->nextUser->fbid . " AND **strpos(uid2,2) = 1** )))         
      AND (value = 'FRIENDS_OF_FRIENDS' OR value = 'EVERYONE' ))) ; 

그리고 당신은 10 개 하위 쿼리에서 분할, 아니면 비슷한 쿄코하지만 점점 FB 페이지를하고 있던 33

5
$mutual_friends = $facebook->api('/me/mutualfriends/friendid'); 
+0

그걸 추가해 주셔서 감사합니다. – ow3n

0

의 alphnumeric 필드 수있는이 방법 다중 쿼리로 pummeled했을 때 FB 서버에서 재미있는 캐싱을 수행했습니다. FQL을 배치하면이 문제를 해결할 수 있습니다. 그리고 예, 5K 한도로 달아서 5K 이하로 일괄 처리하고 페이지 매김을 설정해야했습니다. 이는 고통이었습니다.