Ich lade XML-Dateien mit file_get_contents von der Festplatte, und als Test kann ich eine 156K-Datei mit file_get_contents()
1.000 mal in 3,99 Sekunden laden. Ich habe den Teil, der das Laden durchführt, subklassifiziert und durch einen Memcache-Layer ersetzt, und auf meinem Dev-Computer finde ich, dass ich 1000 Ladevorgänge desselben Dokuments in 4,54 Sekunden ausführen kann.
Ich schätze, dass file_get_contents () etwas Caching durchführt, aber es sieht so aus, als wäre es tatsächlich schneller als eine bekannte Caching-Technik. Ist auf einem einzelnen Server die Leistung von file_get_contents()
so gut wie möglich?
Ich bin auf PHP 5.2.17 über Macports, OS X 10.6.8.
Bearbeiten: Ich habe auf XML-Dokumenten dieser Größe gefunden, es gibt einen kleinen Vorteil bei der Verwendung der MEMCACHE_COMPRESSED
-Flagge. 1.500 Ladungen via Memcache werden in 6,44 Sekunden (mit Kompression) anstatt 6,74 (ohne) durchgeführt. Beide sind jedoch langsamer als file_get_contents
, was die gleiche Anzahl an Ladevorgängen in 5,71 Sekunden ergibt.
Weil file_get_contents mmap
s die Datei ist und Sie nur ein paar Dateisystemaufrufe haben, wird dies im Dateisystem-Cache landen. Bei memcache werden Out-of-Process-Aufrufe an memcached (und bei einer Clusterimplementierung außerhalb des Servers) ausgeführt.
Die Leistung von file_get_contents()
hängt entscheidend vom Typ des Dateisystems ab, zum Beispiel wird eine Datei in einem NFS-Dateisystem nicht gemappt und dieser Zugriff kann viel langsamer sein. Auch auf einem Mehrbenutzerserver kann der Dateisystemcache durch andere Prozesse schnell geleert werden, während der Memcached-Cache fast sicher im Speicher ist.
file_get_contents ist der einfachste Weg, eine Datei abzurufen. Das zugrundeliegende Betriebssystem (insbesondere Linux) verfügt bereits über effiziente Caching-Mechanismen. Alles andere, was du tust, erzeugt nur Overhead und verlangsamt die Dinge.
Memcache würde Sinn machen, wenn Sie diese Dateien von einem entfernten Ort geladen haben.
Edit: Es ist nicht unbedingt wahr, dass file_get_contents der einfachste Weg ist. fopen / fget könnte noch schneller sein - ich weiß es nicht. Aber die Unterschiede sollten im Vergleich zur Komplexität einer Caching-Schicht gering sein.
Das Speichern von XML-Dateien im Memcache macht für mich wenig Sinn.
Ich würde lieber geparste Werte speichern und mir sowohl das Lesen als auch das Parsen ersparen.
Tags und Links php file-io memcached php-internals