web-dev-qa-db-fra.com

PHP7 + Symfony 2.8, Échec d'écriture des données de session

j'ai compilé php7 par moi-même (974f6c2a705). si je lance php7 + php-fpm + nginx en utilisant symfony, j'obtiens cette erreur:

(en utilisant le bundle snc redis pour les sessions :)

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

(en utilisant le support de session natif :)

 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)

le problème semble être lié à symfony, car php a un accès en lecture/écriture au dossier.

si je n'exécute que ce code, cela fonctionne:

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

des suggestions ou des idées pour lesquelles symfony ne parvient pas à écrire les sessions?

17
timg

PHP7 est plus strict avec la gestion de session pour les gestionnaires de session personnalisés. Le gestionnaire de session personnalisé de Symfony pour sa méthode d'écriture renvoie, pour une raison quelconque, false. Auparavant, cela ne déclenchait pas d'erreur, mais maintenant c'est le cas.

Étant donné que nous n'avons pas beaucoup d'informations sur le gestionnaire de session personnalisé que vous utilisez, je suggère de définir un gestionnaire de session personnalisé différent si possible car la plupart d'entre eux semblent renvoyer true.

Voici les différents gestionnaires de session Symfony, la plupart d'entre eux semblent renvoyer explicitement true sauf pour ceux de Memcache et WriteCheckSessionHandler:

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

ÉDITER:

Puisque vous mentionnez le gestionnaire de session Snc Redis Bundle, êtes-vous sûr que vous utilisez la version la plus récente? Il y a un an, il a été modifié pour toujours retourner vrai lors de l'écriture:

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

[~ # ~] mise à jour [~ # ~]

Soumis un bug à PHP pour voir si nous pouvons trouver un message d'erreur plus utile pour les futures versions (veuillez voter ou laisser un commentaire sur le rapport de bug):

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

10
Clay

Si vous avez trouvé ce fil en raison du message d'erreur apparaissant en haut de la liste dans certains résultats de recherche et que vous n'utilisez pas Symphony - ce qui s'est produit dans mon cas. Assurez-vous que la méthode d'écriture de votre gestionnaire de session renvoie bool - true on success.

La documentation php session_set_save_handler ne le mentionne pas. Il est cependant mentionné dans la documentation SessionHandlerInterface :

La valeur de retour (généralement TRUE en cas de succès, FALSE en cas d'échec). Notez que cette valeur est retournée en interne à PHP pour le traitement.

Dans les versions antérieures de PHP, le fait de ne rien renvoyer n'a pas entraîné d'erreur. Depuis PHP 7.0, rien ne renvoie l'erreur: Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/tmp).

Il semble que les futures versions de PHP émettront un message légèrement plus clair. Failed to write session data using user defined save handler.

Si vous utilisez Symphony - alors la réponse de Chris Banks fournit une solution plus complète et plus utile au problème d'origine.

5
Steve E.

Heureux de voir que votre problème est résolu - je voulais juste ajouter une autre note pour plus de clarté si quelqu'un recevant ces erreurs bute sur ce fil: les erreurs ont évidemment commencé avec un problème dans le pilote de framework et/ou sa configuration et c'est pourquoi la mise à jour vers la dernière version branche a résolu le problème. Le message d'erreur lui-même s'est produit parce que PHP tentait d'utiliser le pilote de session Symfony Redis et, en raison de problèmes avec la configuration, est revenu à sess.save_path dans php.ini. C'est la raison = PHP n'a pas pu écrire dans le répertoire - il tentait d'utiliser l'utilisateur save_handler (Redis) avec le php.ini sess.save_path (fichiers). S'il va retomber aux valeurs par défaut, il devrait également utiliser le paramètre php.ini sess.save_handler. De toute façon, l'erreur elle-même dans ce cas ne pointe pas vers le problème réel.

2
DrBlueSpruce

J'ai eu ce même problème lorsque je suis passé d'Apache PHP7 à PHP7-FPM. Le seul correctif pour moi était d'aller dans le répertoire var de mon application Symfony et de supprimer tous les fichiers, de corriger les autorisations sur le var si nécessaire chmod 777. Ensuite, rechargez l'URL de mon application et c'est parti. Ensuite, Symfony recréera tout le cache, les journaux, les sessions, etc.

0
KungFuMonkey