2009-08-07 14 views
17

¿El módulo APC en PHP cuando se ejecuta en modo CLI admite la optimización de código? Por ejemplo, cuando ejecuto un archivo con php -f <file> ¿se optimizará el archivo con APC antes de ejecutar o no? Presumiendo que APC está configurado para cargar en el archivo de configuración. Además, ¿los guiones incluidos con require_once también se optimizarán?PHP APC en modo CLI

Sé que la optimización funciona bien cuando se ejecuta en modo fastcgi, pero me pregunto si también funciona en CLI.

apc_ * funcionan las funciones, pero me pregunto acerca de la optimización del código, que es lo principal que estoy buscando aquí.

Feliz día, Matic

Respuesta

24

La documentación de apc.enable_cli, que controlan si APC debe ser activado en el modo CLI, dice (citando):

todo para las pruebas y la depuración. Al configurar esto, se habilita APC para la versión CLI de PHP. Bajo circunstancias normales, no es ideal para crear, rellenar y destruir el caché de APC en cada petición CLI, pero para diversos escenarios de prueba es útil podrá habilitar APC para la versión CLI de PHP con facilidad.

Quizás APC almacene los códigos de operación en la memoria, pero como el ejecutable PHP muere al final del script, esa memoria se perderá: no persistirá entre las ejecuciones del script.

Así que el opcode-cache en APC es inútil en el modo CLI: no optimizará nada, ya que PHP tendrá que volver a compilar el código fuente cada vez que se ejecute el ejecutable de PHP.


En realidad, APC no "optimizar": la forma estándar de la ejecución de un script PHP es así:

  • leer el archivo y compilarlo en códigos de operación
  • ejecutar los códigos de operación

lo que hace APC es tienda en códigos de operación en la memoria, por lo que la ejecución de un script PHP se convierte en:

  • leer los códigos de operación de la memoria (mucho más rápido que compilar el código fuente)
  • ejecutar los códigos de operación

Pero esto significa que debe tener un lugar en la memoria para almacenar los códigos de operación. Al ejecutar PHP como un módulo de Apache, Apache es responsable de la persistencia de ese segmento de memoria ... Cuando PHP se ejecuta desde CLI, no hay nada para mantener el segmento de memoria allí, por lo que se destruye al final de la ejecución de PHP.
(no sé cómo funciona exactamente, pero es algo así, por lo menos en los principios, incluso si mis palabras no son muy "técnica" ^^)


O, por "optimización" significa algo más que la memoria caché de códigos de operación, como la directiva de configuración apc.optimization? Si es así, éste ha sido retirado de APC 3.0.13

+0

De la documentación de PHP: APC es un marco libre, abierto y robusto para el almacenamiento en caché de PHP y la optimización de código intermedio. Supongo que me pregunto acerca de la optimización del código intermedio. Planeo ejecutar el script CLI solo una vez y luego se ejecutará durante unos días, ejecutando algún código dentro de un bucle. ¿Entonces APC realmente no acelera la ejecución en sí misma, solo el tiempo que lleva comenzar a ejecutar? – Matic

+0

http://pecl.php.net/package-info.php?package=APC&version=3.0.13 dice "Obsoleto y eliminar el optimizador de la APC"; Nunca escuché que APC (al menos en versiones recientes) hiciera algún tipo de "optimización" como lo que se podría pensar que el compilador puede hacer cuando se está programando en C. Y no creo que reduzca el tiempo para comenzar a ejecutar, ya que el PHP tendrá que ser compilado a código de operación (es en esta parte que APC permite una gran ganancia ... cuando puede mantener esos códigos de operación en la memoria entre las ejecuciones del script, lo que no creo puede hacerlo en CLI) –

+0

Para ser claros, el uso de APC en modo CLI sigue siendo bastante útil para el almacenamiento en caché de objetos generados por el usuario. En un script en el que estoy trabajando, usamos apc_store() y apc_fetch() para aprovechar el almacenamiento en memoria caché de objetos de usuario de APC en un trabajo cron de larga ejecución. – rinogo

3

Bueno, hay una buena razón para APC en el modo CLI: prueba unitaria: Quiero hacer mi prueba de unidad utilizando un entorno lo más parecido al entorno de producción más tarde como posible. Zend Framework tiene una solución interna de almacenamiento en caché, que puede usar el Caché de Variables de APC como Backend de Almacenamiento, y quiero usar esto.

+0

Creo que en este caso es posible que desee buscar en otro back-end para pruebas unitarias. Lo bueno es que es conectable en Zend_Cache. – Till

+0

Lo sé, pero esos Backends no se comportan exactamente igual. Por lo tanto, me gustaría hacer pruebas unitarias con el mismo back-end. – Laph

3

Si tiene código de CLI que genera cualquier configuración basado en el medio ambiente, a continuación, el código CLI pensará que APC no se habilitado Por ejemplo, al generar el contenedor DI de Symfony a través de la CLI, le indicará a Doctrine que no use APC (details).

Además, no lo he probado, pero existe la posibilidad de que APC mejore la velocidad de los scripts para los archivos incluidos después de pcntl_fork(). Editar: He hecho la pregunta sobre APC & pcntl_fork() here.

Para completar, para permitir APC en el CLI (en Ubuntu):

echo 'apc.enable_cli = 1' > /etc/php5/cli/conf.d/enable-apc-cli.ini