php - udemy - zend framework 2018
"La sesión ya se ha iniciado..." excepción en la aplicación Zend Framework (11)
¡Antes de que esto te vuelva loco, probablemente no haya nada de malo en tu código!
Compruebe su application.ini para la ruta de guardado de la sesión, para mí es APPLICATION_PATH ''/ session''
¡Ahora comprueba que tienes los permisos correctos! De lo contrario, cd en la carpeta de la aplicación y escriba
sudo chmod 777 session sudo chown -R [usernamehere] session sudo chgrp -R [usernamehere] session
¡Trabajo hecho!
Me aparece este error al intentar cargar una aplicación de Zend Framework:
Error fatal: la sesión de excepción no capturada ''Zend_Session_Exception'' con mensaje ''ya ha sido iniciada por session.auto-start o session_start ()'' en /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session.php:462
Stack trace:
# 0 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session/Namespace.php(143): Zend_Session :: start (true)
# 1 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth/Storage/Session.php(87): Zend_Session_Namespace -> __ construct (''Zend_Auth'')
# 2 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth.php(91): Zend_Auth_Storage_Session -> __ construct ()
# 3 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth.php(141): Zend_Auth-> getStorage ()
# 4 /www/htdocs/w00a1ed7/autospin/redaktion/application/layouts/scripts/layout.phtml(31): Zend_Auth-> hasIdentity ()
# 5 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/View.php(108): include (''/ www / htdocs / w00 ...'')
# 6 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/View/Abstract.php(831): Zend_View -> _ run (''/ www / htdocs / w00 ...'')
# 7 / www / htdocs / w00a1ed en /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session.php en la línea 462
Uso Zend_Auth
y en mi servidor local y funciona bien, pero en un servidor de producción me sale el error anterior, pero no siempre.
He comprobado esa session.autostart
se establece en 0
en el archivo .htaccess
.
¿Cómo soluciono este error?
Gracias por su respuesta, pero no uso session_start () en ningún lado. Trabaja solo con ZF.
Tengo este problema solo en el servidor compartido, en mi script de servidor local funciona perfectamente.
Uso la función INIT con este código:
protegido $ usuario;
public function init()
{
if(!Zend_Auth::getInstance()->hasIdentity())
{
$this->_redirect(''auth/login'');
}else
{
$this->user = Zend_Auth::getInstance()->getIdentity();
}
}
Ya intenté establecer este código solo en indexAction, para que otras acciones no tengan que chackear la Auth ... pero todavía tengan problemas.
¿Hay alguna manera de establecer una Acción para no verificar la sesión o algo así?
Beste saludos
En caso de que esto sea de algún uso, borré este error quitando las líneas relacionadas con la sesión de mi application / config / application.ini
;resources.session.save_path = APPLICATION_PATH "/../data/session"
;resources.session.use_only_cookies = true
;resources.session.remember_me_seconds = 3600
Gracias a chelmertz por la comprensión de la causa del problema.
Es lo que dice que es. Zend_Auth
intenta iniciar una nueva sesión, ya que Zend_Session::start()
aún no ha sido llamado.
El problema es que se debe Zend_Session::start()
antes de que se inicie una sesión. Pero, como session.autostart es 0 (por cierto esto está en php.ini no .htaccess ), probablemente haya escrito session_start();
algun lado. No se te permite hacer eso, ya que ZF desea tener control total sobre las sesiones, es decir, no debes acceder directamente a la variable de sesión global.
Para resolverlo, busque sus archivos de código para session_start()
y
- eliminar todas las ocurrencias menos una. Para saber si ya se ha iniciado, configure
error_reporting(E_ALL|E_STRICT);
- reemplácelo con
Zend_Session::start();
en todos los lugares
Si no puede encontrar todas las ocurrencias, encuentre la sesión session_start (); eso molesta a su Zend_Auth::getInstance()->hasIdentity()
y soluciona el problema rápidamente n ''sucio con el siguiente fragmento
try {
Zend_Session::start();
} catch(Zend_Session_Exception $e) {
session_start();
}
Si estás usando ZF en toda tu aplicación, yo elegiría 2)
Hay 3 razones principales que producen este problema:
- session.auto_start debe establecerse en 0 o apagado. Puede verificarlo colocando phpinfo (); en cualquier archivo e intente acceder a él en el navegador, luego buscar auto_start es 0 o no. Si no, configúralo o 0.
- Compruebe la sesión session.save_path en la configuración en el servidor. Si con la configuración predeterminada está mostrando el error ''la sesión ya ha sido iniciada por session.auto-start o session_start ()'', establézcala en ''/ temp''
- Puede ser que haya utilizado session_start () en su código antes de la inicialización de la sesión zend.
En la mayoría de los casos, la segunda opción es la razón.
Me gustaría llamar su atención sobre el problema de la recolección de basura, resuelto aquí Problemas con PHP 5.3 y la carpeta de sesiones o http://somethingemporium.com/2007/06/obscure-error-with-php5-on-debian-ubuntu- sesión-phpini-basura .
Después de corregir la ''sesión ya se ha iniciado'' me encontré con el error de GC. Sospecho que el error de GC podría ser la causa raíz del error de la sesión, al menos en algunos casos. Hasta ahora no he tenido tiempo suficiente para investigar a fondo, pero por favor comenten si el GC y el error de la sesión también están relacionados en su caso.
Para aquellos que se mueven de un servidor a otro. Otro problema puede ser el usuario al que se ejecuta Apache. Estaba ejecutando un usuario diferente en mi antigua caja que estaba configurada en la nueva. Utilicé las configuraciones de mi antiguo httpd.conf y olvidé actualizar los permisos en / var / lib / php / session para reflejar el usuario diferente.
Para probar, cambié las permanentes a 777. Todo funcionó bien, el error desapareció:
# cd /var/lib/php
# chmod 0777 session
Así que devolví las permanentes y cambié el grupo. Por supuesto, cambie newApacheUser a la cuenta de usuario que está ejecutando httpd en IF NOT apache.
# chmod 0770 session
# chown root:newApacheUser session
Algo para verificar si todavía tienes este problema:
Error fatal: la sesión de excepción no capturada ''Zend_Session_Exception'' con mensaje ''ya ha sido iniciada por session.auto-start o session_start ()''
Si está desarrollando aplicaciones con la biblioteca RPCL ( RADPHP ) y está obteniendo este error:
La aplicación generó una clase de excepción Zend_Session_Exception con la sesión ''message'' que ya ha sido iniciada por session.auto-start o session_start () '',
entonces aquí está mi solución.
Te sorprenderá lo simple que es. Simple incluye la línea
require_once ("zcommon.inc.php");
justo después de la etiqueta PHP de apertura en el archivo que contiene el componente ZAuth , generalmente este es el archivo con un formulario de DataModule . Por supuesto, asegúrese de que el archivo zcommon.inc.php esté en su camino. Esto asegurará que la sesión Zend comience primero en lugar de la sesión RPCL.
También asegúrese de que el nombre de los archivos php en su aplicación corresponda al nombre de las clases que lo contienen.
Tuve el mismo problema y busqué todas las publicaciones, incluida esta. No pude encontrar una respuesta hasta que publiqué que, aunque obtuve el mismo resultado de excepción, mi error fue causado por algo completamente diferente.
De hecho, tuve un problema con la carga automática. Debido al problema durante Bootstrap, creo que esto causó que se muestre la excepción anterior (que oculta el error real).
Entonces, si revisó todas las otras soluciones posibles, intente comentar los detalles en su Bootstrap y vea si eso le permite superar este problema. Obviamente, recuperas lentamente las diferentes partes del programa de arranque para descubrir el verdadero problema.
Yo tenía el mismo error. En la máquina local, todo funcionó bien. En el servidor no. Mi solución fue poner Zend_Session::start();
en index.php antes de ejecutar bootstrap. Para que se vea así:
<?php
// Define path to application directory
defined(''APPLICATION_PATH'')
|| define(''APPLICATION_PATH'', realpath(dirname(__FILE__) . ''/../application''));
// Define application environment
defined(''APPLICATION_ENV'')
|| define(''APPLICATION_ENV'', (getenv(''APPLICATION_ENV'') ? getenv(''APPLICATION_ENV'') : ''production''));
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . ''/../library''),
get_include_path(),
)));
/** Zend_Application */
require_once ''Zend/Application.php'';
// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . ''/configs/application.ini''
);
error_reporting(E_ALL);
ini_set("display_errors", 1);
Zend_Session::start();
$application->bootstrap()->run();
tuvo el mismo error Ocurrió solo si se usaron dos instancias de la misma sesión al mismo tiempo (por ejemplo, dos instancias del navegador se cargaban al mismo tiempo). Esto es el resultado de que php no puede manejar dos sesiones abiertas con la misma identificación al mismo tiempo.
Hay un problema abierto para este problema: