2011-10-25 12 views
10

Es muy común usar los archivos include. Creo que se usa en exceso para mantener los códigos ordenados sin considerar el rendimiento. Para varios include s, el disco debe leer los archivos, y como usamos extremadamente el disco, puede ser un proceso lento. Sin embargo, este no es el proceso lento principal o el proceso de limitación de velocidad, ya que cargar el archivo con file_get_contents es pocas veces más rápido.¿Los archivos de lectura incluidos ralentizan la carga del script php?

Creo que esta es la razón por la que los principales sitios web colocan javascripts dentro del archivo html en lugar de cargarlos por archivo. Alternativamente, puede ser una buena idea dividir un archivo JS grande en varios archivos pequeños JS, ya que las solicitudes http paralelas pueden cargar los códigos JS completos más rápidamente. Pero esto es diferente de los archivos php, ya que php script lee los archivos include uno por uno durante el proceso.

  1. favor comentar cuánto grave este problema puede ser? Imagine que una página web está cargada en 0.60s, ¿puede include de 10 archivos php convertirla en 0.70s?

  2. Aunque este efecto debería ser insignificante, quiero saber si hay enfoques para acelerar este proceso. No me refiero al caché de php como APC.

P.S. Esta pregunta no es para la aplicación práctica (un caso típico), sino consideraciones teóricas en general.

+0

Uso de 'include' debe ser extremadamente rápido, e incluso más rápido si se habilita la APC. Estás persiguiendo el extremo equivocado del palo aquí. – Petah

+0

Además, la solicitud paralela normalmente es más lenta debido a la sobrecarga de manejo de la conexión. Simplemente combine todos los archivos JS y colóquelos en la raíz de su documento, luego permita que su servidor web (Apache) maneje el almacenamiento en caché. – Petah

+0

Podría ser muy grave ... si usa máquinas de los 70: p ¿Qué tan "rápido" necesita el código PHP para ejecutar? ¿Importan los 0.1? ¿Qué tan malo es en comparación con una arquitectura altamente reutilizable, flexible y extensible? – LeleDumbo

Respuesta

15

include y su tipo es una necesidad. Es similar a import en Java y python en que se usa para definiciones de clases y funciones. include debe ser extremadamente rápido, pero su uso retrasará la ejecución del script en comparación con si no estaba allí. include es totalmente diferente de file_get_contents(). Esta última es una función en lugar de una construcción y devuelve una cadena. include realmente ejecutará el código del archivo incluido.

Su afirmación sobre la división de archivos JS es incorrecta, ya que las descargas de scripts del mismo dominio bloquean las descargas en paralelo y, en general, se recomienda tener el menor número posible de ellas en general.

I altamente duda de que tener múltiples include s, suponiendo que todos son necesarios, se va a ralentizar el rendimiento de su página. Si tienes problemas de rendimiento, busca en otro lado.

Si desea acelerar php, investigue utilizando un compilador de php.

+0

Gracias por su respuesta informativa. Sé la diferencia de include y file_get_contents. Con esa comparación, quise decir que leer el archivo del disco puede ser más rápido; luego, el paso limitante es el procesamiento de php de include. – Googlebot

+1

+1 para cotizar el compilador de php. Siempre tuve dudas sobre el compilador de php (debido a opiniones opuestas). Ahora debo probar :) – Googlebot

4

PHP tiene que analizar el código sin importar si está en el archivo php principal o en una inclusión. Ponerlo en una inclusión probablemente no haga ninguna diferencia. La velocidad del disco tampoco hace ninguna diferencia, ya que se almacenará en caché después de la primera vez.

+0

Muy buen punto. ¿Cómo se almacena en caché? por APC? – Googlebot

+0

No, el sistema almacena en caché el archivo (solo el caché de disco normal, los archivos PHP se ajustan muy fácilmente). APC almacenaría en caché el resultado de analizar el archivo. – Ariel

6

Sí, lo hace. Las bibliotecas que solía utilizar traerán una penalización de rendimiento debido a una gran cantidad de incluye debajo. El mejor enfoque para mejorar el rendimiento es:

  1. puede agrupar todos los archivos incluidos en un solo uso acelerador uno

Se puede acelerar su solución por 22 veces.Leer más Here

5

Considera:

(index.php) 
for ($i=0; $i<100000; $i++) { 
    include('somefile.php'); 
} 

(somefile.php) 
<?php 
// nothing here 

index.php toma ~ 115 segundos (para mí) para procesar 100.000 iteraciones, mientras incluyendo somefile.php, a pesar de que somefile.php no tiene nada en ella.

Sin embargo:

(index.php) 
for ($i=0; $i<100000; $i++) { 
    // no file included this time 
} 

index.php ahora toma 0.002 segundos para completar sin incluir() constructo.

(index.php) 
for ($i=0; $i<100000; $i++) { 
    echo $i .'<br/>'; 
} 

index.php toma 0.02 segundos para repetir 100.000 iteraciones de $ i.

Por supuesto, este es un ejemplo bastante extremo debido a la gran cantidad de iteraciones, pero muestra que simplemente incluyendo una construcción de inclusión, los tiempos de ejecución de scripts se pueden retrasar de manera exponencial. Considere esto la próxima vez que escriba un proceso con un gran número de iteraciones, es decir. leer/escribir archivos XML grandes, etc. Lo mejor es mantener el código en línea, incluso si eso significa que es menos "manejable". Porque no solo está agregando ~ 115 segundos (~ 2 minutos) al tiempo de ejecución del script en cada ~ 100,000 iteraciones simplemente al incluir un include(), pero considere si eso incluye() (somefile.php) tuvo procesos propios para ejecutar. Mi ejemplo es simplemente agregar una construcción include(). El archivo incluido no contenía nada.

Ahora, incluidos los archivos de aquí y allí por una página web, los tiempos serían insignificantes. Solo estaba señalando que el constructo include() requiere un procesamiento adicional, independientemente de su contenido.

Cuestiones relacionadas