Pregunta

Estoy tratando de seleccionar las conexiones de todos los amigos mutuos con PHP / FQL. Usando mi UID (540 amigos), lo que significa> 12.000 conexiones, de las cuales> 6500 son únicos. Lo que este código debe devolver todas las conexiones, pero al parecer, Facebook tiene un límite 4999/5000 fila en consultas 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)
 ");

Yo sé los números anteriores porque el código original que escribió bucles a través de mi lista de amigos y envía una consulta getMutualFriend para cada uno de ellos.

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

Por supuesto que tarda casi 3 minutos para ejecutar el guión, mientras que los FQL devuelve la consulta en 5 segundos. Después de una hora de la búsqueda de esta respuesta que he llegado a la conclusión de la única manera de evitar esto es usar una mezcla de los dos métodos. Pues eso, y puesto aquí. Cualquier idea en una mejor manera de escribir este guión y golpearon el límite 4999/5000 fila?

Aquí hay un fql_multiquery que debería hacer lo mismo que el anterior. También se limita 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);
¿Fue útil?

Solución

Así, Quiero poner la respuesta a mi pregunta original. Yo era capaz de eludir el límite de 5.000 fila en consultas FQL por fragmentar la matriz de UID (utilizando el array_chunk el nombre apropiado () de PHP) y el bucle a través de los trozos de ejecutar mini-consultas, y luego añadiendo todo de nuevo en una matriz . Los promedios de guiones enteros 14 segundos para más de 12.000 filas por lo que es una gran mejora. Se puede ver la aplicación en el trabajo aquí: givememydata.com

Ah, y Facebook debería reconsiderar su límite de filas (todavía sin documentar) FQL. Lo que es más exigente en sus servidores? Una única consulta que se ejecuta en 5 segundos o 500 consultas que tardan 180 segundos? Lo sentimos, tuvo que ventilar. ; -)

Otros consejos

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

Una alternativa sería utilizar el href="http://developers.facebook.com/docs/reference/rest/fql.multiquery" rel="nofollow"> fql.multiquery método , y construir una consulta separada para cada FQL amigo (o un grupo de amigos por consulta FQL), pero aún así el envío de todas las consultas en la misma petición.

Una observación interesante: Cuando trato de encontrar todas las personas que tienen amigos en común me usuario la siguiente consulta

SELECT uid1, uid2 DE DONDE amigo uid1 IN (SELECT uid2 DE DONDE amigo uid1 = $ uid)

Como se puede ver que es muy similar a la consulta, excepto que me quita la cláusula AND.

Me sale el siguiente mensaje de error: "= No puedo encontrar todos los amigos de 208733. Sólo puede búsqueda para el usuario conectado o conectado Amigos de usuario que son usuarios de su aplicación"

Creo que facebook es lo suficientemente inteligente como para saber que estoy tratando de hacer algo que no quiere que haga. De alguna manera se detecta el hecho de que usted está tratando de encontrar sólo amigos de tus amigos que también son sus amigos, mientras que yo estoy tratando de encontrar a todos los amigos de mi amigo.

FQL apoya un límite, al igual que SQL normal. Usted puede tratar de eso. http://developers.facebook.com/docs/guides/performance

Por lo demás, recomiendo coger los identificadores de amigo para cada usuario, almacenando los de una tabla de SQL, a continuación, realizar su propio unen para conseguir el cruce. Es posible que pueda obtener sólo las listas de amigos una vez y luego suscribirse a actualizaciones en tiempo real para mantener sus listas al día. http://developers.facebook.com/docs/api/realtime

Un truco que parece que era capaz de uso es limitar el nº de consultas sobre la base de una de las columnas de las tablas de corte reversibles (utilizando strpos (nombre_columna, carácter / número)).

por ejemplo:

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

Y de esta manera se puede dividir en 10 subconsultas, o para un campo alphnumeric en 33.

Me estaba haciendo un posts- página de FB cosa- pero conseguir similar y se topó con el almacenamiento en caché divertida en los servidores de FB cuando la castigó con multiqueries - Preparación de lotes FQL es una manera de evitar esto, por cierto. Y sí, se topó con el límite de 5K y justo en lotes bajo 5k y tuvo que configurar la paginación, que era un fastidio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top