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
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:
- 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".
- 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". - Asegúrate de que no hay ningún espacio en blanco por delante de las etiquetas
<?php
de los archivos PHP. - Asegúrate de que el archivo
.../lh_silex/vendor/autoload.php
no imprime nada por pantalla (echo
, espacios en blanco, etc.)
@javiereguiluz
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
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