PHP / SQL et la commande LOCK TABLES
6 messages
• Page 1 sur 1
- JulienV
- WRInaute discret

- Messages: 156
- Inscription: 18 Mar 2010
PHP / SQL et la commande LOCK TABLES
Bonjour à tous, Bonjour à toutes 
J'ai une table "mailing" sur laquelle j'enregistre tous les emails à envoyer à mes membres.
Ainsi, cela me permet de ne pas surcharger le serveur en envoyer les emails instantanément grâce à la fonction mail() de PHP.
J'enregistre donc : le titre du message, l'expéditeur, le destinataire, le contenu de l'email et sa priorité (de 1 à 100)).
Puis une tâche CRON tourne régulièrement pour expédier un petit lot d'emails (max : 50 mails par session).
Seulement voilà, mon hébergeur limite les envois d'emails à 1000 par heure, par compte.
De ce fait, j'ai donc créé dix sous domaines (sous 10 utilisateurs différents) de type mailing1.monsite.com, mailing2.monsite.com, etc. Et sur chaque sous-domaine, j'ai inséré la fameuse tâche cron.
Mais mon problème est le suivant :
Les tâches se lancent régulièrement en même temps et de ce fait, certains emails s'expédient en plusieurs fois...
La première tâche cron se lance et expédie 50 emails (par ordre de priorité), mais comme la seconde se lance en même temps, elle a également le temps de lire et expédier les 50 emails (les mêmes que la première tâche...).
J'ai donc pensé à utiliser la fonction LOCK TABLES de MySQL.
Procédure de la tâche cron :
1) Je bloque l'accès en lecture, écriture et édition (SELECT, INSERT, UPDATE) ;
2) Je sélectionne 50 emails (par priorité) ;
3) Je les envoie ;
4) Je les supprime de la table "mailing" ;
5) Je déverouille la table.
Simplement, c'est la première fois que j'utilise cette commande SQL, une âme charitable peut-elle m'aiguiller sur son utilisation ?
Actuellement mon script est le suivant :
1) SELECT id, titre, message FROM mailing ORDER BY priorite ASC LIMIT 50;
2) Expédition des e-mails
3) DELETE FROM mailing WHERE id=55 OR id=56 OR id=117;
Merci par avance !
J'ai une table "mailing" sur laquelle j'enregistre tous les emails à envoyer à mes membres.
Ainsi, cela me permet de ne pas surcharger le serveur en envoyer les emails instantanément grâce à la fonction mail() de PHP.
J'enregistre donc : le titre du message, l'expéditeur, le destinataire, le contenu de l'email et sa priorité (de 1 à 100)).
Puis une tâche CRON tourne régulièrement pour expédier un petit lot d'emails (max : 50 mails par session).
Seulement voilà, mon hébergeur limite les envois d'emails à 1000 par heure, par compte.
De ce fait, j'ai donc créé dix sous domaines (sous 10 utilisateurs différents) de type mailing1.monsite.com, mailing2.monsite.com, etc. Et sur chaque sous-domaine, j'ai inséré la fameuse tâche cron.
Mais mon problème est le suivant :
Les tâches se lancent régulièrement en même temps et de ce fait, certains emails s'expédient en plusieurs fois...
La première tâche cron se lance et expédie 50 emails (par ordre de priorité), mais comme la seconde se lance en même temps, elle a également le temps de lire et expédier les 50 emails (les mêmes que la première tâche...).
J'ai donc pensé à utiliser la fonction LOCK TABLES de MySQL.
Procédure de la tâche cron :
1) Je bloque l'accès en lecture, écriture et édition (SELECT, INSERT, UPDATE) ;
2) Je sélectionne 50 emails (par priorité) ;
3) Je les envoie ;
4) Je les supprime de la table "mailing" ;
5) Je déverouille la table.
Simplement, c'est la première fois que j'utilise cette commande SQL, une âme charitable peut-elle m'aiguiller sur son utilisation ?
Actuellement mon script est le suivant :
1) SELECT id, titre, message FROM mailing ORDER BY priorite ASC LIMIT 50;
2) Expédition des e-mails
3) DELETE FROM mailing WHERE id=55 OR id=56 OR id=117;
Merci par avance !
- JulienV
- WRInaute discret

- Messages: 156
- Inscription: 18 Mar 2010
Re: PHP / SQL et la commande LOCK TABLES
Ce n'est pas bête !!
Et tu vois, je n'y avais même pas pensé... Comme quoi les forums servent réellement à quelque chose
En fait, j'enregistre les emails dans "mailing", et une tâche cron se charge de les enregistrer sur les différents sous-domaines (un sous domaine = une nouvelle BDD), ainsi plus de problèmes !
Merciiiiiiiiiiiii !
Et tu vois, je n'y avais même pas pensé... Comme quoi les forums servent réellement à quelque chose
En fait, j'enregistre les emails dans "mailing", et une tâche cron se charge de les enregistrer sur les différents sous-domaines (un sous domaine = une nouvelle BDD), ainsi plus de problèmes !
Merciiiiiiiiiiiii !
-

Djibou_Te@M - WRInaute occasionnel

- Messages: 426
- Inscription: 20 Avr 2010
Re: PHP / SQL et la commande LOCK TABLES
Je pense que @seebz parlait plus de lancement en asynchrone, c'est à dire, un cron pour les gouverner tous (merci la référence pourrie, mais ça me brulait la langue).
En fait, tu crée un nouveau CRON, qui lancera en asynchrone les autres CRONS, de cette manière :
file_get_content (script.php);
file_get_content (script_2.php);
file_get_content (script_3.php);
Ou un truc dans ce genre (il me semble que c'est la bonne syntaxe)
En fait file_get_content va exécuter script.php, et tant qu'il n'aura pas fini son exécution, il ne passera pas à la suite du code...
Du coup, chacun se fait à la queue-leuleu.....
Marche aussi avec les boucles de type while, for ,etc.
Voilà
En fait, tu crée un nouveau CRON, qui lancera en asynchrone les autres CRONS, de cette manière :
file_get_content (script.php);
file_get_content (script_2.php);
file_get_content (script_3.php);
Ou un truc dans ce genre (il me semble que c'est la bonne syntaxe)
En fait file_get_content va exécuter script.php, et tant qu'il n'aura pas fini son exécution, il ne passera pas à la suite du code...
Du coup, chacun se fait à la queue-leuleu.....
Marche aussi avec les boucles de type while, for ,etc.
Voilà
-

Blount - WRInaute occasionnel

- Messages: 430
- Inscription: 18 Nov 2010
Re: PHP / SQL et la commande LOCK TABLES
Le file_get_content utilisé de cette façon va plutôt récupérer le contenu du fichier.
Je veux juste réagir sur le LOCK TABLE.
Un verrou doit être déverrouillé le plus rapidement possible. Dans ton cas, ton processus aurait du être :
Puisque l'étape de l'envoi peut prendre un temps plus ou moins long, il est préférable de déverrouiller avant.
Sinon, il est effectivement plus judicieux d'utiliser la méthode de seebz.
Je veux juste réagir sur le LOCK TABLE.
Un verrou doit être déverrouillé le plus rapidement possible. Dans ton cas, ton processus aurait du être :
1) Je bloque l'accès en lecture, écriture et édition (SELECT, INSERT, UPDATE) ;
2) Je sélectionne 50 emails (par priorité) ;
3) Je les supprime de la table "mailing" ;
4) Je déverouille la table
5) Je les envoie ;.
Puisque l'étape de l'envoi peut prendre un temps plus ou moins long, il est préférable de déverrouiller avant.
Sinon, il est effectivement plus judicieux d'utiliser la méthode de seebz.
6 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- [PHP/SQL] Associer plusieurs SELECT de tables MySQL
- gestion tables sql
- Requete SQL sur 2 tables
- [Résolu] PB requete SQL 3 tables + 2 count
- SQL Requête dans plusieurs tables
- Passer deux tables SQL en une
- Tables SQL disparues chez OVH
- Grouper les tables SQL comme Freeglobes
- Passage de tables sql en flux xml locatif ?
- Problème de jointure entre deux tables requête SQL
- La commande site: dans Google - 25-10-2004
- Commande site: sur Google et pages ignorées - 06-03-2007
- Voici pourquoi Google fournit peu d'infos sur les backlinks - 25-09-2006
- AdSense Tracking : statistiques détaillées sur les clics AdSense - 29-02-2004
- LinkFromDomain : analyse des liens sortants d'un site - 19-10-2006
- La commande link: sur Google - 20-12-2005
- La foire aux backlinks sur Google et Yahoo! - 05-12-2004
- SEO for Firefox : une extension Firefox pour le référencement - 05-07-2006
- Analyse des backlinks
Cet outil vous permet d'analyser en détails la "popularité" de votre site sur Google. En plus du nombre de liens pris en compte par Google, il calcule le pourcentage de liens internes parmi tous les liens, et il affiche les premières URL trouvées.
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

