Start session ve skriptu mimo Nette session poškodí

forkman
Člen | 72
+
+1
-

Začínám s Nette a nemůžu se vypořádat s jednou věcí. Integroval jsem si file manager třetí strany (Responsive filemanager) a ten si v konfiguraci nastartuje session a naplní ji svými proměnnými. To je všechno OK, ale jakmile se to stane, aplikace v nette mi hlásí:

Failed to decode session object. Session has been destroyed

Nejdřív jsem hledal problém v tom file manageru, ale udělá to i samotný skript, kde je pouze session_start();

Session jsem si před a po dumpoval a je lehce změněná. To samé jsem zkoušel na stejném serveru v jiném projektu s Nette 2.0.18 a tam je to OK. Kde by mohla být chyba? Dík

PHP	5.6.26
Tracy	2.4.6
Server	Apache/2.2.15 (CentOS)
Nette Framework	2.4
Myiyk
Člen | 321
+
0
-

S tímhle jsem se nesetkal, ale zkus se třeba podívat jaká je v nette podmínka na vyhození té chyby.

forkman
Člen | 72
+
+1
-

To jsem se snažil dohledat, ale zdá se, že chybu hodí přímo PHP, Nette skončí při pokusu nastartovat session při inicializaci Containeru.

Skonči to na:

Nette\Http\Session->start()

kde to doputuje až na:

Nette\Utils\Callback::invokeSafe('session_start', [], function ($message) use (&$e) {
88:                    $e = new Nette\InvalidStateException($message);
89:                });

Laděnka ukazuje, že v $_SESSION není vůbec nic. Dal bych ji sem komplet, ale nechci to tady zaspamovat :-)

Děje se to prostě tak, že se přihlásím do backendu, spustím php skript mimo nette, kde je pouze „session_start()“ a dummp proměnné $_SESSION (ta vykazuje nějaký obsah) a jakmile se vrátím do Nette, vyskočí Laděnka s uvedenou chybou a když si dumpnu $_SESSION znovu, je to najednou prázdné pole.

matopeto
Člen | 395
+
0
-

A session mas klasicke vstavane phpckovske filesystemove? nemas ich v db a zabudol si na zamykanie napriklad?

Editoval matopeto (28. 3. 2017 10:08)

forkman
Člen | 72
+
0
-

Session mám klasický ve FS. Vrtá mi hlavou proč to v jiném projektu nedělá. Downgrade Nette bohužel nepřipadá v úvahu kvůli hromadě závislosti.

forkman
Člen | 72
+
0
-

Tak jsem to vyřešil pevným nastavením cesty k sessions v config.neon

Od té doby to nedělá, nedává to smysl, ale je to vyřešené :-)

Šaman
Člen | 2633
+
0
-

Jen taková myšlenka bez hlubšího zkoumání – není ten druhý script spuštěn jako jiný uživatel? admin vs. www_user, nebo něco takového?

Editoval Šaman (1. 4. 2017 13:10)

forkman
Člen | 72
+
0
-

Tak se mi to objevuje i na produkčním serveru :-( Nedokážu si představit jak bych zvládl přes Apache pustit skript pod jiným uživatelem, takže asi ne. Ani jsem nedokázal tu chybu nasimulovat v jiném projektu se stejnou verzí Nette. Už fakt nevím.

bohumir
Backer | 3
+
+1
-

Ahoj,
vyzkoušej si nastavit session name v config.neon

session:
name: TESTXYZ
expiration: 14 days

forkman
Člen | 72
+
0
-

Tak to bohužel nepomohlo :-(

WellBloud
Člen | 5
+
0
-

Mám podobný problém, taky používám Responsive Filemanager v kombinaci s TinyMCE. Když si edituju článek a snažím se přes filemanagera vložit obrázek, tak mi to taky vyhodí Nette\InvalidStateException: Failed to decode session object. Session has been destroyed

Náhodou se vám to nepodařilo vyřešit?

forkman
Člen | 72
+
0
-

Náhodou se mi to povedlo, ale asi fakt náhodou. Dal jsem tam novější PHP a už to nedělá.

WellBloud
Člen | 5
+
0
-

forkman napsal(a):

Náhodou se mi to povedlo, ale asi fakt náhodou. Dal jsem tam novější PHP a už to nedělá.

Hm, já mám PHP 7.1.11 :) Ty máš 7.2?

Isigarek
Člen | 74
+
0
-

Mám podobný problém. Můj problém nastavá, když facebook extension, které jsem si vytvořil chce zjistit před tím než chce access token jestli už ho nemá v session (dělám long term access tokeny) a když to chce zjistit předem hned se bugne a vyhodí stejnou chybu.

Zkoušel jsem dokonce nepoužívat session z jádra (soubor vepsaný v neon.config) ale vzít session přímo z DI extension loadu a nic.

Isigarek
Člen | 74
+
0
-

Tak já už jsem to vyřešil ukládal jsem object uživatele do user storage, kde neumí být objekt a tak se kolečko polámalo.

forkman
Člen | 72
+
0
-

Já jsem neměnil nic krom verze PHP, upgradoval jsem na 5.6.24, teď mám 7.1.11 a stále OK.

WellBloud
Člen | 5
+
0
-

No, problém se mi nedaří zreplikovat, ale vím, že tam pořád je :) Povede se to vždycky na novém zařízení, který web ještě nenavštívilo. Vždy na 1. pokus v normálním a pak v anonymním režimu to spadne, ale pak už to jede jak má.
Budu ještě zkoumat a dám vědět až odhalím příčinu

WellBloud
Člen | 5
+
0
-

no příčinu jsem nezjistil, nicméně jsem upravil filemanagera tak, aby fungoval:

<?php
// $fldr = rawurldecode(trim(strip_tags($_GET['fldr']),"/") ."/");
$fldr = rawurldecode(trim(strip_tags($_POST['fldr']),"/") ."/");
?>
  • ve filemanager/config/config.php jsem se inspiroval tady a upravil (především zakomentoval session_start):
<?php
$container = require __DIR__ . '/../../../app/bootstrap.php';
$user = $container->getService('user');
$user->getStorage()->setNamespace(\App\AdminModule\Presenters\BasePresenter::USER_NAMESPACE);
if (!$user->isLoggedIn()) {
    $httpResponse = $container->getService('httpResponse');
    $httpResponse->redirect('/'); //redirect to homepage if user is not logged in
    exit;
}
// if (session_id() == '') session_start();
$_SESSION['RF']["verify"] = "RESPONSIVEfilemanager";
?>
Taco
Člen | 39
+
0
-

Jen pro zajímavost. Stalo se mi právě něco podobného, přesně stejná chyba. A problém byl v zaplněném /tmp adresáři.