Frage

Ich versuche, alle gegenseitigen Freunde Verbindungen mit PHP / FQL auszuwählen. Mit meiner UID (540 Freunde), die Mittel> 12.000 Verbindungen, von denen> 6500 einzigartig sind. Also dieser Code sollte Liefert alle Verbindungen, aber Facebook hat offenbar eine Reihe 4999/5000 Begrenzung FQL Abfragen.

// 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)
 ");

Ich kenne die Zahlen oben, da der ursprüngliche Code, den ich schrieb Schleifen durch meine Freundesliste und sendet eine getMutualFriend Abfrage für jeden von ihnen.

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)); 
    }
}

Natürlich ist es fast 3 Minuten dauert das Skript ausgeführt werden, während der FQL Abfrage kehrt in 5 Sekunden. Nach einer Stunde für diese Antwort zu suchen, ich habe die einzige Möglichkeit, zu dem Schluss gekommen, dies zu umgehen ist eine Mischung aus den beiden Methoden zu verwenden. Nun, das, und hier posten. Irgendwelche Ideen auf einem besseren Weg, um dieses Skript zu schreiben und schlagen das 4999/5000 Zeilenlimit?

Hier ist ein fql_multiquery, die die gleichen wie oben tun sollen. Es ist auch beschränkt auf 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);
War es hilfreich?

Lösung

Also, ich bin Entsendung die Antwort auf meine ursprüngliche Frage. Ich konnte die 5000 Zeilenlimits auf FQL Abfragen umgehen, indem das Array von UIDs Chunking (unter Verwendung des entsprechend benannten array_chunk () PHP-Funktion) und Looping durch die Stücke Mini-Abfragen auszuführen, und Anfügen dann alles wieder in ein Array . Die gesamte Skript mittelt 14 Sekunden für mehr als 12.000 Zeilen, so dass eine große Verbesserung ist. Sie können die Anwendung bei der Arbeit sehen hier: givememydata.com

Oh, und Facebook sollte ihr (noch nicht erfaßt) FQL Zeilenlimit überdenken. Was ist auf ihren Servern mehr zu besteuern? Eine einzelne Abfrage, die ausgeführt wird in 5 Sekunden oder 500 Abfragen, die 180 Sekunden dauern? Leider hatte zu entlüften. ; -)

Andere Tipps

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

Eine Alternative wäre die Methode fql.multiquery zu verwenden, und baut eine separate FQL Abfrage für jeden Freund (oder eine Gruppe von Freunden pro FQL Abfrage), aber immer noch alle Anfragen in der gleichen Anfrage senden.

Eine interessante Beobachtung: Wenn ich versuche, alle die Leute zu finden, die die folgende Abfrage

gemeinsame Freunde ich mich Benutzer

SELECT UID1, UID2 FROM Freund WHERE UID1 IN (SELECT UID2 FROM Freund WHERE UID1 = $ uid)

Wie Sie sehen können, ist es sehr ähnlich wie Ihre Abfrage, mit der Ausnahme, dass ich entfernte die AND-Klausel.

ich folgende Fehlermeldung:. „Es können nicht alle Freunde von 208733. Lookup kann nur Lookup für den angemeldeten Benutzer oder der in Benutzer-Freunde angemeldet, die Nutzer Ihrer App sind“

Ich denke, Facebook ist intelligent genug, um herauszufinden, dass ich versuche, etwas zu tun, dass sie wollen, dass ich nicht zu tun. Es erkennt irgendwie die Tatsache, dass Sie versuchen, nur Freunde Ihres Freundes zu finden, der auch deine Freunde sind, während ich all meine Freundin, Freunde finden versuchen.

unterstützt FQL eine LIMIT, wie normale SQL. Sie können versuchen, dass. http://developers.facebook.com/docs/guides/performance

Ansonsten empfehle ich immer den Freund-IDs für jeden Benutzer, die in einer SQL-Tabelle zu speichern, dann Ihre eigene Durchführung kommt die Crossover zu bekommen. Sie können in der Lage sein, nur die Freundeslisten einmal und dann auf Neuigkeiten in Echtzeit abonnieren Ihre Listen auf dem Laufenden zu halten. http://developers.facebook.com/docs/api/realtime

Ein Trick, es mir verwenden konnte scheint, ist die Anzahl der Abfragen auf einen der Wende Spalten von Tabellen (mit strpos (column_name, Zeichen / Zahl)) auf der Basis zu begrenzen.

ex:

$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'  ) )) ;

Und wie Sie es in 10 Unterabfragen aufgeteilt, oder für ein alphnumeric Feld in 33.

ich tat einen ähnlichen Ding aber immer fb Seite posts- und läuft in lustigen Caching auf dem FB-Server, wenn ich es mit Multiqueries verprügelt - Dosieren FQL ist ein Weg, dies zu umgehen, btw. Und ja, läuft in die 5K Grenze und knapp 5k chargiert und hatte Paginierung einzurichten, was ein Schmerz war.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top