web-dev-qa-db-fra.com

Échec de lecture des données de session sur PHP 7.1

Partage d'un problème que j'avais (et maintenant résolu).

Sur ma machine de développement, je lance IIS avec PHP. Je suis passé à PHP7 et tout à coup, mon code ne fonctionnait plus, renvoyant cette erreur ...

session_start (): impossible de lire les données de la session: utilisateur (chemin: C:\WINDOWS\temp)

Cela ressemble à un problème d'autorisations, non? J'ai donc passé beaucoup de temps à peaufiner les paramètres de php.ini et à essayer de modifier les autorisations des dossiers - sans succès.

Puis j'ai réalisé quelque chose. Voir ma réponse ci-dessous.

4
xtempore

J'ai finalement réalisé que le message n'avait pas de sens - l'application implémentait son propre gestionnaire de session à l'aide de la base de données. Dans la méthode read, les données de la session sont extraites de la base de données.

class Sess implements SessionHandlerInterface
...
    public function read($key)
    {
        $qKey = U_Data::quote($key);
        $dt = U_Data::datetime();
        $sql = <<<EOT
SELECT `sess_data` FROM `sess`
WHERE `sess_key` = $qKey 
AND `sess_exp_ts` > $dt
ORDER BY `sess_exp_ts` DESC
LIMIT 1
EOT;
        return U_Data::getOneVal($sql);
    }

La méthode U_Data :: getOneVal a un deuxième paramètre à renvoyer s'il n'y a pas de données correspondantes. La valeur par défaut est null et cela fonctionnait bien en PHP5, mais en PHP7.1, l'erreur était générée. Une simple modification consistant à renvoyer une chaîne vide au lieu de cela a résolu le problème.

        return U_Data::getOneVal($sql, '');

Tiens voilà. Si vous recevez un avertissement sur le fait que session_start ne fonctionne pas ET que vous implémentez votre propre gestionnaire de session, essayez de vérifier votre code dans la méthode read pour vous assurer qu'il renvoie toujours une chaîne.

(Remarque: U_Data est simplement ma propre classe d'utilitaire de données)

J'espère que cela économisera à quelqu'un d'autre les heures que j'ai passées à me creuser la tête!

30
xtempore

Recevais la même erreur moi-même. Après beaucoup de recherches sur Google et de jurons, il s'est avéré qu'il s'agissait d'un problème d'autorisations dans mon cas, bien que ce soit sur mon dossier racine htdocs, plutôt que sur le chemin mentionné dans le résultat de l'erreur. Les autorisations de dossier racine étaient de 700, alors que tout le reste était de 755 (je possède une installation de Joomla, qui prescrit 755 pour les autorisations de dossier). La réparation des autorisations du dossier racine a finalement débloqué le problème.

1
John Rix