Discussion:
arreter l'execution d'un script avant sa fin
(trop ancien pour répondre)
val
2008-05-28 15:29:20 UTC
Permalink
Bonjour,

J'aimerais savoir s'il est possible d'arrêter 'proprement' l'éxécution
d'un script avant sa fin, sans utiliser la petite croix 'abort'.

Voila, j'ai un programme de mailing qui envoie les mails les uns après
les autres, en boucle, à chaque fois qu'un mail est envoyé une table
est mise à jour avec la date d'envoi. J'aimerais que l'utilisateur
puisse arrêter le script à tout moment en appuyant sur un bouton.
J'imagine que le bouton devrait être sur une autre fenêtre et que
l'action sur celui-ci change une valeur dans un fichier qui serait
périodiquement lu par le script (disons après chaque email envoyé et
maj de la table envoi). Une fenêtre popup associée à un clic sur le
bouton envoi par ex ? Ca permettrait d'arrêter le script "proprement"
et non pas au milieu de l'envoi d'un mail.
Je sais pas si tout ça est très clair et si quelqu'un pouvait me
donner son avis ça m'aiderait.

val
Olivier Miakinen
2008-05-28 16:53:57 UTC
Permalink
Post by val
J'aimerais savoir s'il est possible d'arrêter 'proprement' l'éxécution
d'un script avant sa fin, sans utiliser la petite croix 'abort'.
Voila, j'ai un programme de mailing qui envoie les mails les uns après
les autres, en boucle, à chaque fois qu'un mail est envoyé une table
est mise à jour avec la date d'envoi. J'aimerais que l'utilisateur
puisse [...] arrêter le script "proprement"
et non pas au milieu de l'envoi d'un mail.
Quel que soit le moment où l'utilisateur ferme la fenêtre de son
navigateur, je ne pense pas que cela puisse arrêter le script au milieu
de l'envoi d'un courriel. En effet, pendant que le script envoie le
courriel, il n'envoie pas de données au client HTTP, et donc il ne peut
probablement pas savoir qu'il n'y a plus personne.

... mais je peux me tromper (par exemple si c'est Apache qui envoie les
données, qu'il le fait de façon désynchronisée, et qu'il tue le process
dès que la connexion est close).
Guillaume
2008-05-28 20:16:14 UTC
Permalink
Olivier a déjà donné un élément de réponse, que je complêterais avec la
méthodologie "phpBB".

Une mise à jour de version par exemple nécessite le traitement de toutes
les tables, le système s'apparente donc, quand par exemple on a 60000
utilisateurs à convertir (comme j'ai eu à le faire).

La page propose le traitement des utilisateurs par 200, tout en
enregistrant à coté l'avancée du traitement. Ainsi, l'on peut fermer son
navigateur à tout moment, auquel cas le serveur continue son traitement
des 200 entrées en cours, puis valide le tout et met à jour son compteur
en attendant une prochaine action, ou invalide en cas d'erreur et
reprendra au même compteur que précédemment là encore à la prochaine action.

C'est une solution qui s'adapte très bien à l'emailing, je l'ai moi même
fait autrefois pour les clients d'un site (environ 10000) mais c'était
en ASP. Cependant j'ai noté phpBB pour que vous puissiez, si cela vous
intéresse, vous y référer et étudier leur code, fonctionnel. Je n'ai pas
d'autre exemple en tête.

Cordialement,
--
Guillaume
val
2008-05-29 08:08:28 UTC
Permalink
Post by Olivier Miakinen
... mais je peux me tromper (par exemple si c'est Apache qui envoie les
données, qu'il le fait de façon désynchronisée, et qu'il tue le process
dès que la connexion est close).
Voilà, et ce que je voudrais éviter c'est qu'un courrier soit envoyé
et que la mise à jour de la table ne soit pas faite derrière.

val
Paul
2008-05-29 09:02:22 UTC
Permalink
Post by val
Post by Olivier Miakinen
... mais je peux me tromper (par exemple si c'est Apache qui envoie les
données, qu'il le fait de façon désynchronisée, et qu'il tue le process
dès que la connexion est close).
Voilà, et ce que je voudrais éviter c'est qu'un courrier soit envoyé
et que la mise à jour de la table ne soit pas faite derrière.
Alors fait le avant ! ;-)
sérieusement : la table peut avoir un champ 'envoyé' qui aura 3 valeurs
possibles : 'pas envoyé', 'en cours', 'envoyé'. Ce champ, tu peux le
gérer AVANT l'envoi, et finir sa mise à jour suivant le retour de ta
fonction d'envoi...
J'eqça
PAUL
Antoine Polatouche
2008-05-29 22:07:37 UTC
Permalink
Post by val
Post by Olivier Miakinen
... mais je peux me tromper (par exemple si c'est Apache qui envoie les
données, qu'il le fait de façon désynchronisée, et qu'il tue le process
dès que la connexion est close).
Voilà, et ce que je voudrais éviter c'est qu'un courrier soit envoyé
et que la mise à jour de la table ne soit pas faite derrière.
Pour ça, ignore_user_abort() permet de continuer le traitement en cas de
déconnexion du client.
Sylvain SF
2008-05-29 05:18:24 UTC
Permalink
Post by val
J'aimerais savoir s'il est possible d'arrêter 'proprement' l'éxécution
d'un script avant sa fin, sans utiliser la petite croix 'abort'.
c'est quoi come concept "la petite croix 'abort'" ??
Post by val
Voila, j'ai un programme de mailing qui envoie les mails les uns après
les autres, en boucle, à chaque fois qu'un mail est envoyé une table
est mise à jour avec la date d'envoi.
c'est un ""programme"" local (requete http avec le nom/numéro/whatever
du mail à envoyer) ou serveur qui parcours une liste devant d'une
autre table ?
Post by val
J'aimerais que l'utilisateur
puisse arrêter le script à tout moment en appuyant sur un bouton.
"bouton" !? le dijoncteur ??
Post by val
J'imagine que le bouton devrait être sur une autre fenêtre et que
l'action sur celui-ci change une valeur dans un fichier qui serait
périodiquement lu par le script (disons après chaque email envoyé et
maj de la table envoi).
ah bouton d'un IHM; php n'est pas intrinsèquement lié à une IHM,
ni à un navigateur.

le bouton peut modifier un flag (variable JavaScript) de la
fenêtre principale - la requete générant coté serveur l'envoi
d'un mail serait dans un iframe de dimension nulle et lirait
cette variable (dans le frame parent) pour savoir s'il doit
continuer.
Post by val
Une fenêtre popup associée à un clic sur le
bouton envoi par ex ?
un popup concerne le browser client - s'il faut deviner ce
que cela provoquerait coté serveur, je manque d'idée.
Post by val
Ca permettrait d'arrêter le script "proprement"
et non pas au milieu de l'envoi d'un mail.
si la fenêtre du navigateur ayant envoyé la requête http
générant l'envoi est fermé, le script serveur s'arrètera ...
quand le serveur http (apache ?) qui a lancé ce script le
décidera, c'est à peu près on prédictibvle en effet.
Post by val
Je sais pas si tout ça est très clair
le "envoie les mails les uns après les autres" initial
n'est pas clair; est-ce une loop php dans le script coté
serveur ou une requete (une à une) coté client ?
Post by val
si quelqu'un pouvait me
donner son avis ça m'aiderait.
sendMails.php

<html>
<body>
<script language="JavaScript">

// recipients placeholder
var recipients = new Array();

<?php
// count email
$counter = 0;

// assume MySQL
$link = mysql_connect();
mysql_select_db("base_name", $link);

$smt = "select mail from table_name";
$set = mysql_query($smt) or die(
"alert(\"".mysql_error()."\");</script></html>");

while ($ro = mysql_fetch_array($set)){
echo "recipients[$counter] = '$ro[0]'\n";
$counter++;
}
mysql_free_result($set);
mysql_close();
?>

</script>

<form>
<p><?= $counter ?> emails ready for delivery</p>
<p><span id=count>0</span> emails sent</p>
<p>
<input type=button value="Start"
onclick="javascript:sendFirst();"></input>
<input type=button value="Stop"
onclick="javascript:stopSending();"></input>
</p>
</form>

<iframe name="poster" height=50 width=500 scrolling=yes></iframe>

<script language="JavaScript">

var processSending = true;
var emailIndex = 0;

function sendFirst()
{
processSending = true;
emailIndex = 0;

doSend(recipients[emailIndex]);
}
function sendNext()
{
emailIndex++;
document.getElementById('count').innerHTML = "" + emailIndex;

// does sending allowed ? does end-of-index not reached ?
if (processSending && emailIndex < <?= $counter ?>){
var verb = "doSend('" + recipients[emailIndex] + "');";
setTimeout(verb, 50); // ajuster delai
}
}
function stopSending()
{
processSending = false;
}
function doSend(recipient)
{
document.poster.location = "sendOneMail.php?email=" + recipient;
}

</script>

</body>
</html>



sendOneMail.php

<html>
<body>

<?php
echo "<p>Send a mail to ".$_GET['email']."</p>\n";

// actual file will use
// mail($_GET['email'], $subject, $content, headers);
?>

<script language="JavaScript">

parent.sendNext();

</script>

</body>
</html>


HTH.
Sylvain.
val
2008-05-29 22:07:37 UTC
Permalink
Post by Sylvain SF
"bouton" !? le dijoncteur ??
:) C'est une idée, si j'arrive pas à résoudre mon problème
je ferai comme ça :
alert ("si vous souhaitez arrêter d'urgence le script appuyer sur le
gros coup de poing rouge marqué 'KILL_PROCESS' à l'entrée de la salle
des machines ")
Post by Sylvain SF
ah bouton d'un IHM; php n'est pas intrinsèquement lié à une IHM,
ni à un navigateur.
IHM ?
Post by Sylvain SF
le bouton peut modifier un flag (variable JavaScript) de la
fenêtre principale - la requete générant coté serveur l'envoi
d'un mail serait dans un iframe de dimension nulle et lirait
cette variable (dans le frame parent) pour savoir s'il doit
continuer.
Post by val
Une fenêtre popup associée à un clic sur le
bouton envoi par ex ?
un popup concerne le browser client - s'il faut deviner ce
que cela provoquerait coté serveur, je manque d'idée.
C'est justement ça mon problème. Comment faire pour envoyer une info à
un script qui tourne ?

Bon, mon script c'est une boucle php qui va chercher dans des tables
les adresses emails le texte, etc et qui envoie le mail par la
fonction mail() (via libmail.php).

La façon dont le programme fonctionne est la suivante:
Côté client on prépare le mailing à partir d'une interface html
(sujet, texte, choix de la base destinataire, etc).
Ensuite on appuie sur envoyer, et zou le script php démarre sa boucle,
et met à jour la base d'envoi au fur et à mesure de l'avancement du
mailing. Normalement à partir de ce moment l'utilisateur n'a plus la
main.

Maintenant j'aimerais quand même que l'utilisateur puisse arrêter le
mailing.php simplement en cliquant. C'est pour ça que je pensais à un
truc basé sur un fichier. Quand l'utilisateur clique sur 'envoyer' ça
génère une fenêtre dont la seule action sera de changer un paramètre
drapeau dans un fichier. Bien sûr il faut que cette fenêtre soit non
modale et qu'elle n'empêche pas le script de démarrer.
Le script de son côté interroge le fichier après chaque envoi de mail
pour savoir s'il doit continuer.
Maintenant je sais pas si c'est plus clair, si c'est faisable, ni si
c'est une bonne manière de le faire...
Post by Sylvain SF
Post by val
Ca permettrait d'arrêter le script "proprement"
et non pas au milieu de l'envoi d'un mail.
si la fenêtre du navigateur ayant envoyé la requête http
générant l'envoi est fermé, le script serveur s'arrètera ...
quand le serveur http (apache ?) qui a lancé ce script le
décidera, c'est à peu près on prédictibvle en effet.
Oui, c'est apache/php/mySQL en serveur local sous windows ('abort'
c'était mis pour la petite croix en haut à droite qui ferme ie, je
sais pas comment on l'appelle :)
Post by Sylvain SF
le "envoie les mails les uns après les autres" initial
n'est pas clair; est-ce une loop php dans le script coté
serveur ou une requete (une à une) coté client ?
une boucle
Post by Sylvain SF
sendMails.php
Merci, je vais regarder ça. De toute façon il me restera la solution
du disjoncteur. Ca avance bien ;))
Post by Sylvain SF
HTH.
Sylvain.
val
Guillaume
2008-05-30 08:34:08 UTC
Permalink
Post by Sylvain SF
ah bouton d'un IHM; php n'est pas intrinsèquement lié à une IHM,
ni à un navigateur.
IHM ?
Interface Homme Machine.

Cordialement,
--
Guillaume
Continuer la lecture sur narkive:
Loading...