Esta pagina se ve mejor con JavaScript habilitado

Debugear código php/symfony3.4 en producción

 ·  🎃 kr0m

En multitud de ocasiones no somos capaces de depurar nuestro código PHP de forma sencilla, otras veces no hay rastro del error que se está produciendo ni en los logs del servidor web’, ’ni en los de la aplicación. En estos casos podemos acceder al entorno dev de symfony donde se nos mostrará mas información de debug.

Empecemos explicando como funcionan los entornos en Symfony, por defecto tenemos 3 entornos:

  • dev: Desarrollo, los errores son mas detallados con información para debugear.
  • prod: Producción, se habilitan las caches y se elimina la información de debug de los errores.
  • test: Test, se utiliza para ejecutar tests funcionales que no son accesibles directamente ví­a navegador web.

Según el entorno que está en ejecución se cargará un fichero de configuración u otro:

  • dev: config_dev.yml
  • prod: config_prod.yml
  • test: config_test.yml

NOTA: Todos los entornos tienen una configuración común, el fichero config.yml.

Para ejecutar un entorno u otro tan solo debemos acceder a app.php(prod) o app_dev.php(dev), por defecto symfony crea un .htaccess en el document root con:

cat web/.htaccess

DirectoryIndex app.php

De este modo por defecto servirá el entorno de producción, pero desarrollo seguirá estando accesible, para protegerlo restringiremos el acceso a la dirección de loopback:

vi web/app_dev.php

if (!in_array(@$_SERVERREMOTE_ADDR, array('127.0.0.1', '::1'))) {
 die('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}

NOTA: Si arrancamos el servidor integrado este siempre cargará por defecto el entorno dev, en este enlace podemos leerlo en la documentación oficial de symfony:

If you're using the built-in PHP web server, it knows to use the app_dev.php file.

Para comprobar que entorno está corriendo podemos utilizar Monolog como se explica en este artículo

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$logger = new Logger('debugLogger');
$logDir = $this->container->get('kernel')->getLogDir();
$logger->pushHandler(new StreamHandler($logDir.'/debugLog.log', Logger::NOTICE));
$logger->notice('debugLogger ENV is now ready');

$runningEnvironment=$this->container->get('kernel')->getEnvironment();

Para acceder a dev debemos hacerlo mediante un túnel ssh:

ssh -L 8000:127.0.0.1:80 -A -g IP_SERVER

Luego tan solo queda acceder vía HTTP a través del túnel:
http://localhost:8000/app_dev.php

Si te ha gustado el artículo puedes invitarme a un RedBull aquí