2011-11-23 11 views
8

Actualmente cargo todas mis clases incluyendo un archivo "all.inc.php" en cada página de mi sitio, este archivo luego incluye todas las configuraciones, clases, funciones, etc. que usaré en el todo el sitio.¿Hay desventajas de rendimiento al usar clases de autocarga en PHP?

Mi problema con esto es que a menudo utilizo clases que solo pertenecen a ciertas páginas/secciones de un sitio web, por lo que a menudo incluyo un montón de clases al principio de la página que no se usarán.

Obviamente, la carga automática de las clases solucionaría este problema, por lo que mi pregunta es, ¿la carga automática de las clases me daría un inconveniente de rendimiento ya que el servidor debe verificar si existe un archivo? Y si hay una desventaja, ¿esta desventaja es peor que tener que incluir una serie de clases que no se pueden utilizar en la página? ¿O es la diferencia negable?

Respuesta

9

Este artículo tiene algo de información y puntos de referencia: PHP autoload performance. Conclusión:

La carga automática no degrada significativamente el rendimiento. La búsqueda de Include_path, la lectura y el análisis de los scripts PHP del disco lleva mucho más tiempo que los costos de la lógica de carga automática.

+0

¡Gracias, ese artículo era el tipo de explicación que estaba buscando! – Nick

+0

Respuesta corta: no realmente (es un pequeño golpe de rendimiento), no, y sí :) – siliconrockstar

5

La carga automática de una clase es casi tan rápida como incluir la clase de la manera normal. Cambiar a la carga automática mejorará el rendimiento en su caso, ya que PHP carga menos archivos y clases.

+3

Si bien la filosofía de esto es correcta, depende de la base de código. Si su base de código está estrechamente relacionada, y las clases dependen entre sí, puede que no haya ningún beneficio en la carga automática, ya que la mayoría (o todas) de las clases pueden cargarse de todos modos.Solo un pensamiento ;-) –

1

Cada include() y require() (y su _once hermanos) llevar a una reducción del rendimiento por su propia cuenta. Las búsquedas y lecturas de disco también tienen un costo. Realmente depende de tu código, si estás cargando 20 clases pero solo usas 2 o 3 en un solo punto, entonces definitivamente vale la pena ir a la ruta de carga automática.

Si el rendimiento es su principal preocupación, debe buscar fusionar sus archivos de clase en un solo archivo y crear una instancia de lo que necesita.

+2

Lanzar toneladas de clases en un solo archivo es una práctica bastante mala. – burzum

+0

@burzum y por qué sería eso? –

+0

http://en.wikipedia.org/wiki/Separation_of_concerns – burzum

3

La carga automática mejorará el rendimiento si el script no tiene que buscar los archivos cada vez en el sistema de archivos. Si usa espacios de nombres, puede tener una buena asignación del nombre y el nombre de clase a una carpeta y un archivo como Some/Nice/ClassName se correlacionará con Some/Nice/ClassName.php.

Si no usar espacios de nombres y tienen que buscar a través de carpetas le sugiero que para crear una clase Singleton personalizada para incluir archivos que le permite hacer algo como:

App :: usos ('Algunos/Nice' , 'Nombre de la clase');

En Autoload, use la ruta registrada y el nombre de clase para asignarlo a una ruta y archivo combinando ambos argumentos del método uses en mi ejemplo. Esto le permitirá un poco de espacio de nombres, como la funcionalidad para la carga de clases hasta que esté listo para cambiar su aplicación para usar espacios de nombres.

2

Debe utilizar la carga automática con el índice de caché de todas las clases/archivos disponibles en el proyecto.

Ejemplo:

$class_cache=array(
    'MyClass'=>'lib/MyClass.php', 
    'Item'=>'model/Item.php' 
); 

function __autoload($class_name) { 
if(array_key_exists($class_name)) 
    include $class_cache[$class_name]; 
else 
    throw new Exception("Unable to load $class_name."); 
} 

que necesita para mantener la lista de clase real o escribir algún generador de $ class_cache.

+0

Gracias por el código de ejemplo, pero todas mis clases siguen la misma convención de nomenclatura y coincidirán usando el nombre de clase con bastante facilidad, así que no creo que una matriz que las combine sea la mejor solución. ¡Ahora estoy seguro de que voy a usar autocargado! Así que gracias a ti (y a los demás) por las explicaciones. – Nick

+0

Ok, pero si escribe autogenerador para $ class_cache y lo ejecuta antes de la implementación Comprobará el disco en busca de archivos php disponibles solo una vez en el proceso de implementación, no en cada solicitud. – rogal111

Cuestiones relacionadas