Ich habe eine Web-App in PHP mit Zend auf einem LAMP-Stack gebaut. Ich habe eine Liste von 4000 Wörtern, die ich in den Speicher laden muss. Die Wörter haben Kategorien und andere Attribute, und ich muss jedes Mal die gesamte Sammlung laden. Denken Sie an ein Wörterbuchobjekt.
Was ist der beste Weg, es für einen schnellen Rückruf zu speichern? Eine flache Datei mit etwas wie XML, JSON oder einem serialisierten Objekt? Ein Datenbankeintrag mit einem großen Stück XML, JSON oder einem serialisierten Objekt? Oder 4000 Datensätze in einer Datenbanktabelle?
Ich weiß, dass verschiedene Serverkonfigurationen einen Unterschied machen, aber nehmen Sie einen out-of-the-box Shared Hosting Plan oder WAMP lokal oder ein anderes einfaches Setup an.
Wenn Sie APC (oder ein ähnliches Programm) verwenden, wird das schnellste Ergebnis wahrscheinlich darin bestehen, die Wortliste direkt in eine PHP-Quelldatei zu codieren und sie dann einfach zu requirieren.
In einem idealen System würde ich Speicher (memcached), Platte und Datenbank sagen. Je nach Konfiguration kann die Datenbank jedoch mehrmals schneller als die Festplatte sein, weil das Ergebnis im Abfrage-Cache bleiben könnte.
Alles hängt von der Umgebung ab; und wenn es so kritisch ist, sollten Sie es messen. Ansonsten platzieren Sie es dort, wo Sie es für leichter zugänglich halten.
Ich würde es in einer Datei ablegen, die zwischengespeichert werden kann, wodurch Sie viele unnötige Datenbankaufrufe bei einem (oder vielleicht sogar jedem?) Laden von Seiten sparen. Wie Sie es speichern, ist nicht wirklich wichtig, was auch immer für Sie am besten funktioniert. Geschwindigkeitswichtig sollten 4000 Wörter überhaupt kein Problem sein.
Für Übersetzungen in Projekten, an denen ich arbeite, verwende ich immer Sprachdateien mit serialisierten php-Daten, die einfach wiederzufinden sind:
%Vor%Formatieren Sie die Liste als PHP-Quelle und schließen Sie sie ein.
Wenn das nicht klappt, fragen Sie sich, ob es wirklich wichtig ist, wie schnell es geladen wird. 4000 Wörter sind nicht so viele.
Wenn Sie ständig alle 4000 im Speicher haben, schlägt das den Zweck der Abfrage einer Datenbank fehl, obwohl ich mich irren könnte. Serialisiertes Objekt klingt einfach genug und ich würde denken, dass es bei dieser Anzahl von Wörtern gut funktionieren würde.
Wenn Sie memcached verwenden können, erstellen Sie das Array einmal mit einer der obigen Methoden, senden es an memcached und verwenden es dann wahrscheinlich am schnellsten. Überprüfen Sie die Antwort von Können Sie ein PHP-Array in Memcache speichern zum Beispiel. Im Grunde würde es so aussehen:
%Vor%und um es zu bekommen:
%Vor%Wenn Sie die Wörterliste trotzdem als XML / JSON serialisieren möchten, verwenden Sie einfach eine Datei. Ich denke, ein natürlicherer Ansatz besteht darin, die Liste in die PHP-Quelle aufzunehmen.
Wenn sich diese Liste ändert, haben Sie mehr Flexibilität mit einer Datenbank.
Wenn Sie nur wissen müssen, welcher schneller ist, gehe ich mit der DB. Neben der Geschwindigkeit ist die Verwendung der DB sicherer und einfacher zu bedienen. Achten Sie jedoch darauf, einen geeigneten Datentyp wie ntext (MS-SQL-Server) oder BLOB (oracle) zu verwenden.
Ich hatte ein ähnliches Problem und habe einen Test dafür gemacht. Hier sind die Timings für 25 000 Loops:
Lesen Sie einen langen Text aus der DB: 9.03s Lies eine Datei: 6.26s Include PHP-Datei wo ist Variable mit dem Text: 12.08s
Vielleicht wäre der schnellste Weg, diese Daten (einmal, nach dem Neustart des Servers) mit einer dieser Optionen zu lesen und eine Datenbank im Speicher zu erstellen (Speicher-Engine: Speicher), aber es kann wenig bis zu kompliziert sein, also würde ich es tun bevorzuge die Option "Aus Datei lesen".
Tags und Links optimization php database file-io performance