Pregunta

Tengo un colega que está investigando el almacenamiento en caché de opcode / Zend Acceleration (siempre he asumido que son lo mismo) para nuestra aplicación basada en PHP. Sus puntos de referencia parecen indicar que NO estamos viendo un beneficio de rendimiento si incluimos nuestras bibliotecas de clases (grandes) con require_once, pero sí vemos el beneficio de rendimiento cuando usamos include_once.

Esto nos huele mal a los dos, pero no tengo tiempo para comprobar mi metodología de referencia y mi colega tiene más tolerancia al olor a pescado que yo. :)

¿Alguien se ha encontrado con algo como esto? Si no, ¿alguna idea sobre otras cosas que podrían estar causando la aparición de un aumento en el rendimiento al cambiar de include_once a require_once?

¿Fue útil?

Solución

Para empezar, ambas llamadas (require_once e include_once) verifican dos veces si un archivo no se ha incluido antes.

Por lo tanto, la forma en que ambos lo logran es buscando el archivo en todas las rutas disponibles y, esencialmente, comprobando si no ha estado en la mezcla antes, etc.

En el fondo, lo que sucede es que evalúan todas las diferentes opciones (por ejemplo, varias include_path's, etc.) y luego al crear el realpath a partir de este formulario abreviado crean un identificador único. Solo hay una y la misma ruta, no dos.

Este ya no es el proceso más rápido del planeta y generalmente ocurre en cada solicitud con PHP. Luego agregue otra operación costosa que es la estadística cuando crea lo que llamé realpath (realpath, porque es algo así como realpath () does) para verificar si el archivo existe.

Corríjame si me equivoco, pero APC tiene optimizaciones especialmente para este caso.

Entonces, de todos modos, ahora a la diferencia entre require_once e include_once, que es que require_once evalúa el archivo (para errores de análisis de bajo nivel , etc.) cuando lo incluye Esta es una verificación adicional de la que puede deshacerse si tiene suficiente control de calidad en lugar de que un error de análisis nunca pueda colarse en una inclusión.

Es difícil encontrar lo contrario. :-)

(Algo a considerar: podría desarrollar con require_once y reemplazar todas las llamadas con include_once cuando realice la implementación).

En cuanto a un caché de código de operación, recomendaría APC . Se ha discutido en stackoverflow antes. Personalmente, lo estoy / lo estamos usando por un tiempo (manejamos aproximadamente 100k visitantes / día con 3 frontends y 1 backend) y estamos muy contentos. APC también está optimizado para la locura require_once / include_once.

Un efecto secundario bastante bueno es que APC también le permite almacenar variables PHP en la memoria, algo persistente, etc.

Un par de punteros adicionales:

  1. Muchas personas afirman que aceleran cualquier aplicación con __autoload .
  2. Con un caché de código de operación, evite require_once / include_once condicional (por ejemplo, en bucles o en control de flujo).
  3. Algunas personas dicen que /absolute/path/to/file.php en include_ o require_once es más rápido que confiar en include_path.
  4. El orden de las rutas en tu include_path también es importante.

Espero que ayude.

Otros consejos

No puedo garantizar nada, ya que no lo he investigado lo suficiente, pero sí, he visto diferencias de velocidad entre los dos. Sin embargo, nunca fueron lo suficientemente importantes como para moverme a include_once en lugar de require_once.

Siempre asumí que la diferencia era porque require_once tiene que hacer más trabajo bajo el agua. al menos un error potencial más para preparar y manejar, y mucho más para hacer cuando el archivo requerido no existe.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top