Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Si le visiteur deconnecte...

12 réponses
Avatar
Jean-Francois Ortolo
... Que devient le script PHP lancé ?

Plus précisément: Supposons qu'un utilisateur ait lancé un script PHP
en écrivant son url complète dans son navigateur puis tapé sur "Enter",
et qu'il ait cliqué tout de suite après sur la touche "Arrêter" de son
navigateur, que se passe-t-il ?

Le script PHP continuera-t-il a s'exécuter, ou sera-t-il arrêté
automatiquement dans son exécution par le serveur Apache ?

Je précise que ce script PHP n'a pas de redirections par headers.

Merci beaucoup beaucoup de vos réponses.

C'est une question de sécurité, pour une mise à jour de BDD à
distance, faut pas que ça coince, quoi...

Jean Francois Ortolo

--
Mon site donne des Statistiques
et des Historiques Graphiques gratuits
sur les Courses de Chevaux du PMU.
http://www.ortolojf-courses.com

10 réponses

1 2
Avatar
John GALLET
... Que devient le script PHP lancé ?
Il reste sur le serveur.


Le script PHP continuera-t-il a s'exécuter, ou sera-t-il arrêté
automatiquement dans son exécution par le serveur Apache ?


On ne sait même pas si l'information arrivera jusqu'au serveur. Si le
chat se prend les pattes dans le fil du modem, ou si windows (as usual)
reboote, c'est pas gagné.

C'est une question de sécurité, pour une mise à jour de BDD à
distance, faut pas que ça coince, quoi...


Je ne vois pas où est le soucis sur un cas aussi simple. L'utilisateur a
voulu faire une action. S'il s'arrête en plein milieu, c'est son
problème. Ou la requête a eut lieu et ce sont les nouvelles valeurs qui
sont actives, ou ce sont les anciennes.

Si tu as un script qui fait N requêtes SQL sans transactions (hérésie,
mais on fait avec ce qu'on a), tu peux te pencher du côté de
ignore_user_abort().

a++;
JG

Avatar
Jean-Francois Ortolo
John GALLET wrote:

Si tu as un script qui fait N requêtes SQL sans transactions (hérésie,
mais on fait avec ce qu'on a), tu peux te pencher du côté de
ignore_user_abort().



Bonjour Monsieur

Donc, pour que le script ne s'arrête pas suite à une déconnexion de
l'utilisateur, il suffit de lancer la fonction:

@ignore_user_abort(true);

en début de script ?

Le PHP Manual dit que le comportement par défaut, est que le script
s'arrête en cas de déconnexion de l'utilisateur, mais qu'il est possible
avec cette fonction, effectivement, de faire en sorte que le script se
poursuive dans ce cas.

Le paramètre "true" dans ce but, est-il correct ? Le PHP Manual est
un peu flou à ce sujet. Il y a seulement un commentaire d'un visiteur
déclarant que le nom de la fonction est "authoritative" quant à sa
signification, contrairement à l'interprétation que l'on pourrait faire
de la fonctionnalité de cette fonction, qui serait "activer l'arrêt du
script en cas de déconnexion utilisateur". ( C'est le sens contraire. )

Merci beaucoup à vous de me donner la valeur juste du paramètre.

Merci beaucoup de votre aide, qui m'a toujours été très précieuse,
depuis longtemps déjà.

Jean Francois Ortolo

--
Mon site donne des Statistiques
et des Historiques Graphiques gratuits
sur les Courses de Chevaux du PMU.
http://www.ortolojf-courses.com

Avatar
John GALLET
Bonjour,

Monsieur
Oh, vous pouvez laisser tomber le "Monsieur", on se connait depuis

suffisement longtemps ;-)

Donc, pour que le script ne s'arrête pas suite à une déconnexion de
l'utilisateur, il suffit de lancer la fonction:
@ignore_user_abort(true);
en début de script ?


Oui. Histoire de chipoter : je préfère mettre les constantes comme TRUE
en majuscules (mais c'est une convention qui n'engage que moi) et l'@ ne
sert pas à grand chose car je doute que cette fonction renvoie un
message en cas d'erreur, mais ne mange pas de pain. Pensez à grouper ça
dans un fichier unique appelé par require() là où il faut si vous voulez
que tous vos scripts aient ce comportement (mis en facteur de code).

Le paramètre "true" dans ce but, est-il correct ? Le PHP Manual est
un peu flou à ce sujet.


Ca fait partie des fonctions au nom de logique inverse qui m'agacent :
je dois mettre à VRAI le fait d'ignorer quelque chose. Genre
"notMissingúLSE"... Limpide.

$abort=ignore_user_abort();
if($abort==TRUE) echo "Si l'utilisateur presse stop, j'ignore son action
donc je continue";
else echo "Je n'ignore pas son action donc je m'arrete";
ignore_user_abort(TRUE);
echo "maintenant, il peut s'exciter autant qu'il veut, meme si je
detecte quelque chose, je continue";

Merci beaucoup de votre aide, qui m'a toujours été très précieuse,
depuis longtemps déjà.


Ca nous rajeunit pas en effet ;-)

a++;
JG

Avatar
Jean-Francois Ortolo
John GALLET wrote:

Ca nous rajeunit pas en effet ;-)



Bonjour Monsieur

Je persiste à vous appeler Monsieur, même si celà ne me rajeunit pas
moi-même, par sécurité... Si vous étiez un gros ogre, où irais-je me
fourrer ? :)

Merci beaucoup beaucoup pour vos informations, je vais de ce pas mal
assuré, rajouter l'instruction en question, dans mes scripts.

Bien à vous.

Jean Francois Ortolo

--
Mon site donne des Statistiques
et des Historiques Graphiques gratuits
sur les Courses de Chevaux du PMU.
http://www.ortolojf-courses.com

Avatar
Pierre Maurette
[]
Oui. Histoire de chipoter : je préfère mettre les constantes comme TRUE
en majuscules (mais c'est une convention qui n'engage que moi)
[...]

Ca fait partie des fonctions au nom de logique inverse qui m'agacent :
je dois mettre à VRAI le fait d'ignorer quelque chose. Genre
"notMissingúLSE"... Limpide.

$abort=ignore_user_abort();
if($abort==TRUE) echo "Si l'utilisateur presse stop, j'ignore son action
donc je continue";
else echo "Je n'ignore pas son action donc je m'arrete";
ignore_user_abort(TRUE);
echo "maintenant, il peut s'exciter autant qu'il veut, meme si je
detecte quelque chose, je continue";
Salut,

"Oui. Histoire de chipoter" ...
Si je suis bien entendu d'accord sur le très mauvais choix soit du nom
de la fonction, soit de son paramètre, je trouve étrange la condition
if($A == TRUE). Si on a pris soin "d'inverser" en faisant:
$abort=ignore_user_abort();
ou
$ignore=!ignore_user_abort();

il suffit alors de faire:

if($abort)
ou
if(!$ignore)

En revanche, j'écrirais volontiers:
if(($abort=ignore_user_abort()) == TRUE)
pour bien marquer que je ne fais pas une faute d'inattention.

Tout ça si j'ai bien compris la fonction ignore_user_abort(), les
opérateurs = et == de PHP et le type bool. Ce qui n'est pas certain,
pollué que je suis par d'autres langages.

--
Pour répondre directement: enlever une lettre sur deux
wwaannaaddoooo -> wanadoo

Pierre Maurette

Avatar
John GALLET
Bonjour,

"Oui. Histoire de chipoter" ...


De chipoter sur écrire true ou TRUE.

if($A == TRUE). Si on a pris soin "d'inverser" en faisant:
$abort=ignore_user_abort();
ou
$ignore=!ignore_user_abort();

il suffit alors de faire:


[ce que je considère la source numéro 1 de code imbittable à la
relecture]

C'est comme ça que j'arrive dans un programme à débugguer que quelqu'un
a développé il y a XX mois, qui buggue à donf, où donc, tout est
suspect, et je lis la magnifique chose suivante (exemple imaginaire mais
pas tant que ça):
if(!ignore_user_abort(false))...

avec évidement pas un commentaire à côté. Il va me falloir au moins 1
minute ou deux pour vérifier que toto a bien écrit ça correctement. Si
j'ai comme ça 3K ou 4K lignes de code à inspecter, je suis pas rendu
pour le trouver, mon bug.

Tout ça si j'ai bien compris la fonction ignore_user_abort(), les
opérateurs = et == de PHP et le type bool.
Justement, le problème de PHP c'est qu'il n'est pas typé, tout en

l'étant, sans l'être réellement (connerie(1) introduite en php4).

Ce qui n'est pas certain,
pollué que je suis par d'autres langages.
Tu as parfaitement compris, mais je suis moi même pollué par d'autres

langages aussi. J'ai pour habitude d'éviter de comparer des choux et des
carottes, et assez souvent je préfère comparer par rapport à une valeur
explicite.

Tout ceci relève des habitudes de codage.
a++;
JG
(1) commentaire qui n'engage que moi.

Avatar
Pierre Maurette
Bonjour,

"Oui. Histoire de chipoter" ...


De chipoter sur écrire true ou TRUE.
J'avais compris. Je citais justement cette phrase avant de la reprendre

(en mode plaisanterie) pour exprimer que je chipotais également.


if($A == TRUE). Si on a pris soin "d'inverser" en faisant:
$abort=ignore_user_abort();
ou
$ignore=!ignore_user_abort();

il suffit alors de faire:


[ce que je considère la source numéro 1 de code imbittable à la
relecture]
J'aurais préféré que vous ne zappiez pas le bout de code que vous allez

ensuite critiquer, même à juste titre. Mais peu importe.

C'est comme ça que j'arrive dans un programme à débugguer que quelqu'un
a développé il y a XX mois, qui buggue à donf, où donc, tout est
suspect, et je lis la magnifique chose suivante (exemple imaginaire mais
pas tant que ça):
if(!ignore_user_abort(false))...

avec évidement pas un commentaire à côté.
Apparté: un commentaire ici se justifierai peut-être dans un tuto, mais

AMHA pas dans la vraie vie. Je le remplacerais si je peux me le
permettre par du code moins performant mais auto-commenté :

- Acquisition de l'état précédent avec nommage signifiant (pas facile
ici, effectivement):
$WAS_IGNORE = ! ignore_user_abort();
ou
$WAS_ABORT = ignore_user_abort();

- Modification de l'état:
(quelque part, peut être dans un fichier à inclure)
$SET_IGNORE = FALSE;
$SET_ABORT = TRUE;
(à ce niveau de mon apprentissage, je sais que les enum n'existent pas
en PHP, seulement dans MySQL, et je ne connais pas la bonne façon de
définir des constantes symboliques)

ignore_user_abort($SET_IGNORE);
(à ce niveau de mon apprentissage, j'ignore s'il est réaliste de
modifier le nom d'une fonction par quelque chose qui ressemblerait à un
define)

- Enfin, le test:
if($WAS_IGNORE) ...


Bien entendu, si ce code est utilisé souvent et doit être optimisé, je
l'encapselerais peut-être dans une fonction au nom évocateur, le
contenu pouvant être abscons après tests.


Il va me falloir au moins 1
minute ou deux pour vérifier que toto a bien écrit ça correctement. Si
j'ai comme ça 3K ou 4K lignes de code à inspecter, je suis pas rendu
pour le trouver, mon bug.

Tout ça si j'ai bien compris la fonction ignore_user_abort(), les
opérateurs = et == de PHP et le type bool.
Justement, le problème de PHP c'est qu'il n'est pas typé, tout en

l'étant, sans l'être réellement (connerie(1) introduite en php4).

Ce qui n'est pas certain,
pollué que je suis par d'autres langages.
Tu as parfaitement compris, mais je suis moi même pollué par d'autres

langages aussi. J'ai pour habitude d'éviter de comparer des choux et des
carottes, et assez souvent je préfère comparer par rapport à une valeur
explicite.
Le type de retour de ignore_user_abort() me semble pourtant clair. La

doc parle bien de int, mais précise qu'il s'agit de l'état précédent et
le paramètre est lui défioni comme booléen. En tous cas au niveau
sémantique, c'est un booléen (au sens mal choisi, OK).
En général, je ferais selon le sens (en espérant ne pas faire de
grossière erreur de syntaxe):

--$compteur;
if($compteur == 0)...
ou
if(--$compteur == 0)...
et
if($porteouverte)...

même si:
--$compteur;
if(!$compteur)...
ou
if(!(--$compteur))... (ça marche, ça ?)
et
if($porteouverte == TRUE)...

Sinon, pourquoi pas:
if((($porteouverte == TRUE) != FALSE) == (1 != 2))...
;-) , bien entendu


Tout ceci relève des habitudes de codage.
Certes.


--
Pour répondre directement: enlever une lettre sur deux
wwaannaaddoooo -> wanadoo

Pierre Maurette


Avatar
Olivier Miakinen

--$compteur;
if($compteur == 0)...
ou
if(--$compteur == 0)...
et
if($porteouverte)...


Oui, j'ai les mêmes habitudes que toi, d'ailleurs j'ai déjà critiqué
l'ajout de « == TRUE » derrière un booléen :
<http://groups.google.fr/group/fr.comp.lang.php/msg/9dd135f004ee22f5>.

même si:
--$compteur;
if(!$compteur)...


Beurk ! Quoique ce ne soit pas directement applicable au PHP, en C
j'évite les horribles « if (strcmp(s1,s2) » et « if (!strcmp(s1,s2)) »
avec un :
#define (STREQ(s1,s2)) (strcmp(s1,s2) == 0)

Pour ceux qui ne connaissent pas strcmp, « if (!strcmp(s1,s2)) »
signifie en gros « s'il est faux que s1 ne soit pas égal à s2 »¹.
Je préfère de beaucoup « if (STREQ(s1,s2)) » à comprendre comme
« si s1 égale s2 ».


ou
if(!(--$compteur))... (ça marche, ça ?)


Oui, ça marche, mais en effet ce n'est pas beau.

et
if($porteouverte == TRUE)...


Au risque de les enfoncer (les portes ouvertes), cette écriture est un
pléonasme redondant pour dire deux fois la même répétition.

Sinon, pourquoi pas:
if((($porteouverte == TRUE) != FALSE) == (1 != 2))...
;-) , bien entendu


<http://groups.google.fr/group/fr.comp.lang.php/msg/9dd135f004ee22f5>
if(ctype_digit($id)==TRUE)



Pour être sûr qu'il soit vraiment vrai que la fonction ctype_digit() ait
vraiment retourné une valeur vraie, il serait plus prudent d'écrire :
if ((ctype_digit($id)==TRUE)==TRUE)
voire :
if ((TRUE==((ctype_digit($id)==TRUE)==TRUE))==TRUE)

Sinon, quand on est flemmard comme moi on se contente de :
if (ctype_digit($id))
</>

Tout ceci relève des habitudes de codage.
Certes.

Assurément.


--
Olivier Miakinen
¹ Je ne garantis pas qu'il soit indéfendable de nier le contraire de la
véracité de mes dires...


Avatar
John GALLET
Re,

J'aurais préféré que vous ne zappiez pas le bout de code que vous allez
ensuite critiquer, même à juste titre. Mais peu importe.


Il n'y avait aucune malice. On est pas sur fufe, ici !

avec évidement pas un commentaire à côté.
Apparté: un commentaire ici se justifierai peut-être dans un tuto, mais

AMHA pas dans la vraie vie.


Le commentaire "attention, par défaut php prend en compte les actions
users / pertes de connexions détectées et ça nous fout le bordel dans
tel module parce que le SGBD ne gère pas les transactions" me parait
plus que nécessaire pour justifier la présence d'un appel à
ignore_user_abort(). Comme ça le jour où on a des transactions, on
dégage la verrue.

(à ce niveau de mon apprentissage, je sais que les enum n'existent pas
en PHP, seulement dans MySQL, et je ne connais pas la bonne façon de
définir des constantes symboliques)
Pour définir une constante, il y a l'instruction define(). Mon grand

regret est qu'elle ne puisse pas fonctionner sur un tableau associatif,
ce qui serait encore plus puissant que les enum.

(à ce niveau de mon apprentissage, j'ignore s'il est réaliste de
modifier le nom d'une fonction par quelque chose qui ressemblerait à un
define)


On peut faire des trucs à la con, plus proche du pointeur de fonction
que du define,mais rien de très compréhensible plus tard à la relecture.
Exemple : $comply_to_user_abort="ignore_user_abort";
$comply_to_user_abort(FALSE);
(ne marche qu'avec les fonctions, pas les "langage construct" comme echo
ou print).

Bien entendu, si ce code est utilisé souvent et doit être optimisé, je
l'encapselerais peut-être dans une fonction au nom évocateur, le
contenu pouvant être abscons après tests.
Indeed.


Le type de retour de ignore_user_abort() me semble pourtant clair.


[mode dédocapillidécoupe=ON]

A moi pas, selon la documentation c'est un "int". Manque de bol (de bool
?) c'est un booléen. Alors, la valeur "2", je peux la recevoir ou pas ?
En plus sur la même page de documentation on me brouille les pistes en
me mettant un lien vers les "connection state" avec justement des
valeurs entières, de là à faire la confusion entre les deux modules...

doc parle bien de int, mais précise qu'il s'agit de l'état précédent et
le paramètre est lui défioni comme booléen. En tous cas au niveau
sémantique, c'est un booléen (au sens mal choisi, OK).
Dommage qu'il faille lire 5 lignes de blabla au lieu de mettre bool

comme type de retour sachant qu'il y a bien bool comme paramètre...

[/dédo-etc...]
Blague à part, de manière générale, j'aime beaucoup la doc de php.

if($porteouverte)...
l_enfoncer(TRUE);

else
la_fermer(TRUE); // ou l_ouvrir(FALSE) ?

a++;
JG


Avatar
Jean-Francois Ortolo
Pierre Maurette wrote:

- Acquisition de l'état précédent avec nommage signifiant (pas facile
ici, effectivement):
$WAS_IGNORE = ! ignore_user_abort();
ou
$WAS_ABORT = ignore_user_abort();

- Modification de l'état:
(quelque part, peut être dans un fichier à inclure)
$SET_IGNORE = FALSE;
$SET_ABORT = TRUE;
(à ce niveau de mon apprentissage, je sais que les enum n'existent pas
en PHP, seulement dans MySQL, et je ne connais pas la bonne façon de
définir des constantes symboliques)

ignore_user_abort($SET_IGNORE);



Je m'esbaudis

Seulement il me semble que vous faites une erreur, d'après ce qu'a
dit précédemment Monsieur John Gallet: Dans votre cas, pour que la
fonction ignore_user_abort($SET_IGNORE) fasse en sorte d'ignorer la
déconnexion de l'utilisateur, il me semble que la bonne valeur pour
cette constante, serait: $SET_IGNORE = TRUE; ( et non pas FALSE. )

Heureux d'avoir votre opinion là-dessus.

Bien à vous.

Jean Francois Ortolo

--
Mon site donne des Statistiques
et des Historiques Graphiques gratuits
sur les Courses de Chevaux du PMU.
http://www.ortolojf-courses.com

1 2