Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Duda con caché de Symfony2 en entorno de desarrollo

17 de septiembre de 2014

Hola, tengo una duda con la caché de Symfony2 en el entorno de desarrollo. Cuando cambio cosas en un controlador y quiero comprobarlas, me obliga a vaciar la caché. Ya cambié esto en mi app_dev.php:

//$loader = require_once DIR.'/../app/bootstrap.php.cache';
$loader = require_once DIR.'/../app/autoload.php';
Debug::enable();
 
require_once DIR.'/../app/AppKernel.php';
 
$kernel = new AppKernel('dev', true);
//$kernel->loadClassCache();

¿Qué más puedo hacer para que esto no ocurra?

Gracias


Respuestas

#1

@HectorPrats, siento que estés sufriendo este problema con Symfony. La buena noticia es que debe tratarse de algún error de configuración porque es completamente seguro que en el entorno de desarrollo puedes cambiar controladores, plantillas y clases y ves los cambios al instante sin tener que borrar la caché.

Lo primero que te aconsejo es que no cambies el contenido del archivo app_dev.php. Te pego a continuación el contenido original tal y como se puede ver en GitHub:

<?php
 
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Debug\Debug;
 
// If you don't want to setup permissions the proper way,
// just uncomment the following PHP line
// http://symfony.com/doc/current/book/installation.html#configuration-and-setup
//umask(0000);
 
// This check prevents access to debug front controllers that are deployed
// by accident to production servers.
// Feel free to remove this, extend it, or make something more sophisticated.
if (isset($_SERVER['HTTP_CLIENT_IP'])
    || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
    || !(in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1')) || php_sapi_name() === 'cli-server')
) {
    header('HTTP/1.0 403 Forbidden');
    exit('You are not allowed to access this file. Check '.basename(FILE).' for more information.');
}
 
$loader = require_once DIR.'/../app/bootstrap.php.cache';
Debug::enable();
 
require_once DIR.'/../app/AppKernel.php';
 
$kernel = new AppKernel('dev', true);
$kernel->loadClassCache();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

Lo segundo que debes asegurarte es de que tienes bien resuelto el tema de los permisos de Symfony, ya que la carpeta de la caché es una de las que tienen que estar bien configuradas.

La mejor solución para el entorno de desarrollo es cambiar el usuario con el que se ejecuta tu servidor web. Si haces que Apache se ejecute con el mismo usuario de tu consola de comandos, no deberás preocuparte jamás por el tema de los permisos. Si no puedes optar por esta solución, lee este artículo para conocer otras posibles soluciones.

@javiereguiluz

17 septiembre 2014, 12:40
#2

Hola, gracias por la rápida respuesta. Lo que he cambiado lo vi en How to Optimize your Development Environment for Debugging para ver si me lo solucionaba, pero nada.

Trabajo con WAMP (entorno Windows), y lo hago sobre una instalación limpia, recién descargada con Composer. Me pasa con todos en general y, hasta que no borro caché con app\console cache:clear, no me muestra cambios.

@HectorPrats

17 septiembre 2014, 13:53
#3

Por otro lado, no tengo ese problema al cambiar las plantillas. Sólo me ocurre con las cosas realizadas en el controlador.

@HectorPrats

17 septiembre 2014, 14:46
#4

OK, a ver.. después de probar varias cosas... es algo relacionado con el WAMP. Curioso. Algo cachea y no pregunta. Pero sólo a las modificaciones del controlador es cuando da fallo.

@HectorPrats

17 septiembre 2014, 17:29
#5

Como no uso WAMP no te puedo ayudar con los pasos concretos a seguir, pero te comento que me pasó algo parecido hace tiempo. En mi caso yo uso Zend Server y sus creadores decidieron que estaría genial activar por defecto una cosa llamada Zend Cache que es como una especie de caché por encima de todas las demás (APC, OPcache, etc.) Así que es posible que WAMP tenga una super caché parecida.

Otra cosa que podría suceder es que por defecto la configuración de APC o OPcache (o lo que utilice) sea muy exagerada y tarde demasiado tiempo en comprobar si los archivos fuente han cambiado. En OPcache por ejemplo tienes la opción opcache.revalidate_freq con un valor por defecto de 2. Esto significa que si haces una petición y 1 segundo después otra, esta segunda se sirve cacheada aunque haya cambiado el archivo original. Pero si la segunda petición llega 3 segundos después que la primera, entonces sí que se comprueba si ha cambiado el archivo.

@javiereguiluz

17 septiembre 2014, 17:37
#6

¿Te puedes creer que es eso exactamente lo que me pasaba? Estaba en 60. Dios sabe por qué y desde cuándo.

No hay info de esto en la red y sí muchas preguntas, seguro que solucionas el problema a mucha gente.

Gracias Javier.

@HectorPrats

18 septiembre 2014, 8:59