Domanda

Sto cercando di selezionare le connessioni tutti gli amici comuni con PHP / FQL. Usando il mio UID (540 amici), il che significa> 12.000 connessioni, di cui> 6500 sono unici. Quindi, questo codice dovrebbe restituire tutti i collegamenti, ma Facebook ha apparentemente un limite 4999/5000 fila sulla query 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)
 ");

Lo so i numeri di cui sopra, perché il codice originale ho scritto loop attraverso la mia lista di amici e invia una query getMutualFriend per ciascuno di essi.

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

Naturalmente ci vogliono quasi 3 minuti per eseguire lo script, mentre i FQL query è riportata in 5 secondi. Dopo un'ora di ricerca di questa risposta sono giunto alla conclusione l'unico modo per aggirare il problema è quello di utilizzare una miscela dei due metodi. Bene che, e post qui. Tutte le idee su un modo migliore per scrivere questo script e battere il limite 4999/5000 fila?

Ecco un fql_multiquery che dovrebbe fare lo stesso come sopra. E 'anche limitato a 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);
È stato utile?

Soluzione

Quindi, sto pubblicando la risposta alla mia domanda iniziale. Sono stato in grado di aggirare il limite 5000 riga su query FQL dal chunking matrice di UID (usando l'array_chunk appropriatamente denominata () funzione PHP) e scorrendo i pezzi per eseguire mini-query, e poi aggiungendo tutto indietro in un array . Le medie di script interi 14 secondi per più di 12.000 righe in modo che è un enorme miglioramento. È possibile vedere l'applicazione al lavoro qui: givememydata.com

Oh, e Facebook dovrebbe riconsiderare il loro limite di riga (ancora non documentato) FQL. Ciò che è più tassazione sui loro server? Una singola query che esegue in 5 secondi o 500 query che richiedono 180 secondi? Siamo spiacenti, ha dovuto sfogare. ; -)

Altri suggerimenti

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

Un'alternativa sarebbe quella di utilizzare il href="http://developers.facebook.com/docs/reference/rest/fql.multiquery" rel="nofollow"> fql.multiquery metodo

Un interessante osservazione: Quando cerco di trovare tutte le persone che hanno amici comuni mi utente Ho la seguente query

SELEZIONARE uid1, uid2 FROM WHERE amico uid1 IN (SELECT uid2 FROM WHERE amico uid1 = $ uid)

Come si può vedere è molto simile alla tua richiesta, se non che ho rimosso la clausola AND.

ottengo il seguente messaggio di errore: "Non può cercare tutti gli amici del 208733. può solo ricerca per l'utente collegato o l'accesso Amici degli utenti che sono gli utenti della tua app"

Credo che facebook è abbastanza intelligente per capire che sto cercando di fare qualcosa che non vuole che io faccia. Rileva in qualche modo il fatto che si sta tentando di trovare gli amici di solo una tua amica che sono anche i vostri amici, mentre io sto cercando di trovare tutti gli amici del mio amico.

FQL supporta un limite, proprio come SQL normale. Si può provare che. http://developers.facebook.com/docs/guides/performance

In caso contrario, vi suggerisco di ottenere gli ID amico per ogni utente, la memorizzazione di quelli in una tabella SQL, quindi di eseguire il proprio unirsi per ottenere il crossover. Si può essere in grado di ottenere solo le liste amici una volta e poi sottoscrivere aggiornamenti in tempo reale per mantenere i vostri elenchi aggiornati. http://developers.facebook.com/docs/api/realtime

Un trucco sembra che io ero in grado di utilizzare è quello di limitare il no di query in base a una delle colonne indicizzabili dalle tabelle (usando strpos (nome_colonna, carattere / numero)).

es:

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

E in questo modo è possibile dividere in 10 sottointerrogazioni, o per un campo alphnumeric nel 33.

I stava facendo una simile cosa: ma ottenere pagina fb posts- e corse in divertenti caching sui server FB quando ho pummeled con multiqueries - il dosaggio FQL è un modo per aggirare il problema, btw. E sì, corse in limite di 5K e poco raggruppati sotto 5k e ha dovuto istituire impaginazione, che era una seccatura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top