2010-02-19 12 views
36

Una pregunta de PHP sin experiencia:PHP include(): Tamaño y rendimiento del archivo

Tengo un archivo de script PHP que necesito incluir en diferentes páginas muchas veces en muchos lugares.

Tengo la opción de dividir el archivo incluido en varios archivos más pequeños e incluirlos según sea necesario ... O ... Podría mantenerlo todo junto en un solo archivo PHP.

Me pregunto si hay algún impacto en el rendimiento de usar un archivo más grande frente a uno más pequeño para include() en este contexto? Por ejemplo, ¿hay alguna diferencia de rendimiento entre un archivo de 200 KB y un archivo de 20 KB?

Gracias.

Respuesta

43

Habrá una diferencia, entre un archivo de 200KB y 20KB ... Pero probablemente no lo notarás: un archivo de 200KB no es tan grande, y generalmente usas muchos archivos que no son "pequeños" ", cuando estás construyendo una gran aplicación.

Hay dos cosas que toman tiempo, cuando se va a cargar un archivo .php:

  • El código fuente PHP es "compilado" a "códigos de operación" - que es bastante equivalente al código de bytes de Java
    • esto se hace cada vez que se incluye un archivo PHP, por defecto
    • embargo, el uso de algunos caché de código de operación como APC, los códigos de operación se pueden mantener en la memoria, y esto no se hace compilación cada vez que una nymore - lo cual es genial: significará menos CPU utilizada, ya que la compilación no se realizará más (se hará solo de vez en cuando).
  • Los códigos de operación se ejecutan
    • Dependiendo de lo que la escritura contiene, esto puede llevar algún tiempo, o no:
    • Si el archivo sólo contiene funciones o clases definiciones, esto no tomará mucho tiempo : nada será ejecutado.
    • Si el archivo contiene instrucciones, que va a tomar más tiempo ^^


Como sidnote: en una situación general, obtendrá mucho más tiempo de CPU// Optimización de recursos sus consultas SQL, o agregar algún mecanismo de almacenamiento en caché, que pensar en ese tipo de cosas.

+0

Gracias por la explicación agregada. – Tom

+0

De nada :-) Diviértete! –

+2

Incluso con APC, considere el uso de una función __autoload personalizada/spl_autoload_register - Solo pude incluir archivos de modelo en un marco MVC personalizado donde se invocó la clase en lugar de una lista global de todos los archivos de modelo; esto incluye aproximadamente 1 ms por archivo. . Por lo tanto, si una página es de 80 ms y puede guardar 20 ms hasta incluir solo lo que necesita incluso con APC (cuando hay muchos incluidos), puede valer la pena hacerlo. También solo tomó como 10 minutos para implementarlo. – codercake

1

Sin duda hay un impacto, así que asegúrese de usar include_once() en lugar de include(). Tal vez podría considerar usar APC que tiene un caché de inclusión.

+0

ggiroux ... gracias ... ¿qué pasa cuando el archivo está en caché? A menos que sea una pregunta realmente tonta. – Tom

+1

si está almacenado en caché, diría que el impacto es mínimo, ya que se almacenará en bytecode precompilado en la memoria compartida. – ggiroux

+3

include_once() en lugar de include()? Por favor expanda eso; ciertamente no agrega velocidad para usar include_once por las razones ya mencionadas en este hilo. – Slavic

16

Tenga cuidado con include_once() (y también require_once()), es más caro ejecutar que include(). Cada vez que se ejecuta include_once(), PHP hace una búsqueda contra un índice interno de archivos ya incluidos antes de decidir si cargar el archivo o no. Cuanto más se incluye en el índice, más lenta es esta búsqueda. También al usar include() o include_once() trate de usar rutas absolutas cuando sea posible ya que esto es mucho más rápido que las rutas relativas porque no está forzando a PHP a encontrar la ruta absoluta para usted. Como dijo ggiroux, alguna forma de almacenamiento en caché como APC obtendrá recompensas masivas y hará que te preocupes por cuántas incluyen las llamadas que tienes como irrelevantes (en gran parte) (a menos que tengas un código mal escrito).

EDIT--

preocuparse por las llamadas de arriba es solo un problema una vez que empiece a tener varios miles requires o includes en su código base.

+0

En la web, cada 100 ms cuenta. No necesita miles de incluir para beneficiarse enormemente de esto. – Pacerier

+0

¿Qué piensas de esta publicación extraña: https://seeit.org/2010/06/11/php-the-include-include_once-performance-debate/ que afirma que ** include_once() ** es en realidad más rápido que **incluir()**? – Adam