require_once include_once ejemplos ejemplo __file__ php performance opcode zend-optimizer

php - include_once - require_once vs include



PHP Opcode Caching/Zend Acceleration e include_once vs. require_once (2)

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

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

¿Alguien ha encontrado algo como esto? Si no, ¿hay algún pensamiento sobre otras cosas que pueda estar causando la apariencia de un aumento de rendimiento al cambiar de include_once a require_once?


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

Siempre supuse que la diferencia era porque require_once tiene que trabajar más 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.


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

Así que la forma en que ambos logran esto es buscando el archivo en todos los caminos disponibles y comprobando esencialmente si no ha estado en la mezcla antes, etc.

En segundo plano, lo que sucede es que evalúan todas las diferentes opciones (p. Ej., Multiple include_path, etc.) y luego, al crear la ruta real desde esta forma abreviada, crean un identificador único. Solo hay uno y el mismo camino, no dos.

Este ya no es el proceso más rápido en el 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é el realpath (realpath, porque es una especie de lo que realpath () hace) para verificar si el archivo existe.

Corrígeme si estoy equivocado, pero APC tiene optimizaciones especialmente para este caso.

De todos modos, ahora vamos 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. Este es un control adicional del que puede deshacerse si tiene suficiente QA en su lugar para que un error de análisis nunca se pueda colar en un include.

Es complicado encontrar lo contrario. :-)

(Algo a considerar: podría desarrollar con require_once y reemplazar todas las llamadas con include_once cuando implemente).

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

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

Un par de punteros adicionales:

  1. Mucha gente dice que acelera 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 flujo de control).
  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 su include_path también es importante.

Espero que ayude.