500 Internal server error, component Wakeup, notimplemented exception

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
JakubJarabica
Gold Partner | 184
+
0
-

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
+
0
-

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
+
0
-

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)

wdolek
Člen | 331
+
0
-

vyrobil jsem issue na GitHubu…

David Grudl
Nette Core | 8166
+
0
-

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
+
0
-

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
+
0
-

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 | 8166
+
0
-

Tohle nebudu na straně frameworku fixovat, dejte si pozor, ať neukládáte do session požadavek na Error Presenter.