Question

Je suis en train de sélectionner les connexions de tous les amis communs avec PHP / EAF. En utilisant mon UID (540 amis), ce qui signifie> 12.000 connexions, dont> 6500 sont uniques. Donc, ce code devrait retourner toutes les connexions, mais Facebook a apparemment une limite 4999/5000 de la ligne sur les requêtes FQL.

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

Je sais que les chiffres ci-dessus parce que le code original j'ai écrit des boucles dans ma liste d'amis et envoie une requête getMutualFriend pour chacun d'eux.

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

Bien sûr, il faut près de 3 minutes pour exécuter ce script, alors que les rendements de la requête FQL en 5 secondes. Après une heure de recherche de cette réponse que je suis venu à la conclusion la seule façon de se déplacer est d'utiliser un mélange des deux méthodes. Bien que, et poster ici. Toutes les idées sur une meilleure façon d'écrire ce script et battre la limite de la ligne 4999/5000?

Voici un fql_multiquery qui devrait faire la même chose que ci-dessus. Il est également limité à 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);
Était-ce utile?

La solution

Alors, je poste la réponse à ma question initiale. Je suis en mesure de contourner la limite de 5000 ligne sur les requêtes FQL par Chunking le tableau de UIDs (en utilisant la array_chunk () fonction PHP correctement nommé) et une boucle à travers les morceaux pour exécuter mini-requêtes, puis annexant tout nouveau dans une matrice . Les moyennes entières de script 14 secondes pour plus de 12 000 lignes de manière à c'est une énorme amélioration. Vous pouvez voir l'application à l'œuvre: givememydata.com

Oh, et Facebook devrait reconsidérer leur (encore non documentée) FQL limite de la ligne. Ce qui est plus lourd sur leurs serveurs? Une seule requête qui exécute en 5 secondes ou 500 requêtes qui prennent 180 secondes? Désolé, dû évacuer. ; -)

Autres conseils

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

Une alternative serait d'utiliser la méthode fql.multiquery , et de construire une requête séparée FQL pour chaque ami (ou un groupe d'amis par requête FQL), mais toujours envoyer toutes les requêtes dans la même requête.

Une observation intéressante: Lorsque je tente de trouver toutes les personnes qui ont des amis communs me utilisateur I la requête suivante

SELECT UID1, UID2 DE UID1 OU EN ami (SELECT UID2 d'un ami OU UID1 = uid $)

Comme vous pouvez le voir est très similaire à votre requête, sauf que j'ai supprimé la clause AND.

Je reçois le message d'erreur suivant:. « Impossible de rechercher tous les amis de 208733. Can ne recherche pour l'utilisateur connecté ou connecté les amis de l'utilisateur qui sont les utilisateurs de votre application »

Je suppose que facebook est assez intelligent pour comprendre que je suis en train de faire quelque chose qu'il ne veut pas que je fasse. Il détecte en quelque sorte le fait que vous essayez de trouver les amis de vos amis seulement qui sont aussi vos amis, alors que je suis en train de trouver tous les amis de mon ami.

FQL prend en charge une limite, comme SQL régulière. Vous pouvez essayer. http://developers.facebook.com/docs/guides/performance

Sinon, je vous conseille de prendre les ID d'ami pour chaque utilisateur, le stockage dans les une table SQL, puis effectuer votre propre rejoindre pour obtenir le crossover. Vous pourrez peut-être obtenir juste les listes d'amis une fois, puis abonnez-vous à des mises à jour en temps réel pour garder vos listes à jour. http://developers.facebook.com/docs/api/realtime

Une astuce il semble que je suis en mesure d'utiliser est de limiter le non de requêtes basées sur l'une des colonnes de vos tables indexables (en utilisant strpos (nom_colonne, caractère / nombre)).

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

Et cette façon, vous pouvez le diviser en 10 sous-requêtes, ou pour un champ dans alphnumeric 33.

Je faisais un même chose- mais se posts- et RAN fb page en cache drôle sur les serveurs FB quand je matraqué avec multiqueries - Batching FQL est un moyen de contourner ce problème, btw. Et oui, dans la limite RAN 5 km et juste sous 5k et dosé a dû mettre en place Pagination, ce qui était pénible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top