500 Internal server error, component Wakeup, notimplemented exception
- JakubJarabica
- Gold Partner | 184
Zdravim,
mam problem, ktory neviem fixnut…
Pri zapnutom catchExceptions pri nastani nejakej non-404 chyby(momentalne DB chyba s porusenim FK constraint) sa mi prvykrat appska pekne chybovou hlaskou ospravedlni, zaloguje vynimku. Avsak po refreshi danej stranky mi uz naskoci nieco taketo:
Fatal error: Uncaught exception 'NotImplementedException' in ..\libs\Nette.minified\loader.php:411 Stack trace: #0 [internal function]: Component->__wakeup() #1 ..\libs\Nette.minified\loader.php(4456): session_start() #2 ..\app\bootstrap.php(23): Session->start() #3 ..\document_root\index.php(6): require('..\app\b...') #4 {main} thrown in ..\libs\Nette.minified\loader.php on line 411
Problem je, ze do sessiony sa narve nejaky serializovany kod vyzerajuci celkom ako ladenka(50kb, je tam stack trace, text tej vyhodenej vynimky, PresenterRequest atd) a vlastne zablokuje daneho uzivatela, ten si musi bud vycistit session alebo ja zmazat dany session subor. To zial nie je spravanie, ktore sa mi celkom hodi na production.
Otazka je, co s tym?
Pozeral som na fore, nasiel som dve vlakna s tymto problemom ale k dorieseniu nedoslo. Vzdy sa to tocilo kolo session, tak mozem skopcit ako ju pouzivam zatial ja:
bootstrap.php
<?php
$session = Environment::getSession();
$session->setExpiration("+ 7 days");
$session->setSavePath(APP_DIR . '/sessions/');
$session->start();
?>
Ked odstranim $session->start(), dostanem chybu ako kolega tu: Thread 3212.
Any ideas? Vdaka vopred :)
Nette: Nette Framework 1.0-dev (revision 7504d94 released on 2010–04–06)
- forkman
- Člen | 72
Už jsi to nějak vyřešil? Teď to zrovna zase řeším. Vypadá to, že se obsah laděnky uloží do session souboru, ale nevím jestli je to chyba moje, nebo chyba Nette.
Přišel jsem na to, že se to děje jen když používám vlastní error presenter, jinak a tím není problém.
Editoval forkman (2. 11. 2010 10:30)
- JakubJarabica
- Gold Partner | 184
Hral som sa s tým asi dve hoďky asi pred mesiacom a tento kus kódu fixne
to blbé vloženie do session:
ErrorPresenter.php
<?php
public function renderDefault($exception) {
if ($this->isAjax()) { // AJAX request? Just note this error in payload.
$this->payload->error = TRUE;
$this->terminate();
} elseif ($exception instanceof BadRequestException) {
$this->setView('404'); // load template 404.phtml
} else {
/* fix notimplementedexception */
$session = Environment::getSession();
if($session->hasNamespace('Nette.Application/requests')) {
$session->getNamespace('Nette.Application/requests')->remove();
}
/* /fix */
$this->setView('500'); // load template 500.phtml
Debug::processException($exception); // and handle error by Nette\Debug
}
}
?>
Neviem, prečo presne to pomáha(resp. prečo sa to do toho namespacu vôbec dostane), ale už mesiac projekt s týmto „hackom“ funguje OK. Daj vedieť, či ide.
Editoval JAM3SoN (2. 11. 2010 11:16)
- David Grudl
- Nette Core | 8229
To vypadá, že v nějakém BasePresenteru se volá $application->storeRequest() a zároveň ErrorPresenter je potomkem BasePresenter, tudíž to volá taky. Je to možné?
Zkuste prosím tento patch v Application::storeRequest() přidat za
řádek $session[$key] = end($this->requests);
if (strcasecmp($session[$key]->getPresenterName(), $this->errorPresenter) === 0) {
$session[$key] = prev($this->requests);
}
- medhi
- Generous Backer | 255
David Grudl napsal(a):
To vypadá, že v nějakém BasePresenteru se volá $application->storeRequest() a zároveň ErrorPresenter je potomkem BasePresenter, tudíž to volá taky. Je to možné?
Ano, je to tak.
Zkuste prosím tento patch v Application::storeRequest() přidat za řádek
$session[$key] = end($this->requests);
if (strcasecmp($session[$key]->getPresenterName(), $this->errorPresenter) === 0) { $session[$key] = prev($this->requests); }
Bohužel nepomohlo.
- forkman
- Člen | 72
Tak mně trochu vrtalo hlavou proč je ten fix jen u Err 500, protože ta chyba se projevovala i u BadRequest. Pro úplnou spokojenost stačí upravit ErrorPresenter takto:
<?php
public function renderDefault($exception) {
if ($this->isAjax()) { // AJAX request? Just note this error in payload.
$this->payload->error = TRUE;
$this->terminate();
} elseif ($exception instanceof BadRequestException) {
// fix notimplementedexception
$session = Environment::getSession();
if($session->hasNamespace('Nette.Application/requests')) {
$session->getNamespace('Nette.Application/requests')->remove();
}
// /fix
$this->setView('404'); // load template 404.phtml
} else {
// fix notimplementedexception
$session = Environment::getSession();
if($session->hasNamespace('Nette.Application/requests')) {
$session->getNamespace('Nette.Application/requests')->remove();
}
// /fix
$this->setView('500'); // load template 500.phtml
Debug::processException($exception); // and handle error by Nette\Debug
}
}
?>
- David Grudl
- Nette Core | 8229
Tohle nebudu na straně frameworku fixovat, dejte si pozor, ať neukládáte do session požadavek na Error Presenter.