IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Erreur 500 AJAX (après X secondes)


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut Erreur 500 AJAX (après X secondes)
    Bonjour,

    Je rencontre un soucis sur lequel je bute depuis un moment, et je me demandais s'il y aurait une bonne âme pour m'éclairer.

    Un programme de mise à jour (fait maison), qui vient récupérer sur un serveur en local des informations (BDD + fichiers) pour les mettre à jour chez un client ne fonctionne pas comme je le souhaite... et je ne parviens pas à comprendre pourquoi.

    Deux fichiers :
    index.php, qui contient un tableau JavaScript avec un tableau d'actions, qui correspondent à chaque module du programme, et une boucle qui tourne, qui fait en sorte que dès que la requête ajax précédente est terminée, il exécute la suivante.
    index_ajax.php, le fichier appelé, qui contient des if / elseif avec le code pour la mise à jour de chaque module.

    Tout se passe bien... jusqu'à ce que le programme plante, avec un magnifique "internal server error 500" au bout de X secondes, en général autour de 32 secondes... mais trois fois sur cinq seulement. Et quand le programme fonctionne, la requête ajax en question met entre 1' et 1'10'' à s'exécuter (aucune exécution en dessous de 1 minute).
    J'ai bien pensé au max_execution_time, mais non, il est à 300 (je fais un ini_get juste au dessus pour m'en assurer).

    L'appel ajax qui plante est celui qui sert à transférer l'ensemble des programmes, un tar gz est construit, puis envoyé en FTP, comme indiqué sur le programme ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    // On initialise les variables
    $remote_file = 'librairie.tar.gz';
    $local_file = '../../librairie.tar.gz';
    $cmd = 'cd ../..;gunzip librairie.tar.gz;tar xvf librairie.tar;rm librairie.tar';
     
    // Execution du tar sur le serveur distant
    echo '<pre>'.file_get_contents('***/tar_librairies.php').'</pre>';
    // Connexion au serveur	
    $conn_id = ftp_connect($ftp_server,21,300);
    // Identification avec un nom d'utilisateur et un mot de passe
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
    // Activation du mode passif
    ftp_pasv($conn_id, true);
     
    // Vérification de la connexion
    if((!$conn_id) || (!$login_result)) {
    	echo 'Tentative de connexion ECHOUEE au serveur '.$ftp_server.' pour \'utilisateur '.$ftp_user_name;
    }
    else {
    	echo 'Connexion FTP r&eacute;ussie sur le serveur<br /><br />';
     
    	// Chargement d'un fichier
    	try {
    		$load_source = ftp_get($conn_id,$local_file,$remote_file, FTP_BINARY); 
    		if($load_source === FALSE)
    			throw new Exception('Erreur FTP GET : '.$load_source);
     
    		$output = shell_exec($cmd);
    		if($output == '' || $output === FALSE)
    			throw new Exception('Erreur Shell : '.$output);
    		echo '<pre>EXTRACTION DE LA LIBRAIRIE TAR :'.$output.'</pre>';
    	}
    	catch(Exception $e) {
    		echo $e->getMessage();
    	}
    	// On referme la connexion
    	ftp_close($conn_id);
    }
    Quelqu'un aurait-il une idée ? Encore une fois, la mise à jour fonctionne... de temps en temps.

    D'avance, merci !
    Bonne journée

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Erreur 500 est un retour générique pour une erreur.
    Il faut que tu consultes tes logs PHP et Apache pour connaitre l'erreur.

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Merci pour ce début de réponse.
    Le log PHP renvoie ceci :

    [Fri Oct 04 09:23:52 2013] [notice] mod_fcgid: process **/index_ajax.php(28308) exit(communication error), terminated by calling exit(), return code: 0

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu peux aussi faire des recherches par toi même sur cette erreur.

    Dans les logs PHP tu as quelque chose ?

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    C'était en cours, j'ai répondu au topic pour voir si quelqu'un trouvait plus rapidement que moi.

    J'ai une piste :
    Il faut modifier la configuration dans le fichier /etc/apache2/mods-enabled/fcgid_ispcp.conf, pour augmenter le temps (20 secondes par défaut chez moi)

    J'ai augmenté le temps à 300 secondes (vu la taille des fichiers sur lesquels je travaille) et... ça fonctionne ! Je fais encore quelques tests pour conclure à la résolution du problème. Merci pour la piste des logs !

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 201
    Points : 4 665
    Points
    4 665
    Par défaut
    bonjour,

    je note :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($output == '' || $output === FALSE)
    en cas d'erreur shell_exec retourne null et pas false !

    donc a mon avis vous ne traitez pas ces erreurs.

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Re-bonjour,

    A noter que je fais un triple égal, ce qui devrait quand même lui permettre de traiter l'erreur ?

    A priori, je me suis réjoui un peu vite, j'ai eu deux mises à jour qui sont passées à la suite alors que j'utilisais la bande passante à côté (dans le cadre du test), et là plus rien de nouveau.

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    A noter que je fais un triple égal
    Ben justement !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo null === false ? 'oui' : 'non'; // non
    echo null == false ? 'oui' : 'non'; // oui

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Papajoker veut justement dire qu'il n'y a pas de retour FALSE.

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 201
    Points : 4 665
    Points
    4 665
    Par défaut
    Citation Envoyé par Harold_le_Rouge Voir le message

    A noter que je fais un triple égal, ce qui devrait quand même lui permettre de traiter l'erreur ?

    .
    au contraire
    === signifie $output est strictement égal a false
    et false n'est pas strictement égal a null !!

    mais bon pas ça qui résout l'erreur

    edit:
    perso dans ce genre de script je me fais un log perso pour debug en cas de probleme
    time, taille fichier , action...


  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Par contre '' == FALSE == NULL.
    Ta première condition capte donc le cas NULL.

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Re-bonjour,

    Je vous ai épargné l'étape de débug, mais il y a des fwrite qui traine après chaque ligne, il s'avère que la première chose qui plante - parfois - est la commande ftp_get, qui doit mettre plus de 30 secondes.

    Depuis la modification du paramètre indiqué ci-dessus, je n'ai plus d'erreur 500, il me dit 200 OK (merci firebug), il plante quand même à 33 secondes et des bananes.

    Il semblerait que j'avais une erreur dans mon test au niveau de $load_source, un simple == doit suffire.

  13. #13
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Je reviens vers vous car ce n'est pas encore (malheureusement) résolu.

    Je penche vers un soucis au moment du file_get_content (qui exécute une commande) ou du transfert en ftp... j'ai constaté que lorsqu'on écoutait une radio en ligne au boulot (et qui donc occupe la ligne), ça plantait plus régulièrement.

    Quelqu'un aurait-il une idée ?

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Me revoici, 6 mois plus tard, toujours avec le même problème ^^'

    Mes Logs me sortent ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mod_fcgid: process 32101 going graceful shutdown, sending SIGTERM
    mod_fcgid: process 32101 graceful shutdown timeouted, sending SIGKILL
    mod_fcgid: process *******/index_ajax.php(32101) exit(communication error), get stop signal 9
    La première fois que j'ai posté ce message, j'ai pensé que cela n'arrivait que lorsque je travaillais sur du transfert FTP de plus de 30 secondes, et j'ai donc divisé mon transfert FTP en plusieurs parties, parce que je pouvais assez aisément le faire (même si j'aurais aimé comprendre l'erreur).

    Mais cette fois-ci, il s'agit d'un script PHP qui va ajouter, en fonction d'une base modèle, un index sur une autre base de données. Et cet ajout d'index plante grosso modo après 30 secondes (je dis grosso modo, parce que j'ai l'impression que c'est une commande en particulier, le mysql_query - ou la commande ftp auparavant - qui dépasse 30 secondes et fait planter le script). Il se peut que d'autres commandes se soient correctement exécutées avant l'ajout de cet index, faisant qu'il ne plante pas exactement à 30 secondes.

    J'ai recherché pendant un long, très long moment, mais je ne vois pas ce que ça peut être.
    Je bosse sur des sous-domaines sur un site SSL, il y a un sous-domaine maître qui contient la base maîtresse et qui nous permet d'appliquer de nouveaux index sur toutes les bases. Nous avons déjà tenté de modifier un grand nombre de paramètres dans fcgid.conf, sans succès pour le moment.

    Je serais très content si quelqu'un avait déjà rencontré cette erreur.

  15. #15
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 59
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Enfin la solution ! Merci à ceux qui ont tenté de m'aider.

    Si vous avez Webmin, il faut aller dans Serveurs -> Serveur Web Apache. Choisir le site en question et cliquer sur Serveur virtuel.
    Ensuite cliquer sur Edition des directives et chercher la ligne qui commence par : IPCCommTimeout.
    Vous mettez ce que vous voulez après, c’est la durée que va prendre au maximum une requête en seconde.
    IPCCommTimeout 240

    Sinon, il faut aller modifier le fichier de configuration dans /etc/apache2/sites-available/monsite.conf et rajouter la ligne IPCCommTimeout 240
    240 étant le nombre de secondes

    Enfin appliquer et le tour est joué !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] Erreur 500 Ajax+php upload file sur serveur ubuntu
    Par Jordan-Tess dans le forum jQuery
    Réponses: 0
    Dernier message: 02/12/2014, 11h23
  2. [AJAX] Erreur 500 Ajax - Post
    Par JayZon12 dans le forum AJAX
    Réponses: 3
    Dernier message: 31/08/2013, 13h36
  3. [Web Services] Erreur 500 après quelques temps
    Par Pill_S dans le forum Spring
    Réponses: 2
    Dernier message: 03/05/2010, 09h58
  4. [MySQL] Après modification d'un nom, j'ai "Erreur 500 : Erreur interne du serveur"
    Par swampsnake dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/05/2009, 09h08
  5. Réponses: 1
    Dernier message: 11/02/2008, 10h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo