[spip-dev] probleme formulaire forum SPIP3 vs un serveur

Bonjour,

Est-ce que ça ne concerne que mon serveur ou un problème sur d’autres ?

Sur un spip3 et extensions tout neuf, et sans plugins,
sur un serveur virtualisé chez Sivit :
Tous les formulaires fonctionnent, sauf les forums, en admin comme en privé.

Prévisualiser le message fonctionne.

Lorsqu’on clique sur “Message définitif : envoyer au site” ça mouline jusqu’à, soit :

  • une page blanche avec l’indication du cache d’admin jusqu’à 735.2 Mo
  • soit un Fatal error: Maximum execution time of 60 seconds exceeded in /home/web/afcinema.com/ftp/www/spip-svn/ecrire/inc/session.php on line 264

Si je reviens sur la page le message a en fait bien été posté.

Est-ce que ça ne concerne que moi, ou spip3/forum?
Je ne sais pas quoi chercher en particulier ou quoi indiquer à l’hébergeur si ça le concerne ?

Une idée, une piste sur la particularité des cvt du forum.

**Merci.** **A.**

NB : jamais eu ce problème sur le même serveur avec les forum en spip2.
En local avec Mamp aucun problème avec la même version spip3.

Bonjour,

Est-ce que ça ne concerne que mon serveur ou un problème sur d'autres ?

Ahhhh ! Je me sens moins seul tout à coup ... Exactement les mêmes symptomes. Je suis arrivé à quelques conclusions mais je ne suis pas sûr du tout de leur validité, j'ai posté ici mais sans réponse ...

En augmentant le niveau de log on se rend compte que le temps est passé dans un code qui gère les sessions; mon répertoire tmp/sessions est rempli de fichiers identiques avec des noms à rallonge. Pas de pb sur mon serveur de test, une différence notable est que sur le vrai serveur le système de fichiers est sous NFS, qui peut avoir ce genre d'effets.

Je vais essayer de reproduire le log correspondant et je le reposterai.

Espérons qu'on trouvera une solution !

  /v

Re-bonjour,

Ahhhh ! Je me sens moins seul tout à coup ... Exactement les mêmes
symptomes. Je suis arrivé à quelques conclusions mais je ne suis pas sûr
du tout de leur validité, j'ai posté ici mais sans réponse ...

En augmentant le niveau de log on se rend compte que le temps est passé
dans un code qui gère les sessions; mon répertoire tmp/sessions est
rempli de fichiers identiques avec des noms à rallonge. Pas de pb sur
mon serveur de test, une différence notable est que sur le vrai serveur
le système de fichiers est sous NFS, qui peut avoir ce genre d'effets.

Je vais essayer de reproduire le log correspondant et je le reposterai.

Voila, j'ai reproduit le problème. Le message se poste, il est en base et tout, on peut le voir dans l'espace privé comme public, mais le système ne rend pas la main et le même message se répète. J'ai mis la sortie ici :

  gist:1498201 · GitHub

(il y a des messages comme quoi iextra, notifications etc ne se chargent pas, mais les symptômes étaient exactement les mêmes avec un système vierge). J'ai mis aussi le contenu du tmp/sessions courant ici :

  gist:1498214 · GitHub

Que faire pour essayer d'y voir plus clair ? Y a-t-il un moyen (autre que de lire tout le code) de déterminer ce qui se passe ?

Je suis prêt à mettre les mains dans le cambouis, mais il faut me dire où est le cambouis :wink:

  /v

hello,
chercher les différences entre prod et local sous mamp (il y en a
forcemment une :wink: ) ...

à comparer : les versions de PHP : identiques ?
base mysql ou sqlite ?
la version exacte de spip pour essayer de reproduire ?
si tu as accès au fichier d'erreur apache aussi : y-a-t-il quelque
chose de remarquable ?

Ben.

Hello,

chercher les différences entre prod et local sous mamp (il y en a
forcemment une :wink: ) ...

Ouaip, il y en a une, c'est clair :wink:

à comparer : les versions de PHP : identiques ?

local = PHP de mac OS X = 5.3.6
prod = ce que m'a mis le CNRS = 5.1.6

(en particulier, _avant_ l'introduction de mysql_set_charset() mais c'est une autre histoire, la connexion db semble fermée au moment du bug.)

base mysql ou sqlite ?

MySQL les deux.

local = le MySQL de homebrew = 5.5.15
prod = ce que m'a mis le CNRS = 5.0.77

(mais a priori la partie db marche ? en tout cas le message est inséré.)

la version exacte de spip pour essayer de reproduire ?

svn://trac.rezo.net/spip/spip@1867 et extension forum 1.7.2 (mais je peux remplacer par HEAD si ça a une chance de résoudre, je sais qu'il ne faut pas mettre un site en prod sur une version svn mais maintenant c'est trop tard ... en tout cas j'ai guetté les commits, rien n'avait l'air de concerner ce problème à première vue).

si tu as accès au fichier d'erreur apache aussi : y-a-t-il quelque
chose de remarquable ?

À la même heure :

Maximum execution time of 30 seconds exceeded in /misc/htdocs/images/ecrire/inc/flock.php on line 383, referer: http://images.math.cnrs.fr/spip.php?page=forum&id_article=199

(la ligne contient un appel à is_readable()) (pour ça que je suspecte un problème avec NFS - j'ai peur de jouer avec _SPIP_LOCK_MODE mais quand j'avais essayé ça n'avait pas changé grand chose ...)

HTH.

  /v

Peux tu ajouter les lignes suivantes L155 et suivantes de inc/session.php, rejouer le cas qui plante et nous poster le spip.log ?

spip_log(« ajoute session $fichier_session cookie $duree »);

  • ob_start();
  • debug_print_backtrace();
  • $trace = ob_get_contents();
  • ob_end_clean();
  • spip_log($trace);

Hello,

chercher les différences entre prod et local sous mamp (il y en a

forcemment une :wink: ) …

Ouaip, il y en a une, c’est clair :wink:

à comparer : les versions de PHP : identiques ?

prod : PHP Version 5.2.0-8+etch15
local : PHP Version 5.2.17

base mysql ou sqlite ?

MySQL les deux.

prod : Version du serveur: 5.0.32-Debian_7etch11-log
local : Serveur: Localhost via UNIX socket Version du serveur: 5.5.9

donc comme Vincent, un php plus ancien
J’ai aussi un ovh en PHP Version 5.2.17 où ça marche

la version exacte de spip pour essayer de reproduire ?

SPIP 3.0.0-beta [18806] Forum1.8.0 - en test

A.

Je tombe en
Fatal error: Maximum execution time of 60 seconds exceeded in /home/web/afcinema.com/ftp/www/spip-svn/ecrire/inc/session.php on line 211

en spip.log que :
Dec 19 22:05:36 78.192.52.221 (pid 5945) :Pri:!INFO: update thread id_thread=6 avec array (
‘id_objet’ => ‘1’,
‘objet’ => ‘article’,
)
Dec 19 22:05:36 78.192.52.221 (pid 5945) :Pri:ERREUR: fonction execute_pipeline_notifications_destinataires absente : pipeline desactive

A.

J'observe dans tmp/session que j'ai bien mon fichier de session
1_b27d915f0553f80b441bd596e4f2d50a.php

+ un fichier de session nommé par exemple :
1_b27d915f0553f80b441bd596e4f2d50a.php.10701317374eefa9f08ec4f7.50870457

Pendant toute la tentative il se crée et disparait en boucle.

A.

Hello,

Je suis prêt à mettre les mains dans le cambouis, mais il faut me dire
où est le cambouis :wink:

Peux tu ajouter les lignes suivantes L155 et suivantes de
inc/session.php, rejouer le cas qui plante et nous poster le spip.log ?

spip_log("ajoute session $fichier_session cookie $duree");
+ob_start();
+debug_print_backtrace();
+$trace = ob_get_contents();
+ob_end_clean();
+spip_log($trace);

Cool, je ne savais pas qu'on pouvait faire une trace comme ça ...

  gist:1501142 · GitHub

Il y en a plein de paquets comme ça identiques, je n'en ai mis que 3. Pour info, au cas où ça aurait une influence, mon squelette ressemble à ça localement :

[(#SESSION{id_auteur}|oui)#FORMULAIRE_FORUM{#URL_PAGE{forum,id_article=#ID_ARTICLE}}

<div class="citer">Le comit&eacute; de r&eacute;daction se
r&eacute;serve le droit de mod&eacute;rer votre commentaire (par exemple
s'il estime qu'il n'a qu'un lien tr&egrave;s &eacute;loign&eacute; avec
l'article auquel il est attach&eacute;, ou si le ton employ&eacute;
n'est pas adapt&eacute; &agrave; un d&eacute;bat serein).</div>]

[(#SESSION{id_auteur}|non)
<p>Pour participer &agrave; la discussion merci de <a
   href="#URL_PAGE{perso}">vous identifier</a> (ou de <a
   href="#URL_PAGE{inscription}">vous inscrire</a> si vous ne l'avez pas
   encore fait).</p>
]

spip_log("ajoute session $fichier_session cookie $duree");
+ob_start();
+debug_print_backtrace();
+$trace = ob_get_contents();
+ob_end_clean();
+spip_log($trace);

Ha ! Trouvé la solution. Voici un patch,

  gist:1503543 · GitHub

Dans inc/cvt_autosave.php il y a une boucle sur $GLOBALS['visiteur_session'] et dans le corps de cette boucle la globale en question est modifiée. Le comportement de php doit être non spécifié dans un tel cas, en particulier ça a l'air de pouvoir tourner en rond ... Suffit de faire une copie de la variable et de l'utiliser pour la boucle. Donc, dans inc/cvt_autosave.php ligne 83 :

- foreach($GLOBALS['visiteur_session'] as $k=>$v){
+ $tmp_globals = $GLOBALS['visiteur_session'];
+ foreach($tmp_globals as $k=>$v){

Je te dirai si ça règle le problème durablement.

  /vincent

Je te dirai si ça règle le problème durablement.

Génial, merci.
Pour moi à première vue/premier essai ça semble bien régler le problème également.
A.

Super merci Vincent .

visiblement c'est intégré
http://core.spip.org/projects/spip/repository/revisions/18837

Et mathieu a ajouté un petit paragraphe dans son article
Outils de debug - La graine de Marcimat sur debug_backtrace

par contre je ne sais pas s'il peut y avoir d'autres cas similaires ?

~/svn/spip/spip$ rgrep foreach * | grep GLOBAL | grep -v svn
config/ecran_securite.php:foreach ($GLOBALS as $var => $val)
ecrire/install/etape_ldap4.php: foreach($GLOBALS['liste_des_statuts']
as $k => $v) {
ecrire/install/etape_ldap4.php: foreach
(is_array($GLOBALS['ldap_attributes']) ? $GLOBALS['ldap_attributes'] :
array() as $champ => $v ) {
ecrire/req/sqlite_generique.php: foreach ($GLOBALS['connexions'] as $s){
ecrire/genie/maintenance.php: foreach ($GLOBALS[$com] as $table => $desc) {
ecrire/base/convert_utf8.php: foreach ($GLOBALS['meta'] as $c => $v) {
ecrire/inc/utils.php: foreach (array_reverse(explode(':',
$GLOBALS['dossier_squelettes'])) as $d)
ecrire/inc/utils.php: foreach (array_reverse(explode(':',
$GLOBALS['dossier_squelettes'])) as $d)
ecrire/inc/cvt_autosave.php: foreach($GLOBALS['visiteur_session'] as $k=>$v){
ecrire/inc/auth.php: foreach ($GLOBALS['liste_des_authentifications']
as $methode)
ecrire/inc/auth.php: foreach ($GLOBALS['liste_des_authentifications']
as $methode) {
ecrire/inc/auth.php: foreach ($GLOBALS['liste_des_authentifications']
as $methode) {
ecrire/inc/auth.php: foreach ($GLOBALS['liste_des_authentifications']
as $methode) {
ecrire/inc/plugin.php: foreach
(unserialize($GLOBALS['meta']['plugin']) as $prefix=>$resume) {
extensions/grenier/inc/afficher_objets.php: foreach(explode(',',
$GLOBALS['meta']['langues_multilingue']) as $k){
extensions/grenier/inc/php3.php: foreach ($GLOBALS[$_table] as $var => $val) {
extensions/forum/formulaires/configurer_forums_notifications.php: foreach
($GLOBALS['liste_des_forums'] as $desc => $val) {
extensions/medias/inc/marquer_doublons_doc.php: foreach
($GLOBALS['medias_liste_champs'] as $champs_choisis) {