Wie kann ich meinen FQL optimieren, um Facebook Timeouts zu vermeiden?

8

Nehmen wir eine einfache FQL -Abfrage, um alle Links zu erhalten, die die Freunde eines Benutzers seit gestern geteilt haben, zum Beispiel:

%Vor%

Wenn ein Benutzer 50 Freunde hat, wird dies perfekt ausgeführt. Aber wenn ein Benutzer Hunderte von Freunden hat, gibt Facebook oft einen Fehler zurück.

Optionen:

  1. Begrenzen Sie die Auswahl der Freundauswahl auf 50 - Sicher, das wird funktionieren, aber es werden immer dieselben Freunde angezeigt. Es sei denn, Sie möchten einen Nur für Ivy League -Feed, das ist nicht sehr hilfreich.
  2. Batch-Abfragen - Erstellen Sie einen Batch von Abfragen mit Offsets und begrenzen Sie jeden auf 50. Leider gibt es auch hier keine Verbesserung.
  3. Loop It - Bisher ist dies das Beste, was ich gefunden habe. Wiederholen Sie die gleichen Abfragen, die Sie für eine Stapelabfrage erstellt haben, aber nacheinander mit mehreren API-Abfragen. Aber selbst das ist ein Hit und Miss.

Wie kann ich Facebook entsprechend abfragen, um erfolgreiche Ergebnisse zu gewährleisten?

Hinweise:

  • Ich benutze das neueste Facebook php sdk, 3.1.1
  • Ich habe auch versucht, die Standardoptionen für Curl Timeouts in der base_facebook.php
  • zu erweitern

Häufige Fehler im Zusammenhang mit Timeout:

1.

%Vor%

Zeile 708 ist ein Ausnahmefehler:

%Vor% %Vor%

2.

%Vor%     
Ryan 30.08.2011, 19:20
quelle

3 Antworten

2

Sie sollten mit Limit / Offset durchgehen, wie Sie sagten, oder die Freundesliste im Cache speichern, wie es von puffpio vorgeschlagen wurde.

Sie haben gesagt, dass es immer noch nicht zuverlässig funktioniert - weil einige Benutzer viele, viele Links haben, während andere nicht so viele haben. Beachten Sie auch, dass Sie möglicherweise nicht zwischengespeicherte Daten für einige Benutzer abrufen. Ich würde empfehlen, eine einzige Wiederholung in der Schleife für fehlgeschlagene Abfragen zu haben - es ist oft der Fall, dass die erste Zeit überschritten wird und die zweite aufgrund neu zwischengespeicherter Daten erfolgreich ist.

Schließlich eröffne ich für die Nachwelt eine Aufgabe, um die Verknüpfungstabelle zu optimieren, um effizienter zu sein, wenn sie nach Zeit gefiltert wird.

    
Drew Hoskins 30.08.2011, 20:35
quelle
1

Einige db-Engines optimieren das IN -Schlüsselwort nicht oder nicht. Sie können die in-Klausel für jede einzelne resultierende Zeile Ihrer Abfrage ausführen. Können Sie den Link- und Friend-Tabellen beitreten, anstatt ein IN mit einer Unterabfrage zu verwenden?

Sie finden dieser Artikel interessant. (Erläutert Probleme mit der Leistung der IN-Klausel auf MySQL und Facebook führt MySQL am Backend aus.)

    
Paul Sasik 30.08.2011 19:29
quelle
1

Es wäre besser, die Freunde des Benutzers zu cachen und nur gelegentlich zu aktualisieren. Mit anderen Worten, führen Sie diese Abfrage

aus %Vor%

Speichern Sie die Liste der Benutzer und führen Sie

aus %Vor%

Auf diese Weise führen Sie die innere Abfrage nicht ständig aus. In Wirklichkeit hat die Freundesliste eines Benutzers keine hohe Abwandlungsrate, so dass Sie sie nicht so oft aktualisieren müssen wie die Freigabe-Links.

Zusätzlich können Sie auf diese Weise die zweite Abfrage in mehrere Abfragen mit verschiedenen Gruppen von Eigentümern aufteilen und dann fql.multiquery verwenden, um alle gleichzeitig abzurufen

    
puffpio 30.08.2011 20:26
quelle

Tags und Links