Comment redémarrer Apache sans réinitialiser les sessions utilisateurs?

8

L'utilisateur est connecté à un site Web PHP> Je redémarre Apache> L'utilisateur doit se reconnecter.

Comment éviter cela? (Je ne veux pas que l'utilisateur ait besoin de se reconnecter)

dowik
la source
Pour vérifier: vous avez la possibilité de modifier le PHP, non?
Peter Taylor
Si c'est votre propre application, je suggérerais ce que @Jacob Hume a suggéré ci-dessous et changer votre application pour stocker des sessions dans une table de base de données. Cela vous donne plus de contrôle à mon avis sur votre site car vous pouvez forcer les utilisateurs à se déconnecter si nécessaire de manière sélective.
Anagio
Je peux éditer PHP. J'utilise un CMS (Drupal). J'utilise également APC et je cherchais une solution de cette manière.
dowik

Réponses:

6

Le stockage d'un jeton de session dans un autre emplacement en tant que sauvegarde éviterait ce problème. Vous pouvez toujours conserver vos informations principales $_SESSION, mais conservez un jeton de sauvegarde:

  • Biscuits
  • Enregistrements de base de données
  • Stockage local HTML5

Vous pouvez trouver de l'aide dans cette question StackOverflow: meilleure pratique pour les délais d' expiration de session et la connexion persistante dans php .

Jacob Hume
la source
Merci pour la réponse et merci le lien. Je cherchais une solution sur le fichier de configuration côté serveur (sorte de "garder les sessions pendant le redémarrage"). Mais il semble que la solution se trouve du côté de l'application.
dowik
Oh mon ... En fait, je cherchais simplement "apache2ctl -k graceful"!
dowik
3

Vos données de session ne doivent pas être perdues simplement parce qu'Apache est arrêté ou redémarré à moins que les données de session ne soient stockées en mémoire et non sauvegardées sur disque (soit par le système de fichiers ou la base de données). Sinon, vous pourriez redémarrer l'intégralité du serveur et la session persisterait. Les données de session sont conçues pour être stockées à long terme. Le seul moment où la session est perdue est si:

  1. Le SID est perdu. Les données de session existent toujours côté serveur, mais le client ne peut pas récupérer le SID, il ne peut donc pas relancer la même session. Cela peut se produire si le cookie SID expire (s'il s'agit d'un cookie) ou si les liens de session sont perdus (si le SID est un paramètre d'URL) ou si le SID n'est pas défini côté serveur ou modifié sans en informer le client.

  2. Les données de session sont supprimées côté serveur. Cela se produit généralement lorsque PHP Garbage Collector de session s'exécute et voit que le fichier de session est plus ancien que session.gc_maxlifetime (qui est de 24 minutes par défaut). Sinon, cela peut se produire si l'application supprime explicitement la session . Sur certains serveurs, l'administrateur peut également avoir configuré un cronjob pour nettoyer régulièrement les anciennes données de session.

Lèse majesté
la source
Merci pour les détails. Je vais enquêter de cette façon. Mais pour l'instant, je vais simplement utiliser le redémarrage gracieux qui semble répondre à mes besoins.
dowik
@dowik: Comment un redémarrage gracieux répond-il à vos besoins? Votre problème a-t-il perdu des sessions ou interrompu des téléchargements? Si c'est le dernier, alors un redémarrage / arrêt gracieux résoudra cela. Mais ensuite, vous devez modifier votre question pour refléter cela. Parce que les redémarrages gracieux n'ont rien à voir avec les sessions PHP, et cela n'aidera pas les autres utilisateurs à essayer d'empêcher la perte de sessions.
Lèse majesté
J'ai essayé de mettre à jour le titre de ma question en remplaçant "sessions PHP" par "sessions utilisateurs" comme décrit dans le corps de ma question. Mieux pour toi? Pour être plus précis: j'utilise APC. Lorsque je change du code dans des fichiers PHP, je dois vider le cache APC (redémarrer Apache est le moyen le plus simple de le faire). Avec l'argument "redémarrer", les utilisateurs de mon site Web doivent se reconnecter. Alors qu'avec "gracieux", ils ne le font pas. C'est pourquoi "cela semble correspondre à mes besoins".
dowik
@dowik: Je ne pense pas que cela ait quelque chose à voir avec un redémarrage gracieux. Vous venez très probablement d'avoir un redémarrage qui a coïncidé avec le garbage collector des sessions PHP. Connectez-vous à nouveau et essayez de redémarrer régulièrement immédiatement après. Sauf si vous stockez des sessions en mémoire (MM), la session sera enregistrée.
Lèse majesté
1

Rendu possible en utilisant le bon argument avec Apache:

apache2ctl -k graceful

Apache redémarrera sans perdre les sessions en cours.

dowik
la source
2
Un redémarrage progressif reporte uniquement l'arrêt jusqu'à ce que les connexions en cours soient interrompues. Cela ne change pas le comportement de redémarrage.
Lèse majesté