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

Silex: error en Admin solo en el servidor

22 de diciembre de 2015

Hola a todos:

Tengo este código para loguearme que me funciona perfectamente en local sin ningún problema:

<?php
require_once __DIR__ . '/../../vendor/autoload.php';
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
 
$app = new Silex\Application();
$app['debug'] = true;
 
// definitions
$app->register(new Silex\Provider\UrlGeneratorServiceProvider());
$app->register(new Silex\Provider\SessionServiceProvider());
 
$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__ . '/views'
));
 
$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
    'db.options'    => array(
        'driver'    => 'pdo_mysql',
        'dbname'    => 'xxx',
        'host'      => 'xxx',
        'user'      => 'xxx',
        'password'  => 'xxx',
        'charset'   => 'utf8',
        // Conexión en servidores locales por ejemplo MAMP
        // 'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'
    )
));
 
$app->register(new Silex\Provider\SecurityServiceProvider());
$app['security.firewalls'] = array(
    'admin' => array(
        'pattern' => '^/',
        'anonymous' => true,
        'form' => array(
            'login_path' => '/login',
            'logout' => array('logout_path' => '/admin/logout', 'invalidate_session' => true),
            'check_path' => '/admin/login_check',
            'default_target_path' => '/adminpanel',
            'always_use_default_target_path' => true),
        'users' => $app->share(function () use ($app) {
            return new Silex\Provider\UserProvider($app["db"]);
        }),
    )
);
 
$app['security.access_rules'] = array(
    array('^/adminpanel', 'ROLE_ADMIN')
);
 
$app->get('/login', function(Request $request) use ($app) {
    return $app['twig']->render('login.twig', array(
                'error' => $app['security.last_error']($request),
                'last_username' => $app['session']->get('_security.last_username'),
    ));
});
 
$app->boot();
$app->run();
?>

Tal y como digo en local si entro en: http://localhost/miweb/web/admin/login me funciona perfectamente y me loguea sin problemas. Pero a la hora de subirlo al servidor y ejecutarlo en: http://miweb.com/web/admin/login

Me da el siguiente error:

RuntimeException in NativeSessionStorage.php line 134: Failed to start the
session because headers have already been sent by 
"/homepages/35/d563136739/htdocs/lh_silex/vendor/autoload.php" at line 1.

Estoy buscando en Google pero no encuentro ninguna solución. Alguien tiene alguna idea de qué pasa.

Gracias


Respuestas

#1

Los errores de tipo "Headers have already been sent" de PHP son bastante molestos porque a veces cuesta encontrar la línea de código exacta que está provocando este error. Casi siempre el error es porque alguien ha escrito algo en la salida del script antes de enviar la respuesta HTTP.

Lo que pasa es que no siempre se trata de llamadas a echo o print mal puestas. A veces, un simple espacio en blanco antes de la etiqueta <?php de apertura es suficiente para estropearlo todo. Te aconsejaría que hicieras lo siguiente:

  1. Comprueba que tu editor de texto ha guardado todos los archivos PHP con la codificación UTF-8. Y si tu editor lo soporta, asegúrate de que los archivos no tienen el "UTF-8 BOM".
  2. Elimina la etiqueta ?> de cierre en todos tus archivos PHP. No solo es opcional, sino que suele ser la causa de muchos problemas de tipo "headers already sent".
  3. Asegúrate de que no hay ningún espacio en blanco por delante de las etiquetas <?php de los archivos PHP.
  4. Asegúrate de que el archivo .../lh_silex/vendor/autoload.php no imprime nada por pantalla (echo, espacios en blanco, etc.)

@javiereguiluz

22 diciembre 2015, 17:54
#2

Si hubiese alguno de esos fallos fallaría también en local. De todos modos lo he revisado y no hay ninguno de esos fallos. Lo que me mosquea es que funcione en local y no en el servidor. Gracias de todos modos.

@despotricador

22 diciembre 2015, 18:57
#3

Lo siguiente que probaría es comprobar el valor de la opción output_buffering del archivo de configuración php.ini tanto en local como en el servidor. Es posible que en local lo tengas como output_buffering=4096 (un valor bastante típico) y eso hace que puedas escribir hasta 4 kilobytes sin que se produzca ese problema (así que la mayoría de páginas HTML se generarán sin problemas). Puede que en el servidor este valor sea más bajo y ahí se produzca el error.

@javiereguiluz

23 diciembre 2015, 17:30