Frage

Ich arbeite jetzt auf einer Website, die Benutzer zu holen haben Feeds. Aber wie kann ich das Abrufen am besten optimieren, wenn ich eine Datenbank mit haben, sagen wir mal, 300-Feeds. Ich werde einen cron-Job, zu dem das Feeds abruft einzurichten, sollte aber ich mache es wie 5 jede Sekunde Minute oder so etwas?

Alle Ideen, wie dies der beste Weg in PHP zu tun?

War es hilfreich?

Lösung

Auf der Grundlage der neuen Informationen glaube ich so etwas tun würde:

Lassen Sie die „erste“ Client die updatework und speichern Zeitstempel mit ihm einzuleiten. Everey andere Clients, die für die Information bekommen, kassiert Informationen bis diese Informationen sind zu alt fragen. Nächster Treffer von einem Client wird dann die cashe aktualisieren, die dann von allen Kunden bis zum nächsten Mal zu alt its verwendet werden.

Der Client, der tatsächlich initiieren die updatework werden sollte nicht dafür finnisch warten, nur die alte Version kassiert serv und auch weiterhin tun, bis die Arbeit getan ist.

So aktualisieren Sie müssen nicht auf alles , wenn keine Kunden es fordern.

Andere Tipps

Wenn ich verstehe, Sie hinterfragen, arbeiten Sie grundsätzlich auf einem Feed Agregator Site?

können Sie die folgenden Schritte aus; starten, indem Sie alle 1 hor (zum Beispiel) zu aktualisieren. Wenn Sie anough Einträge aus einigen Feed haben - Berechnung der durchschnittlichen Abstand zwischen den Einträgen. Verwenden Sie dann dieses Intervall als Intervall für dieses Futter zu holen.

Zum Beispiel, wenn die Site veröffentlicht 7 Artikel in den letzten 7 Tagen - Sie Feeds von ihm jeden 24 Stunden (1 Tag) abrufen können.

Ich benutze diesen Algorithmus mit einigen Änderungen, wenn ich dieses durchschnittliche Intervall berechne ich es teilen, indem er 2 (freilich nicht zu selten zu holen). Wenn das Ergebnis weniger als 60 Minuten - stelle ich das Intervall bis 1h oder es ist größer als 24 Ich habe es bis 24h.

Zum Beispiel, so etwas wie folgt aus:

    public function updateRefreshInterval() {
            $sql = 'select count(*) _count ' .
                    'from article ' .
                    'where created>adddate(now(), interval -7 day) and feed_id = ' . (int) $this->getId();
            $array = Db::loadArray( $sql );

            $count = $array[ '_count' ];

            $interval = 7 * 24 * 60 * 60 / ( $count + 1 );
            $interval = $interval / 2;
            if( $interval < self::MIN_REFRESH_INTERVAL ) {
                    $interval = self::MIN_REFRESH_INTERVAL;
            }
            if( $interval > self::MAX_REFRESH_INTERVAL ) {
                    $interval = self::MAX_REFRESH_INTERVAL;
            }

            Db::execute( 'update feed set refresh_interval = ' . $interval . ' where id = ' . (int) $this->getId() );
    }

Die Tabelle ist ‚Futtermittel‘, ‚aufgefrischt‘ wird die timestampt wenn der Vorschub letztes Mal aufgefrischt und ‚refresh_interval‘ wurde, wird das gewünschte Zeitintervall zwischen zwei Abrufe aus dem gleichen Futter.

Das Beste, was zu tun ist ‚nett‘ und nicht überlasten die Feeds mit vielen unnötigen Anfragen zu sein. Ich ließ mich auf einer 1-stündigen Aktualisierungszeit für eine meiner Webapps, die etwa 150 Blogs für Updates überwacht. Ich speichere die Zeit, die sie zuletzt in der Datenbank überprüft wurden und verwendet, um zu entscheiden, wann sie zu aktualisieren. Die Feeds wurden zufällig mal hinzugefügt, so dass sie nicht alle zur gleichen Zeit aktualisiert werden.

Ich schrieb PFETCH dies für mich zu tun. Es ist klein, hat aber ein paar wirklich wichtige Aspekte:

  1. Es ist in verdrehten geschrieben und kann massive Parallelität selbst behandeln, wenn das Netzwerk langsam ist.
  2. Es erfordert kein cron Gerangel oder nichts.

Ich schrieb es eigentlich, weil meine cron-basierte Fetcher ein Problem wurden immer. Jetzt habe ich es konfiguriert einige zufällige Sachen möchte ich um das Internet zu holen und dann Skripte ausgeführt wird, wenn die Dinge ändern Teile meiner eigenen Website zu aktualisieren.

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