2010-02-24 22 views
15

tengo un sistema de almacenamiento en caché de archivos para una biblioteca php 5 que uso a menudo. cuando se realiza la solicitud, compruebo si hay un archivo almacenado en la memoria caché, si hay alguno, lo renderizo y salgo.¿File_get_contents es más lento que include?

$contents = file_get_contents(self::_cacheFile()); 
echo $contents; 
exit();  

tengo que hacer file_get_contents en lugar de incluir sólo a causa de archivos XML almacenados en caché con el molesto

`<?xml version="1.0"?>` 

hay una mejor manera de tirar en mis archivos de caché sin shorttags disparar?

+2

Y entonces la gente dice que no hay problema con las etiquetas cortas ... –

+0

Sí, odio los shortags, parece demasiado fácil desencadenar php por accidente como th e arriba ejemplo. –

+0

Esto grita para el almacenamiento binario. ¿Qué tal comprimir los archivos para almacenarlos y descomprimirlos en la memoria? O, si está almacenando en caché toda la respuesta, enviando la copia comprimida? Eso evitaría las etiquetas cortas. Personalmente, apago etiquetas cortas cada vez que llego a php.ini. – TheJacobTaylor

Respuesta

10

Si todo lo que desea hacer es generar el contenido del archivo, debe usar readfile(). Esto es más rápido y menos memoria que la file_get_contents()

31

Dado que include evaluará el contenido de los archivos, p. ejecutar a través del intérprete de PHP y también utilizar el include_path para buscar archivos, yo diría que include es más lento. file_get_contents simplemente tratará el contenido de un archivo como una cadena. Menos sobrecarga, más velocidad.

Desde el manual page:

file_get_contents() es la forma preferida para leer el contenido de un archivo en una cadena. Utilizará técnicas de mapeo de memoria si es compatible con su sistema operativo para mejorar el rendimiento.

Sin embargo, si usted está después de la salida del archivo, en vez de conseguir en una cadena, readfile() es incluso un poquito más rápido que file_get_contents. Teniendo en cuenta que include 'producirá también cualquier contenido que no sea PHP, probablemente sea más probable lo que está buscando.

referencia revisado en mi máquina de escritorio:

$start1 = microtime(1); 
for($i=0; $i<100000; $i++) { 
    include 'log.txt'; 
} 
$end1 = microtime(1) - $start1; 

y

$start2 = microtime(1); 
for($i=0; $i<100000; $i++) { 
    echo file_get_contents('log.txt'); 
} 
$end2 = microtime(1) - $start2; 

y

$start3 = microtime(1); 
for($i=0; $i<100000; $i++) { 
    readfile('log.txt'); 
} 
$end3 = microtime(1) - $start3; 

Resultado

echo PHP_EOL, $end1, // 137.577358961 
    PHP_EOL, $end2, // 136.229552984 
    PHP_EOL, $end3; // 136.849179029 
11

file_get_contents y include no hace lo mismo:

  • file_get_contents lee el contenido de un archivo y lo devuelve como una cadena
  • include se ejecutará el contenido del archivo.

Acerca de la velocidad, sin una caché de código de operación, supongo file_get_contents teóricamente debería ser más rápido, como lo hace menos cálculo (sin compilación/ejecución del código).

Aún así, lo que más importa es probablemente lo que estás tratando de hacer: si solo quieres leer un archivo, debes usar file_get_contents.

+0

Pero marginalmente, ya que no hay código en los archivos ... –

10

Nada mejor que un punto de referencia (bien hecho) (que es más difícil de lo que parece, podría estar pasando por alto algo). Sin embargo, como ambos se hacen en las mismas condiciones, deberían servir como un bastón de medir.

test.txt es un 12KB, 876 líneas de archivo de texto:

[email protected]:~$ ls -la test.txt ; wc -l test.txt 
-rw-r--r-- 1 vinko vinko 12264 2010-02-24 19:08 test.txt 
876 test.txt 

file_get_contents.php:

[email protected]:~$ more file_get_contents.php 
<?php 
echo file_get_contents("test.txt"); 
?> 

include.php

[email protected]:~$ more include.php 
<?php 
include("test.txt"); 
?> 

readfile.php

[email protected]:~$ more readfile.php 
<?php 
readfile("test.txt"); 
?> 

Por lo tanto, nos vez que la ejecución de 10 mil iteraciones de cada uno:

[email protected]:~$ time for i in `seq 10000`; do php file_get_contents.php >/dev/null; done 

real 3m57.895s 
user 2m35.380s 
sys  1m15.080s 

[email protected]:~$ time for i in `seq 10000`; do php include.php >/dev/null; done 

real 3m57.919s 
user 2m37.040s 
sys  1m16.780s 

[email protected]:~$ time for i in `seq 10000`; do php readfile.php >/dev/null; done 
real 3m57.620s 
user 2m38.400s 
sys  1m14.100s 

Conclusión: Los tres son prácticamente equivalentes a 12 kB archivos de texto en PHP 5.2.4 con Suhosin Patch.

+1

que debería ser 'echo $ contents;' sin '()'. También 'readfile' escribe en el búfer de salida directamente y devuelve un entero, por lo que no es necesario repetirlo. Simplemente llame a 'readfile'. No necesita las llamadas 'exit' tampoco. – Gordon

+0

@Gordon: Gracias, cambié los scripts y volví a probar. Aún más igual :) –

1

file_get_contents será la manera más rápida para recuperar el archivo almacenado en caché por un par de razones:

  1. Se realiza ningún procesamiento de los datos que carga (código de análisis de PHP, manejo de los saltos de línea, etc.)
  2. Utiliza técnicas optimizadas para cargar los archivos lo más rápido posible (archivos de memoria mapeados para uno).
5

gracias por la punta, para aquellos que son curiosos

readfile(); 
<!-- dynamic page rendered in 0.133193016052 seconds.--> 
<!-- static page rendered in 0.00292587280273 seconds.--> 

vs

file_get_contents(); 
<!-- dynamic page rendered in 0.133193016052 seconds.--> 
<!-- static page rendered in 0.00303602218628 seconds.--> 

vs

include(); 
<!-- dynamic page rendered in 0.133193016052 seconds.--> 
<!-- static page rendered in 0.00348496437073 seconds.--> 
+5

Una sola ejecución no es suficiente para un punto de referencia, tiene que iterar mucho –

+1

10% más de tiempo de respuesta para la página estática. Ahora, ¿qué sucede cuando enciendes un caché de código de operación? +1 para la investigación. – TheJacobTaylor

Cuestiones relacionadas