|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Futur Membre du Club
![]() Inscription : février 2007 Messages : 42 ![]() |
Bonjour,
Un script appelé par un formulaire AJAX consomme pas mal de ressources. Je souhaite qu'un utilisateur ne puisse le lancer qu'une seule fois. Mais je bloque vraiment. J'ai essayé ça: Code :
Avez-vous une idée svp? Merci |
||
|
|
00
|
|
|
#2 |
![]() ![]() Vincent Inscription : juillet 2005 Messages : 14 929 ![]() |
Ca devrait déjà fonctionner par un effet de bord : deux script ne peuvent pas accéder à une session en même temps.
Le deuxième doit attendre que le premier libère le fichier de session pour démarrer la sienne. |
|
|
10
|
|
|
#3 | |||
|
Membre émérite
![]() Alain Inscription : novembre 2005 Messages : 897 ![]() |
Citation:
A première vue, je mettrais un champ de type hidden dans ton formulaire et sa valeur (controle) mise en Session php. Quoique... On peut aussi utiliser n'importe quelle variable transmise par le formulaire, mais bon, c'est pour l'exemple. Code :
__________________
Ce n'est pas parce que les choses sont difficiles qu'on n'ose pas les entreprendre. C'est parce qu'on n'ose pas les entreprendre qu'elles sont difficiles. |
|||
|
|
11
|
|
|
#4 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 709 ![]() |
Salut
Citation:
Si c'est ça, on peu par exemple et en 1er désactiver le bouton avec l'attribut disabled (disabled="disabled") en Javascript, ça va le "griser" d'ailleurs. Il est théoriquement pplus possible de cliquer une 2ème fois, et même appuyer sur le touche "entrée". A près avoir désactiver le bouton, il suffit d'exécuter le code Ajax. Le serveur ne devrait plus obtenir 2 fois la même requête HTTP de l'Ajax pour le même utilisateur. Pour info, il vaut mieux que cette action soit déclenchée sur un bouton (ou submit), car si je ne dis pas de bêtise, l'attribut disabled est valide/conforme que pour les éléments HTML input/bouton (pas pour un lien, div, etc ...ni même un form).
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
11
|
|
|
#5 |
|
Futur Membre du Club
![]() Inscription : février 2007 Messages : 42 ![]() |
Bonjour,
Un script PHP demande pas mal de ressources. Sa fonction est l'analyse d'un texte, les textes sont parfois long et la langue française compte beaucoup de mots... Après un gros travail sur l'optimisation, j'ai ajouter un contrôle javascript afin d'éviter qu'un même utilisateur lance des analyses simultanées et ne me plombe tout. Problèmes: - si beaucoup d'utilisateurs, ça ne change rien - j'ai l'impression qu'au moins un utilisateur s'amuse à passer au delà du contrôle JS. J'aimerais donc trouver une méthode pour: 1 créer un système de "file d'attente" simple ou au moins limiter le nombre d'utilisation simultanés du script (par exemple à 10) 2 utiliser $_SESSION (ou autre chose) pour éviter qu'un même utilisateur ne lance plusieurs fois le script avant la fin. Ce serait vraiment chouette de m'aider. Julien |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() Mathieu ROBINDéveloppeur Web Inscription : mai 2006 Messages : 1 116 ![]() |
$_SESSION est un tableau que tu peux modifier mais propre à chaque client. Ajoute donc un nouveau champ à celui-ci que tu définiras à TRUE si il n'existe pas encore ou est défini à FALSE.
Si quand ton script démarre, le champ ciblé est déjà true, tu ne fais rien. Pour le nombre d'exécutions simultanés, je ne sais pas si Apache ou PHP autorise ce genre de limitations, ceci dit, avec la variable $_SERVER peut-être que tu pourras faire quelque chose.
__________________
Mon blog techno et son billet hebdomadaire sur l'actualité jQuery. Et mon blog cuisine pour une personne. Le bouton ne masse pas les pieds, mais ça aide la communauté.
|
|
10
|
|
|
#7 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 709 ![]() |
Salut
A mon avis le problème est la suite de ton topic : Comment faire pour qu'un script ne puisse pas être lancé plusieurs fois simultanément Citation:
Essai toi même de le faire, ça me semble très loin d'être simple. Ton problème est non seulement qu'un seul utilisateur ne peux pas pas exécuter le même traitement faute de traitements trop long, mais aussi 2 (ou 3, etc ...) utilisateurs différents, donc session différentes aussi, ne peuvent pas exécuter le même traitement pour la même raison. Ces traitements (très) longs seraient le fond du problème à mon sens. Utiliser les sessions n'est pas la solution, car cette info est propre à chaque utilisateur comme ça a été dit, ça veut dire que si 1 utilisateur déclenche le traitement, l'utilisateur 2 ne le saura pas. Du coup, impossible aussi de savoir quand un utilisateur aura terminé. Pour ça, il faut au minimum une info globales accessible à tous les utilisateurs, comme par exemple créer un fichier et écrire dedans 0 ou 1 (0 -> verrouillé, 1 -> déverrouillé). Mais c'est pas si simple et c'est un peu "casse gueule". Ce n'est qu'un exemple de toute manière. Faudrait à mon sens faire le point sur ce que tu fais, et voir s'il n'y a pas moyen d'optimiser ces traitements. Pourquoi pas diviser ça en plusieurs étapes plus petites. Est ce qu'il n'y a pas moyen d'opter pour une formule d'hébergement plus pro, plus rapide. ... etc ... On ne sait pas quel est le service qui est proposé, mais le principe de la file d'attente est à double tranchant. Si tu as affaire à des utilisateurs impatients dans mon genre, dans la seconde qui suit je m'en vais, et ne reviendra plus jamais ![]() J'irais illico presto voir ailleurs et trouver le même service, sans devoir faire la queue. Il y en déjà assez comme ça dans la vie courante. (A part les impôts où là, on a pas trop le choix Faut voir.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
11
|
|
|
#8 |
|
Futur Membre du Club
![]() Inscription : février 2007 Messages : 42 ![]() |
![]() Et merde, j'avais oublié que j'ai déjà demandé. Et sur le même site en plus. À ma décharge, il était tard et ma question n'était pas formulée de la même façon. Jsuis vraiment une quiche. Merci à vous deux pour vos réponses. Je vais demander la clôture de ce dernier et contenue sur l'autre. (edit) Mais t'as complétement raison, sans le vouloir c'est la suite logique. |
|
|
00
|
|
|
#9 |
|
Futur Membre du Club
![]() Inscription : février 2007 Messages : 42 ![]() |
Merci pour vos réponses précieuses, je vais essayer d'intégrer vos conseils à mon code et vous tiens au courant.
En attendant, je vais essayer de mieux structurer mon code PHP pour rendre le contrôle plus pratique. Pour l'utilisation de contrôles JS, c'était mis en place. Mais j'ai l'impression que je suis face à du sabotage pour passer au-delà du contrôle côté" client. Pour ça que j'aimerais en ajouter une couche en PHP Côté hébergement, je vais voir... j'ai quasi double posté (involontairement ) car c'est une question qui me turlupine. J'ai demandé la suppression.
|
|
|
00
|
|
|
#10 | |
|
Futur Membre du Club
![]() Inscription : février 2007 Messages : 42 ![]() |
Citation:
Je me demande si, au lieu d'utiliser un compteur, je ne devrais pas jouer sur le temps. Genre un blocage de 5 secondes. Si vous avez une idée, je suis preneur. |
|
|
|
00
|
|
|
#11 |
|
Futur Membre du Club
![]() Inscription : février 2007 Messages : 42 ![]() |
|
|
|
00
|
|
|
#12 | ||
|
Futur Membre du Club
![]() Inscription : février 2007 Messages : 42 ![]() |
Je vais craquer et me replonger dans ruby
Code :
Là ça marche, sauf que si le test fonctionne (pénalise) une fois, la session est grillée et même 60 secondes plus tard, le script ne se lance plus. HELP les amis. |
||
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 240 ![]() |
Ce serait le plus simple à faire. Tu peux très bien enregistrer le temps t de la connexion à ta bdd dans une variable de session et ensuite tu compare à la prochaine connexion et tu envoie un message d'annonce si le même utilisateur tente des connexions à répétitions (genre "vous devez attendre 5 secondes entre plusieurs recherches").
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
10
|
|
|
#14 | ||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 240 ![]() |
Genre :
Code :
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||
|
|
10
|
|
|
#15 |
|
Futur Membre du Club
![]() Inscription : février 2007 Messages : 42 ![]() |
Génial, ça fonctionne! Merci mec.
Mais, je ne capte toujours pas ce qui foire dans la mienne... As tu une idée? |
|
|
00
|
|
|
#16 |
|
Membre Expert
![]() ![]() Mathieu ROBINDéveloppeur Web Inscription : mai 2006 Messages : 1 116 ![]() |
A la vue de ton code, je dirais que t'as oublié le session_start()
__________________
Mon blog techno et son billet hebdomadaire sur l'actualité jQuery. Et mon blog cuisine pour une personne. Le bouton ne masse pas les pieds, mais ça aide la communauté.
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 240 ![]() |
Ben le temps passé est toujours inférieur au temps actuel augmenté de 5 secondes
donc est toujours vrai étant donné que $_SESSION['lastana'] enregistre un temps antérieur. (Mets un +1 dans le message de la bonne réponse, c'est plus clair pour les futurs visiteurs
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
10
|
|
|
#18 | |
|
Futur Membre du Club
![]() Inscription : février 2007 Messages : 42 ![]() |
Citation:
![]() ok, je vais me coucher. |
|
|
|
00
|
|
|
#19 |
|
Membre éclairé
![]() Ingénieur développement logiciels Inscription : mars 2007 Messages : 274 ![]() |
Sinon tu as une méthode un poil plus lourde mais qui pourrait éviter tous tes problèmes. Par contre cela nécessite que l'appel ajax ne renvoie pas d'info spécifique au traitement.
Je m'explique. Ce qu'il faudrait faire : Lorsque l'utilisateur fait la demande d'un traitement, cela produit un appel ajax. L'appel ajax va alors simplement aller remplir une table en bdd avec les infos nécessaires au traitement. Ensuite, via un système de cron, tu lances les traitements toutes les X secondes. Celui-ci fera : 0 - si fichier lock.tmp existe :j'arrête l'exécution du script , sinon : je crée un fichier lock.tmp 1 - je prend la ligne la plus ancienne dans la table en bdd, 2 - j'effectue le traitement sur les données, 3 - une fois le traitement effectué j'efface la ligne en cours dans la bdd. 4 - j'efface le fichier lock.tmp Tu peux ensuite ajouter au script une détection de doublons.
__________________
Smiley de Plomb 2009 Anciennement FrancoisIT |
|
|
10
|
|
|
#20 |
|
Futur Membre du Club
![]() Inscription : février 2007 Messages : 42 ![]() |
joli. vraiment joli.
J'aime le principe même si je vais essayer de l'adapter pour éviter d'avoir des accès en écriture à ma base. merci |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com