Attention, ceci est l'archivage statique d'un ancien site qui a maintenant disparu. En savoir plus.

Bienvenue sur , le recueil de réflexions et créations en tous genres de Nicolas Hoizey, passionné de Web depuis 1996, co-créateur et Directeur de l’Innovation de Clever Age, photographe amateur, créateur du jeu HTML5 / SVG « esviji », etc.

session_start() et exec() ne font pas toujours bon ménage en PHP

Publié le

par Nicolas Hoizey,

tagué fail, PHP et SPIP

et commenté 4 fois

SPIP utilise toujours son propre système de gestion de sessions applicatives alors que PHP les supporte depuis maintenant longtemps de façon satisfaisante. Ou pas...

Avec un SPIP 1.9.2c installé sur Windows Server 2003 SP2, avec Apache 2.2.6 et PHP 5.2.4, j’avais des plantages étranges sur la page de configuration avancée de SPIP et l’indexation ne marchait plus bien, certains articles passant au travers. Je n’avais pas ce soucis sur le même site déployé sur Linux ou Mac OS X.

Après bien des essais et lectures de code tant perso que de SPIP, il s’avère que PHP supporte mal l’usage simultané de sessions et de exec(). Le bug #22526 a beau dater de 5 ans et être clos, le problème se pose encore, manifestement.

J’avais en fait un session_start() dans mes_options.php pour avoir une session PHP active dans toutes les pages. Du coup j’avais un plantage, tant des exec() de test de librairies graphiques dans la configuration avancée, que des exec() d’extraction de contenus des documents dans l’indexation.

De proche en proche, j’ai découvert sur différents forums que le problème est bien d’actualité, et qu’heureusement une solution existe !

Il suffit de remplacer toutes les instructions telles que la suivante :

exec(...);

Par ceci :

session_write_close();
exec(...);
session_start();

Bien sûr, si le exec() en question se trouve après du code écrivant sur la sortie standard, il faudra utiliser les fonctions de bufferisation de sortie1 pour éviter les warning dûs à l’envoi de cookie par session_start().

Bien que les sources qui relatent ce problème et sa solution datent un peu, je peux vous confirmer que modifier de cette façon le source des fichiers présents dans ecrire/extract/*.php résout bien le problème.

Finalement, les sessions de SPIP sont meilleures que celles de PHP, au moins sur ce point... ;-)

Notes

1output buffering en anglais

Vos commentaires

  • Le 30 janvier 2008 à 16:38, par xavier En réponse à : session_start() et exec() ne font pas toujours bon ménage en PHP

    Ouh le méchant troll final ! :)

  • Le 30 janvier 2008 à 17:07, par Nicolas Hoizey En réponse à : session_start() et exec() ne font pas toujours bon ménage en PHP

    Mais non, c’est du factuel... ;-)

  • Le 27 novembre 2008 à 20:16, par Yannick En réponse à : session_start() et exec() ne font pas toujours bon ménage en PHP

    Bonjour,
    Après bien des recherches et des semaines de galère, je suis tombé sur votre article. Et là miracle ! Cela m’a permis de résoudre le problème suivant.
    Dans un contexte de mutualisation du noyau SPIP, les rédacteurs et administrateurs étaient régulièrement déconnectés du back-office (obligation de resaisir le mot de passe à chaque opération de mise à jour ou d’administration). Chose bizarre, cela ne se produisait pas sur les sites non mutualisés, pas sur tous les sites utilisant le noyau SPIP mutualisé, pas pour tous les utilisateurs et surtout lors d’une augmentation de la charge du serveur. Bref, en supprimant le session_start dans les différents fichiers mes_options.php des sites cela est allé beaucoup mieux. MERCI !
    Très cordialement.
    Yannick

  • Le 17 janvier 2010 à 11:57, par Maïeul En réponse à : session_start() et exec() ne font pas toujours bon ménage en PHP

    Article sans doute très intéressant, mais l’écriture en quasi blanc sur quasi fond noir le rend quasi illisble ;)

    j’ai du désactiver les css avec la barre developpeur de FF pour le lire