PHP7 + Symfony 2.8, Imansible scrivere i dati di session

ho compilato php7 da solo (974f6c2a705). se eseguo php7 + php-fpm + nginx usando symfony ottengo questo errore:

(usando il pacchetto snc redis per le sessioni 🙂

Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/tmp) 

(usando il supporto nativo per la session 🙂

  Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/[...]/app/cache/dev/sessions) 

il problema sembra essere collegato a symfony, perché php ha accesso in lettura / scrittura alla cartella.

se eseguo nient'altro che questo codice, funziona:

 session_start(); $_SESSION['x'] = 4234; session_write_close(); 

eventuali suggerimenti o idee perché symfony non riesce a scrivere le sessioni?

PHP7 è più severo con la gestione delle sessioni per i gestori di sessioni personalizzate. Il gestore di session personalizzato di Symfony per il suo metodo di scrittura è, per qualsiasi motivo, restituendo false. In precedenza questo non ha provocato un errore, ma ora lo fa.

Poiché non disponiamo di molte informazioni su quale gestore di sessioni personalizzato stai usando, ti suggerirei di impostare un gestore di sessioni personalizzato diverso, se ansible, dal momento che la maggior parte di esse sembra restituire true.

Ecco i diversi gestori di sessioni Symfony, la maggior parte di essi sembra esplicitamente restituire true eccetto quelli di Memcache e WriteCheckSessionHandler:

https://github.com/symfony/symfony/tree/582f4753a343f230fbe18b4e9a0747d48351ddfb/src/Symfony/Component/HttpFoundation/Session/Storage/Handler

MODIFICARE:

Dal momento che menzioni il gestore di session Snc Redis Bundle, sei sicuro di utilizzare la versione più aggiornata? Un anno fa è stato modificato per restituire sempre true in scrittura:

https://github.com/snc/SncRedisBundle/blob/master/Session/Storage/Handler/RedisSessionHandler.php

AGGIORNARE

Presentato un bug a PHP per vedere se possiamo trovare un messaggio di errore più utile per le versioni future (si prega di votare o lasciare un commento sul bug report):

https://bugs.php.net/bug.php?id=71070

Se hai trovato questo thread a causa del messaggio di errore che appare in cima alla list in alcuni risultati di ricerca e non stai usando Symphony – cosa che è accaduta nel mio caso. Assicurati che il metodo di scrittura del gestore di session restituisca bool - true on success .

La documentazione di php session_set_save_handler non menziona questo. È tuttavia menzionato nella documentazione di SessionHandlerInterface :

Il valore di return (solitamente TRUE in caso di successo, FALSE in caso di fallimento). Nota che questo valore viene restituito internamente a PHP per l'elaborazione.

Nelle versioni precedenti di PHP, non restituire nulla non ha comportto un errore. Dal momento che PHP 7.0, restituendo nulla risulta nell'errore: Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/tmp) Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/tmp) .

Sembra che le versioni future di PHP pubblicheranno il messaggio leggermente più chiaro. Failed to write session data using user defined save handler.

Se si utilizza Symphony, la risposta di Chris Banks offre una soluzione più completa e più utile al problema originale.

Sono contento di vedere risolto il tuo problema – volevo semplicemente aggiungere un'altra nota per chiarezza se qualcuno che riceve questi errori inciampa su questo thread: gli errori ovviamente sono iniziati con un problema nel driver framework e / o nella sua configuration e questo è il motivo per cui l'aggiornamento è più recente filiale ha risolto il problema. Il messaggio di errore si è verificato perché PHP stava tentando di utilizzare il driver di session Symfony Redis e, a causa di problemi con la configuration, è stato ripristinato in sess.save_path in php.ini. Questo è il motivo per cui PHP non è riuscito a scrivere nella directory: stava tentando di utilizzare l'utente save_handler (Redis) con php.ini sess.save_path (file). Se sta per tornare ai valori predefiniti, dovrebbe usare anche l'impostazione php.ini sess.save_handler. Ad each modo, l'errore stesso in questo caso non punta al problema reale.

Ho avuto questo stesso problema quando mi sono trasferito da Apache PHP7 a PHP7-FPM. Solo la correzione per me era andare nella directory var della mia app Symfony e rimuovere tutti i file lì, correggere le autorizzazioni sulla var se necessario chmod 777. Successivamente ricaricare l'URL della mia app e andare bene. Successivamente, Symfony ricrea tutti i cache, i registri, le sessioni, ecc.