Hace unos días buscando como optimizar mas aún la rapidez que posee Symfony2, vi en la documentacion oficial que ofrecian la posibilidad de agregar APC para aumentar el rendimiento, si bien no indicaban como instalarlo, era cosa de buscar y probar.
Antes de empezar debo dejar claro que esta instalacion se hizo bajo un entorno de Windows 32 bits y las versiones que asomaron del APC fueron la VC9 y VC6, desconosco como descargarlo para una version distinta, mas adelante se entendera a que corresponde esto. Ademas la instalacion tanto para Wamp como para Xampp son muy similares.
Bueno, buscando información al respecto me encontre con algunos post relacionados los cuales dejo a continuacion
Como indique anteriormente la instalacion para ambos es bastante similar, asi que empezemos:
1) Identificar la version
Para realizar esto lo primero que hacemos es ingresar a nuestro navegador y escribir localhost con esto nos mostrara la pantalla inicial, aqui debemos buscar phpinfo e ingresar. Una vez dentro nos indicara toda la configuración que posee, que es lo que nos interesa saber aqui:
- Versión del PHP
- Versión de la Compilación
En mi caso la versión de PHP es:
- Versión del PHP : 5.4
- Versión de la Compilación : MSVC9 (Visual C++ 2008)
Ya teniendo estos datos sabemos que version del APC debemos descargar, asi que ingresamos a la pagina oficial, aqui nos aparecera un listado con las versiones para Windows, tendran un formato asi
APC 3.1.13 beta for PHP 5.4 vc9 (Win7/2008)
Donde:
- 3.1.13 beta : Corresponde a la version que podemos descargar
- PHP 5.4 : Corresponde a la version de nuestro PHP
- vc9 : Corresponde a la version del Compilador que poseemos, para las ultimas versiones ya no viene esto en el nombre
- (Win7/2008) : Plataforma para la cual funcionara
Aqui debo indicar que si tu version de compilacion es VC6 debes buscar exactamente esa version.
En mi caso en particular descargue para efectos de prueba en primera instancia el archivo APC 3.1.9 for PHP 5.4 vc9 (Win7/2008) el cual me produjo un error a nivel de Symfony2 especificamente en el archivo vendor/autoload.php linea 7 al cargar esto
ComposerAutoloaderInitbbxxxxxxxxxxxxxxxxxxxxxxxxxxxx::getLoader();
Lo cual indicaba por lo visto que la version que habia descargado no era la indicada asi que opte por descargar la ultima version APC 3.1.14 beta for PHP 5.4 (Win7/2008) la cual funciono sin problemas.
Una vez descargado el archivo zip, si vemos su contenido lo mas probable es que exista otro archivo comprimido dentro, al abrir este, veremos que viene un archivo DLL con un nombre como este
php_apc_3114_beta_php54_win7-2008.dll
2) Copiar DLL en las extensiones
Como ya tenemos nuestro archivo DLL lo que necesitamos ahora es copiarlo a las extensiones de PHP para ello buscamos en nuestra pagina de PHPInfo que abrimos en el paso uno lo siguiente extension_dir esto nos mostrara el directorio actual en donde estan las Extensiones de PHP, asi que lo unico que debemos hacer es ingresar a esa ruta y copiar nuestro archivo DLL dentro de esta carpeta.
3) Identificar archivo php.ini
Como ya copiamos el DLL a las extensiones ahora nos toda indicarle al Apache que existe una nueva extension, para ello primero debemos saber donde esta nuestro archivo php.ini, para esto volvemos a nuestro PHPInfo que abrimos en el paso uno y buscamos Loaded Configuration File esto nos dira la ruta especifica de nuestro php.ini, lo buscamos y lo abrimos.
4) Agregar extension DLL
Una vez abierto el archivo php.ini debemos agregar la extension a su listado para ello buscamos dentro del mismo archivo ; Windows Extensions aqui nos indicara el listado de extensiones que tiene cargadas, al final de esta lista agregamos nuestra DLL con el nombre que posee el archivo, es decir, agregamos
extension=php_apc_3114_beta_php54_win7-2008.dll
Obviamente sin los ; al inicio ya que esto indica que esta comentada y no la considera de esa forma
5) Agregar bloque de configuracion para APC
Ya tenemos nuestra DLL agregada ahora nos falta el bloque de APC, te recomiendo ir al inicio del archivo php.ini y buscar apc y ver si existe ya el bloque correspondiente a este codigo de no existir como paso en mi caso lo agregamos al final del archivo
[apc] extension=apc.so apc.enabled=1 apc.shm_segments=1 ;32M per WordPress install apc.shm_size=128M ;Relative to the number of cached files (you may need to watch your stats for a day or two to find out a good number) apc.num_files_hint=7000 ;Relative to the size of WordPress apc.user_entries_hint=4096 ;The number of seconds a cache entry is allowed to idle in a slot before APC dumps the cache apc.ttl=7200 apc.user_ttl=7200 apc.gc_ttl=3600 ;Setting this to 0 will give you the best performance, as APC will ;not have to check the IO for changes. However, you must clear ;the APC cache to recompile already cached files. If you are still ;developing, updating your site daily in WP-ADMIN, and running W3TC ;set this to 1 apc.stat=0 ;This MUST be 0, WP can have errors otherwise! apc.include_once_override=0 ;Only set to 1 while debugging apc.enable_cli=0 ;Allow 2 seconds after a file is created before it is cached to prevent users from seeing half-written/weird pages apc.file_update_protection=2 ;Leave at 2M or lower. WordPress does't have any file sizes close to 2M apc.max_file_size=2M ;Ignore files apc.filters = "c:/wamp/bin/APC/apc.php" apc.cache_by_default=1 apc.use_request_time=1 apc.slam_defense=0 apc.mmap_file_mask="c:/wamp/tmp/apc.XXXXXX" apc.stat_ctime=0 apc.canonicalize=1 apc.write_lock=1 apc.report_autofilter=0 apc.rfc1867=0 apc.rfc1867_prefix =upload_ apc.rfc1867_name=APC_UPLOAD_PROGRESS apc.rfc1867_freq=0 apc.rfc1867_ttl=3600 apc.lazy_classes=0 apc.lazy_functions=0
Que es lo mas relevante aqui:
- apc.enabled : Si su valor es 1 activa el APC; si es 0 lo desactiva
- apc.shm_size : Cantidad de memoria que le estas asignando al APC para que trabaje
- apc.stat : Si no tienes mayor cambios en tus archivos es muy recomendable mantenerlo en cero
- apc.max_file_size : Si los archivos pesan mas que esto no los considerara
- apc.filters : Aqui ira la ruta del APC, esto lo veremos en el punto siguiente
- apc.mmap_file_mask : Aqui ira la ruta donde guardara los temporales del APC, esto es para uso interno de él
Todos los cambios que realizes aqui requeriran reiniciar los servicios del Apache. Ademas, si las rutas indicadas en los dos ultimos item no quedan bien definidas el apache no iniciara.
6) Interfaz APC
Existe un script el cual nos da las estadisticas del APC es como una interfaz grafica en donde podemos limpiar cache, ver el uso de la memoria, la version, etc.
Para descargar esto vamos a la pagina oficial y bajamos la ultima version, a la fecha es la 3.1.13. Una vez descargado lo descomprimos en una carpeta dentro de Wamp o Xampp idealmente en la raiz, por ejemplo en Wamp yo lo deje en C:\wamp\bin\APC y en Xampp lo deje en C:\xampp\APC
Una vez descomprimida la carpeta en la ruta que desees, ingresa y veras un archivo llamado apc.php este contiene todo lo relacionado con el APC lo unico que necesitas modificar aqui es
- defaults(‘USE_AUTHENTICATION’,1);
Esto indica si requiere que se autentifiquen para limpiar el cache, 1 activo, 0 inactivo - defaults(‘ADMIN_USERNAME’,’apc’);
- defaults(‘ADMIN_PASSWORD’,’password’);
Nombre de usuario y contraseña en caso de que requiera autentificarse
Esta ruta, es decir, en donde descargamos la interfaz del APC debemos indicarla en apc.filters por ejemplo
apc.filters = "c:/wamp/bin/APC/apc.php"
7) Cambios para Xampp
Estos cambios son solo para Xampp, si no te corresponde pasa al punto siguiente.
Debemos cambiar algunas cosas en el archivo httpd.conf, para ello vamos a la ruta C:\xampp\apache\conf y abrimos el archivo httpd.conf
Una vez abierto, buscamos esto
AllowOverride None
Y lo reemplazamos por esto, en mi caso solo aparecieron 2 veces
AllowOverride All
Como realizamos un cambio en la configuracion de Apache, reiniciamos los servicios de este
8) Ver APC
Para ver esta interfaz lo mas recomendable creo yo, es crear un archivo llamado apc.php en la carpeta web, por ejemplo, si usas Wamp sera C:\wamp\www\apc.php y si usas Xampp sera C:\xampp\htdocs\apc.php, este archivo contendra lo siguiente
<?php include("C:\wamp\bin\APC\apc.php");
Asi incluimos el archivo original apc.php en donde este, obviamente tu deberas poner la ruta que corresponda aqui, una observacion en Xampp me daba un error el include asi que tuve que poner los slash al otro lado y funciono sin problemas, por ejemplo
<?php include(" C:/xampp/htdocs/apc.php");
Antes de continuar nos aseguramos que reiniciamos el Apache para que tomara los cambios, si no levanta es porque existe un error obviamente, asegurate que las rutas que ingresamos al php.ini sobre el bloque APC sean correctas, ya que si no, simplemente no iniciara Apache y no te mostrara un error especifico
Asumiendo que levanto Apache y todo funciona bien, al ingresar a localhost/apc.php te deberia mostrar la interfaz grafica del APC.
Si te muestra esto
No cache info available. APC does not appear to be running.
Es porque no esta iniciado el APC, debes poner apc.enabled=1
NOTA: Si por algun motivo deseas desactivar el APC te recomiendo ademas de poner apc.enabled=0, tambien comentar apc.so, es decir, quedaria asi
;extension=apc.so apc.enabled=0
Ya que puede ser que al reiniciar Apache empieze a reclamar por la extension apc.so
Si esta habilitado entonces veremos algo como esto
9) Activar APC en Symfony2
Ahora volvemos a nuestro proyecto en Symfony2, vamos a nuestro archivo app.php que esta dentro de la carpeta web y descomentamos las lineas 12 y 13
$loader = new ApcClassLoader('sf2', $loader); $loader->register(true);
Esto nos permitira diferencia el cache para el APC y que no genere conflicto. Luego borramos el cache de Symfony2 e ingresamos a la ruta de nuestro proyecto para ver los cambios.
Si todo salio bien deberiamos ver nuestro proyecto sin problemas recuerda que para limpiar el cache ya no basta con renovarlo solo desde Symfony2, si no que tambien debes limpiarlo desde la Interfaz del APC esto es muy importante ya que si haces un cambio y solo limpias uno de los cache no se vera tu cambio o se producira un error.
Si al ingresar a nuestro proyecto se cae Apache, lo mas probable es que las rutas que definiste no esten correctas, deberas chequear lo siguiente:
- La interfaz de APC debe cargar correctamente
- En el archivo php.ini fijate si la extension que agregamos en el paso 4 es el mismo nombre del archivo que copiamos a las Extensiones del PHP
- En el archivo php.ini fijate que las rutas para apc.filters y apc.mmap_file_mask sean correctas, revisa un poco mas arriba en el archivo y compara las rutas que existen versus las que agregaste (con esto estuve casi 20 minutos y una vez definidas las rutas todo funciono bien)
- Si todo lo demas estaba correcto, entonces es hora de confirmar si la version del APC que bajamos en el paso 1 es la correcta
10) Resultados esperados
- Al cargar en el navegador tu proyecto de symfony2, vas a la interfaz del APC y revises por ejemplo la pestaña System Cache Entries y se vean las rutas de tu proyecto, esto indicara que esta cacheando
- Al cargar en el navegador personalmente se demoraba 4 segundos en cargar una pagina cualquiera en mi Notebook de desarrollo, al incluir el APC se demoraba 2 segundos, en produccion no alcanza a demorar 1 seg
- Si tu proyecto inicialmente se demora mas de 3 o 4 segundos, te recomiendo revisar los Servicios que estas implementando ya que alguno de ellos puede estar realizando una consulta o generando algun proceso que implique un impacto negativo en el rendimiento, si sucede esto, no notaras el cambio del APC.
Eso seria todo, espero les sea util y puedan hacerlo funcionar, recuerden desactivarlo en su entorno de Desarrollo
Saludos