Symfony 1.4, charger 2 pages en même temps.
22 novembre 2011 par: Benoit BonnevilleEn php si une page est en train de se charger et utilise une session, il n’est pas possible d’en ouvrir une autre.
Symfony ouvre toujours une session. Donc il n’est pas possible d’ouvrir deux pages en même temps.
Problématique
Utiliser session_start() en php, démarre une session. Par défaut la configuration php est d’utiliser des sessions en fichier.
Lors de l’appel de session_start() php crée un « lock » sur ce fichier, de manière à ce que seul votre script accède à la session.
Si vous essayer d’appeler une autre page utilisant session_start(), elle devra attendre la fin de le précédente avant de se charger.
Vous pouvez avoir des scripts qui sont long lors de :
- Script dans un backoffice, nombreuses requette SQL/Webservice
- Script de téléchargement de fichier
- Un front très mal codé
Solution
Utiliser session_write_close();
Mais apres ne modifez plus la variable $_SESSION car les données que vous y mettrez ne seront plus prise en compte.
Vous devez bien entendu placer session_write_close() AVANT votre code qui est long à exécuter de manière a libéré le vérrou (lock).
Le cas Symfony 1.4
Symfony est configuré par défaut pour démarrer avec une session. Avant de la fermé il faut y mettre les informations.
Donc vous devez ajouté le code suivant dans votre actions, juste avant le code qui est long à exécuter.
$this->getUser()->shutdown(); // Flush sfUser Data in session
$this->getContext()->getStorage()->shutdown(); // call session_write_close
Bien entendu, vous ne devez plus modifier votre $sf_user après cet appel.
PS: il doit y avoir un équivalent dans Symfony2. Une fois qu’il sera vraiment stable, je mettrai à jour ce post.