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 :

Stopper script php


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut Stopper script php
    Bonjour !!

    Je suis entrain de faire un site de campagne d'emailing.

    J'ai mis en place un bouton play/pause pour l’envoie et l’arrêt de l'envoie des mails.

    Quand j'appuie sur play, l'id de la campagne choisie est envoyé à mon script php (envoie.php)

    mon script envoie.php récupère l'id et tout les mails correspondant à cet id et envoie les mails via un boucle while.

    Jusque la tout va très bien ! Le problème et le bouton stop !

    en effet, je voudrais interrompre l'envoie des mails puis reprendre lorsque j'appuie sur play

    ma question est donc comment puis je interrompre le script envoie.php ?? car une fois lancer il ne s'arrette qu'une fois tout les mails envoyer.



    Voici ma conf :

    la fonction qui est exécuté lorsque je clique sur le bouton play :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function lancerCampagne(idCampagne,idr,idx){
            compteur[idr] = setInterval("rafraichir("+idr+")", 1000);
            var url = 'consulter_campagne_lancer.php?id_camp='+idCampagne;
            xhr_object.open("GET",url, true);
            xhr_object.send(null);
            //filtre();
    }

    la fonction exécuter lorsque je clique sur le bouton pause :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function arreterCampagne(idCampagne,idr){
           clearInterval(compteur[idr]);
            var url = 'consulter_campagne_arreter.php?id_camp='+idCampagne;
            xhr_object.open("GET",url, true);
            xhr_object.send(null);
    }
    donc à ce niveau tout se stop grâce au setinterval mais le script php continue en arrière plan.

    mon script envoie.php :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    <?php
    if(isset($_GET['id_camp'])){
    $connect = mysqli_connect('localhost', 'root', '', 'test') or die(mysql_error());
    $id = $_GET['id_camp'];
    $sql = "select * from newcampagne where id = ".$id." ";
    $req = mysqli_query($connect,$sql)  or die ("ERROR SQL 2" .mysql_error());
    $aff = mysqli_fetch_assoc($req);
    		$nbr66 = $aff['id'];
            $nbr6 = 'copy'.$nbr66;
            //echo $nbr6.'<br/>';
    		$sql4 = "select * from ".$nbr6." ";
    		$req4 = mysqli_query($connect,$sql4)or die ("ERROR SQL 4".mysql_error());
    while ($resultat = mysqli_fetch_assoc($req4)) {
    		//sleep(10);
    		//$toto = $resultat['email'];
    		//echo $toto.'<br/>';
    		/*$nom = $resultat['nom'];
    		$segment = $resultat['segment'];
    		$message = $resultat['message'];
    		$sql2 = "select nom from segment where id = '".$nom."' ";
    		$req2 = mysqli_query($db,$sql2) or die ("ERROR SQL 2" .mysql_error());
    		$aff2 = mysqli_fetch_assoc($req2)
    		$nom_segment = $aff2;
    		$sql3 = "SELECT editeurtxt FROM newmess2 where objet = 'chat' "; //ORDER BY newmess2.id DESC";
    		$req3 = mysqli_query($connect,$sql3) or die("SQL Error 3: " . mysql_error());
    		$aff3 = mysqli_fetch_assoc($req3);
    		$pub = $aff3;
    		*/
    $mail = "".$resultat['email'].""; // Déclaration de l'adresse de destination.
    //echo $mail.'<br/>';
    if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)) // On filtre les serveurs qui rencontrent des bogues.
    {
    	$passage_ligne = "\r\n";
    }
    else
    {
    	$passage_ligne = "\n";
    }
    //=====Déclaration des messages au format texte et au format HTML.
    $message_txt = "Salut à tous, voici un e-mail envoyé par un script PHP.";
    $message_html = "qsdqqqdqdqdqdqdqdqdpub";
    //==========
     
    //=====Création de la boundary
    $boundary = "-----=".md5(rand());
    //==========
     
    //=====Définition du sujet.
    $sujet = "Hey mon ami !";
    //=========
     
    //=====Création du header de l'e-mail.
    $header = "From: \"toto\"<toto@gmail.com>".$passage_ligne;
    $header.= "Reply-to: \"toto\" <toto@gmail.com>".$passage_ligne;
    $header.= "MIME-Version: 1.0".$passage_ligne;
    $header.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;
    //==========
     
    //=====Création du message.
    $message = $passage_ligne."--".$boundary.$passage_ligne;
    //=====Ajout du message au format texte.
    $message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$passage_ligne;
    $message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
    $message.= $passage_ligne.$message_txt.$passage_ligne;
    //==========
    $message.= $passage_ligne."--".$boundary.$passage_ligne;
    //=====Ajout du message au format HTML
    $message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;
    $message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
    $message.= $passage_ligne.$message_html.$passage_ligne;
    //==========
    $message.= $passage_ligne."--".$boundary."--".$passage_ligne;
    $message.= $passage_ligne."--".$boundary."--".$passage_ligne;
    //==========
     
    //=====Envoi de l'e-mail.
    //mail($mail,$sujet,$message,$header);
     
    //==========
     
    //sleep(1);
    $sql5 = "delete from ".$nbr6." where email = '".$mail."'";
    $req5 = mysqli_query($connect,$sql5) or die ("ERROR SQL 5".mysql_error());
     
     
     
     
    }
    //$sql5 = "delete from ".$nbr6." where email = '".$mail."'";
    //$req5 = mysqli_query($connect,$sql5) or die ("ERROR SQL 5".mysql_error());
    }
     
    ?>
    Merci d'avance

  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
    Utilise une variable de session qui sera contrôlé à chaque tour de boucle.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Merci pour ta réponse !

    j'ai tester ceci dans mon fichier consulter_campagne_lancer.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while ($resultat = mysqli_fetch_assoc($req4) && $_SESSION['start'] == 'O') {
    Mais je sais pas comment envoyer la variable session ( $_SESSION['start'] == 'N') quand j'appuie sur le bouton pause..

    Peux tu m'eclairer stp ?

  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
    Pour le principe, en faisant la vérification tous les 20 tours de boucle afin de ne pas surcharger :
    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
     
    $i = 0;
    while ($resultat = mysqli_fetch_assoc($req4)) {
    if ($i%20) {
       session_start();
       if ($_SESSION['pause'] == TRUE) {
             exit();
       }
       session_write_close();
    }
    $i++;
     
    // ton code
     
    }
    Pour la modification de la variable de session, il faut seulement que tu fasses un appel ajax vers une page qui le fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    session_start();
    $_SESSION['pause'] = TRUE;
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Merci sabotage ! j'essaie de suite

  6. #6
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    tu es sur pour le if($i%20) ??

    Car ca ne marche pas j'ai simplifié le code en utilisant des variables comme ceci :

    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
     
    $connect = mysqli_connect('localhost', 'root', '', 'test') or die(mysql_error());
     
    $id = 105;//$_GET['id_camp'];
    $pos = 1;//$_GET['pos'];
    $sql = "select * from newcampagne where id = ".$id." ";
    $req = mysqli_query($connect,$sql)  or die ("ERROR SQL 2" .mysql_error());
    $aff = mysqli_fetch_assoc($req);
     
    		$nbr66 = $aff['id'];
            $nbr6 = 'copy'.$nbr66;
            //echo $nbr6.'<br/>';
     
    		$sql4 = "select * from ".$nbr6." ";
    		$req4 = mysqli_query($connect,$sql4)or die ("ERROR SQL 4".mysql_error());
     
     
     
    $i = 0;
    while ($resultat = mysqli_fetch_assoc($req4)) {
    if ($i%20) {	
    if  ($pos == 0) {
     	//session_start();
     
       	echo 'stop' ;
             exit();
       } 
     
    else if ($pos = 1){ 
     
     
    echo 'go' ;}
     
    }$i++;
    }
    Une fois qu'il entre dans le if ($pos = 1), il ne vérifie pas tout les 20 tours ça nouvelle valeur (je change la valeur $pos directement dans le fichier).

    As tu une idée ?

  7. #7
    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
    Il sort d'ou ce $pos ?
    Sinon oui j'ai fais le modulo a l'envers
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    quand tu dis : "Pour la modification de la variable de session, il faut seulement que tu fasses un appel ajax vers une page qui le fait"

    Peux tu me donner un exemple stp ?

    je suis parti sur une toute autre solution qui ne marche pas plus..

    J'ai mit un flag à chaque campagne. ce flag prend deux valeurs 'play' ou 'pause' . donc avant l'envoie d'un mail ma boucle verifie le flag.

    si flag = play il continue lenvoie sinon il sort de la boucle.

    voici le code :

    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
     
    while ($resultat = mysqli_fetch_assoc($req4) ) {
     
            $pos = $aff['position'];
            echo '1er pos : '.$pos.'<br/>';
     
        if ($pos == 'stop') {
            echo '2 eme pos : '.$pos.'<br/>';
            echo 'stop ok';
            exit();
        } else {
     
     
    echo 'pos : '.$pos.'<br/>';
    echo 'play ok';
     
    code....
    avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $pos = $aff['position'];
    qui recupere la valeur du flag.

    le probleme est qu'il recupere le flag lors du 1 er tour de la boucle puis c tout !

    donc quand je vais dans phpmyadmin pour changer la valeur du flag rien ne se passe mon envoie ne sarrete pas immédiatement..

    Par contre mon envoie sarrete quand je relance mon script php (il ne s’arrête pas immédiatement mais après environ 13 secondes)

    As tu une idée ??

  9. #9
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Probleme résoluuuuuuu !!!!!!
    Donc je pars du principe requete => Réponse !
    Alors voici mon nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    while ($resultat = mysqli_fetch_assoc($req4) ) {
     
            $sql99 = "select * from newcampagne where id = ".$id." ";
            $req99 = mysqli_query($connect,$sql99)  or die ("ERROR SQL 2" .mysql_error());
            $aff99 = mysqli_fetch_assoc($req99);
            $pos = $aff99['position'];
            echo '1er pos : '.$pos.'<br/>';
     
        if ($pos == 'stop') {
            echo '2 eme pos : '.$pos.'<br/>';
            echo 'stop ok';
            exit();
        } else {
    a chaque tour on execute la commande sql99 pour recuperer la valeur !! et sa marche parfaitement !

    Je sais pas si c top comme technique mais la g pas le choix en tout cas merciiiiiiiiiiiii

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut Ou déclencher l'Ajax ?
    Bonjour,
    Je me permets de ré-ouvrir la discussion ayant le même problème
    J'ai voulu suivre la solution suggérée par Sabotage
    mais étant débutant, je ne sais pas ou placer la génération d'appel Ajax ..

    Sur une page simple (pas de processus long) , j'ai crée un bouton "Stop" dont le clic déclenche via jQuery un appel Ajax que je peux suivre via l'inspecteur du navigateur .. mais dans ce cas il ne sert plus à rien

    Sur cette même page, j'ai ajouté un sleep(30); -> le bouton n'apparait qu'à la fin (même si je l'ai "programmé" avant le sleep) et ne sert donc plus à rien
    N'étant pas sûr qu'un sleep(30) équivalait à 30 sleep(1), je l'ai remplacé par une boucle 30 fois sleep(1) : idem


    J'ai ensuite modifié ma page : un bouton "go" qui rappelle la même page avec un POST, une fonction sleep qui ne s'active que si un POST existe, et un bouton 'stop' censé arrêter le tout
    En Jquery en cas de clic sur 'stop' j'ai ajouté des modifications de couleur, .. du bouton et le déclenchement de l'appel Ajax
    Si clic sur 'Go', le bouton 'stop' reste affiché (l'affichage de la page n'est pas mis à jour tant que le sleep n'est pas terminé) et si je clic dessus il change bien de couleur,.. mais pas d'appel Ajax
    Si je déplace le bouton 'stop' à la fin de la page et que j'attends la fin du processus, le clic sur 'stop' génère bien l'appel Ajax .. après la bataille !

    Quelle est la solution ?
    Gérer l'arrêt depuis une autre page ??

    Par avance, merci
    Bertrand

  11. #11
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Bien, tu nous as donné une description prosaïque de ton application, maitenant ça serait bien que tu nous donnes le code pour voir si ça colle avec ce que tu as décrit. En particulier, il y a cette histoire :
    Citation Envoyé par 105rn2 Voir le message
    Sur cette même page, j'ai ajouté un sleep(30); -> le bouton n'apparait qu'à la fin (même si je l'ai "programmé" avant le sleep)
    C'est assez vague et on ne peut pas deviner ce que tu as voulu dire exactement. Montre nous le code de cette « page simple » et on verra si elle est aussi simple que tu le dis

    Il y a un truc que je ne comprends pas bien, c'est l'intérêt du sleep. Retarder l'affichage d'un objet ça se fait côté client. En utilisant un sleep, tu rallonges artificiellement la durée de la réponse HTTP que ton serveur envoie au navigateur client, et :
    1. tu n'as aucune garantie que ça marche dans 100% des cas (plus une connexion reste ouverte longtemps, plus elle a de chances d'être interrompue)
    2. c'est du gaspillage de ressources pour ton serveur, pour le client, et pour le réseau entre les deux.

    Il y a aussi une chose dont il faut se méfier quand on est débutant, et comme tu as dit que tu étais débutant… Cette chose c'est mélanger le JavaScript et le PHP. Ce n'est pas une mauvaise chose en soi, mais c'est facile de faire des erreurs, et ça fait des erreurs difficiles à comprendre.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonsoir Watilin et merci de votre proposition d'aide,
    J'ai oublié de préciser que l'application est en localhost et à vue pédagogique (quand on débute, il faut bien apprendre;-) donc les ressources réseau, serveur,.. ne sont pas (encore) ma priorité
    En déplacement, je n'ai pas accès à ma source ce soir, mais la posterai mercredi au + tard
    Mais rapidement et en attendant :
    - les processus longs (processus de listage de fichiers, ou de manipulations de fichiers Excel .. sur mon intranet ) peuvent réellement durer très longtemps : je rallonge le temps dispo par des "set_time_limit"
    - la page comporte un form pour saisir les No de début et fin, et se rappelle elle même avec un isset($_POST) au début (peut être une complication inutile.. )
    - L'appli fonctionne correctement mais il n'y a pas de possibilité de l'interrompre proprement

    Pour me familiariser (ou commencer pour être plus précis) avec Ajax/ js j'ai essayé d'appliquer la méthode proposée par Sabotage
    - pour baliser mes essais je demande à js de modifier la couleur des boutons, d'en ajouter (on s'amuse avec pas grand chose) et je suis les requêtes Ajax sur l'inspecteur du navigateur
    - voyant s'effectuer les modif de couleur mais pas l'appel Ajax (sauf à la fin du chargement de la page),
    --- je n'ai pas ajouté la vérification de demande d’arrêt
    --- j'ai épuré au maximum ma page pour ne garder que sa structure (sans processus )-> l'appel Ajax est bien lancé quand la page est chargée
    --- j'ai ajouté un sleep (30) pour simuler mon processus long (et ainsi l'innocenter' sans attendre 1/4h entre chaque essai -> même comportement qu'avec le processus
    --- ne sachant pas trop si un sleep trop long pouvait empêcher la génération de l'appel Ajax ( je l'ai remplacé par une boucle de 30 sleep(1) -> idem, tant que la page n'est pas chargée, il n'y a pas d'appel Ajax

    J'ai surement fait une grosse boulette .. mais ou ??
    Bertrand

    PS :
    Le fait de décrire son problème permet généralement d'y réfléchir ...
    Au vu de la fonctionnalité suggérée (arrêt d'un processus long) je suppose qu'une requête Ajax peut être lancée avant le chargement complet de la page
    Mon script étant situé en fin de page, peut être est-ce pour cela qu'il faille attendre le chargement complet pour que l'appel Ajax soit possible ?
    Les changements de couleurs demandés par js seraient alors dus au fait que la page se rechargeant elle-même, ils s'appliquent sur la 1ère affichée pas encore effacée par la suivante ?
    Ou alors je suis encore à coté de la plaque ..

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonsoir,
    Rentré plus tôt que prévu, donc voila le code en question :
    J'avais oublié que pour mes essais, j'avais mis 2 boutons 'stop' : le premier ajouté via JS sur la page lors de son 1er chargement, le second affiché lors de son rechargement mais qui n'apparait que lorsque tout est fini
    Je sais que je pourrais en remplacer une partie par des fonctions ..

    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
     
    <?php
    // Fichier ----> stopProcessus.php
     
    // TODO Test si Session Already started
    //session_start();
    $_SESSION['arret'] = 'oui';
    //session_write_close();
     
    // on relit la valeur . .au cas ou ...
    $retour = $_SESSION['arret'];
    if ($retour =='oui')
        {
            die('Demande bien inscrite');
        }else{
            header('500 Internal Server Error', true,500);
     
       die("Erreur relecture session");
        }
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    // Fichier ----> testAjax3.js
     
    (function ($) {
     
        //actif que pour le Bouton de Form ayant btnGo dans sa class 
        // on met 'one' et non 'on'pour qu'on ne puisse plus recliquer dessus   
        $('form').one('click','#btnGo',function(e) {
            //change la couleur de fond à vert
            var $btnGo = $(this);
            $btnGo.css('background', '#7FDD4C');
            // met la couleur de sa police à noir
            $btnGo.css('color', '#000');
            // change le libellé du bouton // attention syntaxe selon versions et types btn
            // TODO clarifier ces instructions différentes
            $btnGo.attr('value','Processus en cours');
            $btnGo.text('Processus en cours');
            // efface le bouton Abandon
            $('#btnAbandon').fadeOut();
            // ajoute un bouton
            $('form').append('<a id="btnEnCours" class="btn btn-primary btn-sm active" href="#" >En Cours = xxxxx</a>');
            $('form').append('<a id="btnStop1" class="btn btn-primary btn-sm active" href="#" >Stop Processus</a>');
     
            $('#btnEnCours').css('background', '#568203'); 
            $('#btnEnCours').css('margin', '3px');
            $('#btnStop1').css('background', '#DC143C');
            $('#btnStop1').css('margin', '3px');
     
        });
     
     
        $('form').on('click','#btnStop1',function(e) {
            e.preventDefault();// court-circuite le click
            var $btnStop1 =  $(this);
            var url ='stopProcessus.php';
            $btnStop1.css('background', '#AD4F09');
            $btnStop1.text('Demande enregistrée');
            $.ajax(url)
                    .done(function(data, text, jqxhr){
                        //alert("demande d'arrêt prise en compte !");
                        //console.log('Retour Ok demande arret');
                        console.log('retour Ajax = ' +data);
                        $btnStop1.css('background', '#E67E30');
                        $btnStop1.text('Arrêt en Cours');
                    })
                    .fail(function(jqxhr){
                        alert(jqxhr.responseText);
                    })
                    .always(function(){
                         console.log('demande Ajax envoyée à '+url);
            });        
        });
     
     
        $('form').on('click','#btnStop2',function(e) {
            e.preventDefault();// court-circuite le click
            var $btnStop2 =  $(this);
            var url ='stopProcessus.php';
            $btnStop2.text('Demande enregistrée');
            $.ajax(url)
                    .done(function(data, text, jqxhr){
                        //alert("demande d'arrêt prise en compte !");
                        //console.log('Retour Ok demande arret');
                        console.log('retour Ajax = ' +data);
                         $btnStop2.text('Arrêt en Cours');
                    })
                    .fail(function(jqxhr){
                        alert(jqxhr.responseText);
                    })
                    .always(function(){
                         console.log('demande Ajax envoyée à '+url);
            }); 
        });
     
    })(jQuery);
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    <?php 
    // Fichier ----> test3.php
     
    include 'header.php'; 
    require '/classe/Parametres.php';
     
    // session_start(); // TODO Test si Session Already started
    $retourON=false;
    $erreurId=false;
     
     
     
    if (!empty($_POST))
        {
            $retourON=true;
        }else{
            $_SESSION['arret'] = 'non'; // Initialisation
        }
    ?>
     
     
    <div class="container-fluid">
         <header class="page-header">
           <h1>Test Ajax</h1>        
         </header>
     
        <div class="row">
                <?php include 'menuGauche.php';?>
     
               <div class="col-lg-8"> 
     
                    <?php 
     
                    include '/template/wellTestEntete.php';  
     
                    if ($retourON)
                    {
                        include '/template/wellTestErreurId.php';
     
                        ?>
                        <form id="formtest">
                            <a id='btnStop2' class='btn btn-primary btn-sm active' href='#' >Stop Processus</a>
                        </form>
                        <?php                 
     
                        if(!$erreurId)
                            {   
                                for ($i = 0; $i < 30; $i++)
                                    {
                                        // TODO test si arret demandé si $_SESSION['arret'] = 'oui'
                                        sleep(1);
                                    }                 
                               }              
                       }else
                        {
                            include '/template/formTestIdMinMax.php';
                        }
                    ?>
     
                </div><!-- Col 8--> 
     
                <?php include 'menuDroit.php';?>
        </div> <!-- Row 1--> 
    </div>  <!-- container --> 
     
    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="bootstrap/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="js/testAjax3.js"></script>
    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
    39
     
    <?php 
    // Fichier ----> wellTestErreurId.php
    ?>
     
    <div id="wellTestErreurId" class="well well-sm">
    <?php           
        if(is_numeric(trim(($_POST['IdDebut']))))
            {
               $idDebut=trim(($_POST['IdDebut']));
            }else{
               $erreurId=true;
               echo'<p class="alert alert-danger" role="alert">Id Début ne correspond pas à une valeur numérique !<p>'; 
            }
        if(is_numeric(trim(($_POST['IdFin']))))
            {
               $idFin=trim(($_POST['IdFin']));
               $_SESSION['idFinPrev']=$idFin;
            }else{
               $erreurId=true;
               echo'<p class="alert alert-danger" role="alert">Id Fin ne correspond pas à une valeur numérique !<p>'; 
               //exit();
            }
     
        if(!$erreurId && $idDebut>$idFin)
            {
                $erreurId=true;
                echo'<p class="alert alert-danger" role="alert">Id Fin doit être supérieur à Id Début !<p>'; 
            }   
     
            if(!$erreurId)
            {
                echo'<p class="alert alert-success" role="alert">Valeurs spécifiées correctes !<p>'; 
            }else{ 
                echo'<p class="alert alert-danger" role="alert">Veuillez réactualiser cette page !<p>';
            }      
     
    ?>
    </div>
    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
     
    <?php
    // Fichier ----> formTestIdMinMax.php
     
    $adresseEnCours=$_SERVER['PHP_SELF'];
     
    $idDebutDefaut=100;// valeur si pas encore de session ouverte
    // On récupère valeurs précédentes
    if(isset($_SESSION['idFinPrev']))
        {                             
            $idDebutDefaut=$_SESSION['idFinPrev']+1;                             
        } 
    $idFinDefaut=$idDebutDefaut+100;
     
    ?>
    <div id='formTestIdMinMax' class="well well-lg"> 
        <h2><strong>No de début et de Fin à traiter</strong></h2> 
        <p>Date et heure d'affichage : <?php echo date("d-m-Y  H-i-s") ?></p> 
     
        <form name="Formulaire" action="<?php echo $adresseEnCours ?>" method="post">      
     
            <!-- http://fr.lesite.com/forum/sujet/aligner-des-zones-de-saisies-13098 -->
            <p><label for="IdDebut">No Début :</label><input type="text" value=<?php echo $idDebutDefaut ?> name="IdDebut" size=6/></p> 
            <p><label for="IdFin">No Fin :</label><input type="text" value=<?php echo $idFinDefaut ?> name="IdFin" size=6/></p> 
     
            <input type="submit" id="btnGo" name="envoyer" value="Lancer le Processus" class="btn btn-primary btn-sm active" />
            <a id="btnAbandon" class="btn btn-primary btn-sm active" href="index.php" >Retour Index</a> 
     
        </form>
    </div>

    Par avance merci de vos critiques
    Bertrand


    PS : définition Larousse de 'prosaïque' : "Qui est dépourvu de noblesse, de distinction, d'élégance" ou "Se dit d'une remarque bassement matérielle, réaliste " ...

  14. #14
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par 105rn2 Voir le message
    PS : définition Larousse de 'prosaïque' : "Qui est dépourvu de noblesse, de distinction, d'élégance" ou "Se dit d'une remarque bassement matérielle, réaliste " ...
    Pardon pour ce choix de mot malheureux. Pour moi, la prose c'est simplement ce qui n'est pas écrit en vers. Et par extension, j'ai pris l'habitude d'utiliser ce mot quand on décrit un programme en langage de tous les jours au lieu de montrer du code. Ce n'est pas du tout péjoratif de ma part

    Je pense avoir bien compris ce que tu veux faire, mais avant de voir ton code je ne savais pas comment tu voulais le faire. Dans l'ensemble, ton code est bien écrit, j'ai juste quelques petites remarques que j'ai placées plus bas. Pour résumer, et pour voir si j'ai bien compris :
    1. Tu lances un script volontairement long avec des sleep pour simuler un processus externe ;
    2. Par Ajax, tu cliques sur un bouton Stop pour signaler au serveur que tu veux que le processus s'interrompe ;
    3. Le script serveur qui reçoit l'appel « Stop » place une variable de session 'arret' à 'oui' ;
    4. Le script long, qui était toujours en cours d'exécution, note le changement de la variable $_SESSION['arret'], et s'arrête.


    Sur le papier c'est une belle idée. Techniquement, tu te heurtes à deux difficultés :

    1. L'output buffering, ou temporisation de sortie. Ton serveur met en place un ou plusieurs tampons de sortie, car il est préférable d'envoyer quelques paquets de données de taille moyenne plutôt qu'une multitude de petits paquets. Il y a plusieurs choses à « désamorcer » dans la configuration de ton serveur, et ce commentaire m'a bien aidé à trouver le problème dans mon cas : avec Wamp 2.4, il faut appeler ob_end_flush et ob_implicit_flush au début du script.
    Ceci te permettra de faire apparaître le bouton Stop avant la fin de la bataille

    2. Le verrouillage de session. C'est écrit ici :
    Citation Envoyé par le manuel
    […] durant toute l'exécution du script, les données de session sont verrouillées en écriture, et un seul script peut opérer sur la session en même temps.
    Avant de commencer ton long traitement, il faut que tu « libères » la session afin que le script stopProcessus.php puisse écrire dessus. Et pour pouvoir obtenir une valeur à jour de $_SESSION['arret'], je n'ai pas trouvé d'autre solution que de rappeler session_start à chaque itération, précédée d'un @ pour étouffer le warning qui dit que les en-têtes ont déjà été envoyés. Et rappeler session_write_close après avoir fait le test*. Je dois avouer que je ne trouve pas ça élégant, mais ça marche…

    * Si tu as PHP 5.6 ou supérieur tu peux utiliser session_abort à la place, ça sera certainement plus efficace.




    Pour vérifier qu'une session a déjà été ouverte, tu peux utiliser session_status. Ça ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (session_status !== PHP_SESSION_ACTIVE) {
        session_start();
    }
    Mais vu que tes includes semblent plutôt bien organisés, je pense que tu peux savoir à l'avance à quels endroits la session est censée être ouverte ou pas, et donc te passer de ce test.


    Autre petit détail, je te propose de remplacer tes tests is_numeric (qui t'obligent à utiliser trim) par des conversions avec intval.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $idDebut = intval(($_POST['IdDebut']));
    if ($idDebut === 0) {
       $erreurId = true;
       echo '<p class="alert alert-danger" role="alert">
          Id Début ne correspond pas à une valeur numérique !
       </p>';
    }
    intval est tolérante avec les espaces et donne 0 quand elle n'arrive pas à convertir. Tu peux utiliser l'apparition de ce 0 comme un signe d'erreur, ou bien considérer que c'est une valeur par défaut, si ça ne pose pas de problème dans ton application.
    De plus, tu peux ajouter de la souplesse dans ton application en autorisant l'inversion de $idDebut et $idFin (tout le monde peut faire des erreurs) grâce aux fonctions min et max :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $min = min($idDebut, $idFin);
    $max = max($idDebut, $idFin);
    $idDebut = $min;
    $idFin = $max;
    Ma dernière remarque concerne jQuery : quand tu modifies plusieurs styles sur le même élément, il y a une syntaxe légèrement plus courte :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    $btnGo.css({ background: '#7FDD4C', color: '#000' });
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  15. #15
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonsoir Watilin et encore une fois merci de ton temps,
    Pour prosaïque, si j'en ai cherché la définition, c'est que je ne l'a connaissais pas moi même .. et il semble étonnant qu'il n'existe pas d'adjectif correspondant à prose, je suppose qu'on doit dire "en prose" : donc aucun problème :-)

    Le fonctionnement que j'avais imaginé est effectivement celui que tu décrits des points 1 à 4 sauf que je ne compte faire le test que toutes les x itérations (if $i % x ==0 ...)
    Comme je l'avais pressenti (sans pouvoir l'expliquer clairement) je pense que le pb est lié au fait que la 2nde page (ou plutôt le 2nd affichage de la page) n’apparait que lorsque tout est fini
    J'avais par ailleurs déja essayé les flush ... mais sans aucun résultat

    Je suis sous WampServer Version 2.5 et PHP 5.5.12, je vais donc creuser dans la direction que tu m'indiques ob_end_flush / ob_implicit_flush

    Merci encore pour tes conseils que je vais mettre à profit,
    En me relisant, et au risque d'abuser / être HS, je retrouve un TODO dans mon JS : quand utiliser attr('value','xxx' plutôt que text('xx'), les 2 ne marche pas chaque fois mais ne créent pas d'erreur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     // TODO clarifier ces instructions différentes
    $btnGo.attr('value','Processus en cours');
    $btnGo.text('Processus en cours');
    J'essaie tout ça et je reviens confirmer que ton va mieux ;-)
    Merci encore
    Bertrand

  16. #16
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonjour,
    J'ai fait quelques essais :
    1) Pour m'affranchir des pbs de Session (pas tout faire en même temps) j'ai modifié mon stopProcessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?php
    // Fichier ----> stopProcessus4.php
     die('Demande enregistrée');
    2) sans trop comprendre le pourquoi du comment, j'ai ajouté en début de ma page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @apache_setenv('no-gzip', 1);
    @ini_set('zlib.output_compression', 0);
    @ini_set('implicit_flush', 1);
    for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
    ob_implicit_flush(1);
    3) J'ai supprimé le BoutonStop1 généré en page 1 par JS
    4) Résultat :
    La page 2 donc le btnStop2 apparaissent instantanément et le curseur indique bien que le processus (boucle de sleep) tourne encore !!
    Mais selon l'inspecteur Chrome les jQuery.js, bootstrap.min.js et testAjax4.js ne sont pas chargés avant la fin du processus, et donc le btnStop n'est pas opérationnel avant la fin du processus
    5) J'ai déplacé le chargement des 3 fichiers js en début de page, ils se chargent bien mais le résultat est pire (même en fin de process le BtnStop n'est plus opérationnel)

    Pas simple ..
    Bertrand

    [EDIT] Pour être sûr du flush , j'ai ajouté un echo à chaque itération du processus : il s'affiche bien à chaque itération !!

  17. #17
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par 105rn2 Voir le message
    En me relisant, et au risque d'abuser / être HS, je retrouve un TODO dans mon JS : quand utiliser attr('value','xxx' plutôt que text('xx'), les 2 ne marche pas chaque fois mais ne créent pas d'erreur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     // TODO clarifier ces instructions différentes
    $btnGo.attr('value','Processus en cours');
    $btnGo.text('Processus en cours');
    En fait, ça dépend de la structure HTML de ton élément. Si c'est un <a>, il contient du texte, et donc tu dois modifier son contenu avec la méthode .text. En revanche si c'est un <input>, il n'a pas de contenu, mais comme la plupart des champs de formulaire il a un attribut value. Tu peux modifier cette value
    - soit avec la méthode générique .attr,
    - soit avec la méthode .val qui est spécialement adaptée aux champs de formulaire.
    Mention spéciale pour l'élément <button> qui est un élément de formulaire mais qui n'a pas d'attribut value. À l'instar du <a>, il peut avoir du contenu.

    Citation Envoyé par 105rn2 Voir le message
    4) Résultat :
    La page 2 donc le btnStop2 apparaissent instantanément et le curseur indique bien que le processus (boucle de sleep) tourne encore !!
    Mais selon l'inspecteur Chrome les jQuery.js, bootstrap.min.js et testAjax4.js ne sont pas chargés avant la fin du processus, et donc le btnStop n'est pas opérationnel avant la fin du processus
    5) J'ai déplacé le chargement des 3 fichiers js en début de page, ils se chargent bien mais le résultat est pire (même en fin de process le BtnStop n'est plus opérationnel)
    Dans un cas normal, le principal problème serait de répondre à la question : à quel moment le DOM de la page est-il prêt pour que mon JavaScript puisse accéder aux éléments qui s'y trouvent ? Quand on place les scripts à la fin de la page, il n'y a pas de problème. Quand on les place au début, on a coutume d'attacher sa fonction principale à l'évènement DOMContentLoaded.

    Dans ton cas, tu ne peux pas placer les scripts à la fin car ils arriveraient après le long traitement ; tu ne peux pas non plus utiliser l'évènement DOMContentLoaded car il n'est lancé que lorsque le code HTML est reçu en entier, c'est-à-dire après le long traitement également.

    De manière générale il est préférable de placer les appels de scripts externes (jQuery, Bootstrap et autres) dans le <head> pour qu'ils soient disponibles le plus tôt possible ; ton propre code JavaScript en dépend. Et dans ce cas un peu particulier, il faut que tu places le code qui gère le bouton (et seulement ce code-là) juste après le bouton, et avant le long traitement.

    Contrairement à un script « vanilla » (sans framework), où un appel à getElementById ou autre querySelector aurait rendu null et où tu aurais pu facilement localiser l'erreur, jQuery reste silencieux quand tu lui demandes de travailler sur un élément qui n'existe pas. Pour vérifier, tu dois regarder si l'ensemble sélectionné n'est pas vide :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log($('form').length);
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  18. #18
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonjour Watilin et encore une fois merci,
    Merci
    - pour les explications sur les boutons (pourquoi faire simple ..)
    - pour l'astuce vérifiant la présence du form sous jQuery
    - Pour l'implantation des JS : c'est comme l’œuf .. j'aurais du y penser tellement c'est logique .. mais en fait je crois que je n'y aurais jamais pensé
    Surement, à cause du fait que je les ai toujours vu placés en dernier (pour éviter le ralentissement de la page, si je me rappelle bien)
    J'ai donc placé dans le <head> les 2 fichiers js et après la définition du BtnStop le fichier js spécifique au bouton
    Et ... ça marche : la requête Ajax est bien générée !!
    Il me reste à gérer maintenant les sessions .. j'y va !

    Bertrand

  19. #19
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Me revoila,
    j'ai juste eu à remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (session_status !== PHP_SESSION_ACTIVE) {
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (session_status() !== PHP_SESSION_ACTIVE) {
    et ça marche exactement comme désiré

    Et pour finaliser, est-il possible d'attacher une fonction jQuery à un événement tel que la fin de chargement de page :
    Exemple :
    - l'utilisateur clic sur Stop
    - pour indiquer la prise en compte de sa demande on change les text (par exemple :arrêt en cours) & couleur du btn Stop
    - au bout d'un moment (correspondant à la fréquence de scrutation de l'arrêt demandé et de la longueur d'une itération) le processus s'arrête (via un break par exemple)
    - le Btn Stop affiche toujours 'arrêt en cours'
    Est-il possible de faire repasser le BtnStop à un autre test/couleur par exemple ?

    Ce dernier point est je l'avoue limite HS, mais pour ce qui est de la demande originelle 'Stopper un script en cours' vos réponses ont complétement répondu à mon attente
    Merci encore
    Bertrand

  20. #20
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par 105rn2 Voir le message
    Me revoila,
    j'ai juste eu à remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (session_status !== PHP_SESSION_ACTIVE) {
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (session_status() !== PHP_SESSION_ACTIVE) {
    et ça marche exactement comme désiré
    Oups, inattention de ma part

    Citation Envoyé par 105rn2 Voir le message
    Et pour finaliser, est-il possible d'attacher une fonction jQuery à un événement tel que la fin de chargement de page :
    Exemple :
    - l'utilisateur clic sur Stop
    - pour indiquer la prise en compte de sa demande on change les text (par exemple :arrêt en cours) & couleur du btn Stop
    - au bout d'un moment (correspondant à la fréquence de scrutation de l'arrêt demandé et de la longueur d'une itération) le processus s'arrête (via un break par exemple)
    - le Btn Stop affiche toujours 'arrêt en cours'
    Est-il possible de faire repasser le BtnStop à un autre test/couleur par exemple ?
    Tu as deux évènements qui marquent la fin de chargement d'une page. Le premier, traditionnel, est le load émis par l'objet window. Il est lancé quand le document ainsi que toutes les ressources liées (scripts, styles, images, etc.) ont été chargés. Le second est le DOMContentLoaded dont je t'ai déjà parlé. Il peut être émis avant load ou en même temps, mais jamais après. jQuery l'utilise quand tu écris $(document).ready ou une forme équivalente.

    L'un ou l'autre de ces deux évènements t'indique quand la page a fini de charger, mais ne peuvent rien te dire sur ce qui s'est passé côté serveur. Je pense que ça t'aidera d'envoyer une information après ta longue boucle, pour indiquer si le « traitement » a terminé normalement ou s'il a été interrompu par l'utilisateur. Et pour savoir ça, tu peux simplement tester la valeur de $i pour voir si elle a eu le temps d'aller jusqu'au bout.

    Sinon, je pense que ça t'intéressera aussi de connaître les différents évènements auxquels tu peux réagir pendant une requête Ajax (avec jQuery).

    Citation Envoyé par 105rn2 Voir le message
    Ce dernier point est je l'avoue limite HS
    Si c'était vraiment HS je pense qu'il y aurait eu une réaction de la part des modos. Moi je peux répondre alors je réponds

    Citation Envoyé par 105rn2 Voir le message
    Merci encore
    De rien !
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Stopper un script PHP par un autre script PHP
    Par Matkil888 dans le forum Langage
    Réponses: 14
    Dernier message: 06/05/2013, 15h12
  2. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 187
    Dernier message: 18/10/2012, 07h45
  3. Stopper un script php qui se prend pour superman
    Par supergrey dans le forum Langage
    Réponses: 2
    Dernier message: 08/06/2007, 22h12
  4. Pb d'execution de requete avec un script php
    Par ythierrin dans le forum Requêtes
    Réponses: 3
    Dernier message: 22/08/2003, 14h34

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