Page 1 sur 1

Newsletter et problème de cron

Posté : 26 mai 2008, 12:20
par Bidibule
Bonjour à tous!

Voilà je bloque sur un problème épineux.

j'ai développé une appli de newsletter avec une table de file pour les adresses.

Avant c'était appelé toutes les 15 minutes par Cronjob et ça me lançait 220 mails à la fois.
pas de problème de ce côté là, on évitait le spam assurément

Mais maintenant, je dois faire l'envoi par SMTP car c'est trop long (sur 18000 mais ça prend du temps!) et donc je fais l'envoie de toute la liste d'un coup.

Le problème est que le cronjob se rappelant toutes les 15 minutes l'appli envoie des maisl en doublons car la table des envois n'est pas totalement vidée...

Mes questions sont les suivantes :

- en virant le cronjob, comment je peux lancer mon script PHP directement après avoir rempli la table des envois sans devoir laisser la fenêtre du navigateur ouvert (condition obligatoire)
- en conservant le cronjob, comment faire en sorte que le fichier ne soit pas appelé 2 fois en même temps

j'ai tenté un LOCK de la table mais sans résultat

Merci à vous!

Posté : 26 mai 2008, 12:31
par zeus
Bonjour,

Tu peux rajouter un champ "pris_en_compte" qui indique quels sont envois qui sont en cours d'envoi par un script.

Il faudrait que tu modifies ton script pour modifier ce champ "pris_en_compte" au début, puis envoyer tout ces emails.
Du coup, si un autre script se lance avant la fin du 1er, il suffit de ne pas prendre en compte ceux qui sont déjà pris en compte ;)

Posté : 26 mai 2008, 12:37
par Bidibule
Ce que je ne comprends pas c'est que justement après chaque envoi par SMTP j'élimine les adresses de ma bases de données!

Mais j'obtiens à la réception un truc bizarre :

Les adresses commençant par ‘a’, ‘b’, ‘c’… ont reçu la newsletter une seule fois.
Les adresses commençant par ‘i’… ont reçu la newsletter deux fois.
Les adresses commençant par ‘m’… ont reçu la newsletter trois fois.
Les adresses commençant par ‘p’… ont reçu la newsletter quatre fois.

Je crois que c'est dû aux processus lancés en parallèle par le cronjob (le fichier queue.php lancé à intervalle de 15 min)

EDIT : je comprends ce que tu veux dire... je suppose qu'avant le mail->Send() je flaggue l'enreg c'est ça ??

Posté : 26 mai 2008, 12:41
par zeus
Tu as tout compris.

Ton problème viens du fait que si la seconde tache se lance avant la fin du 1er, il vont partir ensemble de là où en était le 1er (vers 'c').
Puis le 3ème va les rejoindre de là où se trouvaient les 2 1er ('m')
etc ...

Posté : 26 mai 2008, 13:43
par Bidibule
Et en virant le cronjob (car en fait il ne servira pas à grand chose de faire un cronjob sur ce fichier dorénavant), tu as une idée ??

J'avais pensé à un exec() mais ça a pas l'air de marcher...

Posté : 26 mai 2008, 14:11
par zeus
exec() quoi ?

Pose les choses calmement et reflechi à ce que tu veux faire avant de te lancer dedans. C'est le meilleur moyen de prévoir et d'avancer plus vite ;)

Ton soucis, aujourd'hui, c'est que comme ton envoi est cadencé tout les 1/4h, l'exécution du 1er n'est pas terminé quand le second démarre, c'est ça ?
Tu voudrais changer ça, vrai ?

Donc, il faut que tu regardes du côté des impératifs :
  • Est-ce que tu as une imposition sur le temps maximum sous lequel doit partir une newsletter ? si oui, lequel ?
  • Est-ce que tu as facilement accès au modèle de données et au code ? Si oui, as-tu le temps de le retoucher ?
La solution que je te propose est pérenne puisque, si ton envoi prend plus d'une journée (on peut rêver, mais bon), le problème se reposera.

Posté : 26 mai 2008, 14:21
par Bidibule
faire un exec(php - f monscript.php) afin de ne le lancer qu'une seule fois.

En fait le problème est que j'ai codé avec l'idée de l'envoi tous les 15 min à intervalles et qu'on m'a demandé de changer en envoyant tout par SMTP, d'un seul coup.

Donc l'idée du cronjob tombe à l'eau sachant que les personnes qui gèrent cela on accès au php.ini et peuvent donc mettre un max_execution_time à 0

Mais surtout qu'ils ne veulent pas laisser leur fenêtre tourner pendant x h.

Donc si je pouvais lancer mon script d'envoi, une seule fois, après insertion dans la table d'envoi, indépendement de la fenêtre, mon problème serait réglé!

ici dès que j'ai fini l'insertion, je redirige vers une page avec un header mais si je tape mon code d'envoi, ça va bloquer la page et donc la personne devar attendre la fin avant de fermer sa fenêtre.

je suis en train de faire des tests avec la flag.

Posté : 26 mai 2008, 15:14
par zeus
Et qu'est-ce qui va lancer ton script ? ;)
Si tu ne veux plus de crontab, autant lancer ton script en une seule fois.

Sinon, je viens de penser à une solution plus simple :
fait en sorte que ton script dépose un fichier .lock quelque part lorsqu'il se lance te permettant de savoir si un envoi est en cours ou non.

Du coup, l'algo de ton script serait le suivant

Code : Tout sélectionner

Si fichier .lock présent Alors Afficher message d'erreur Sinon Ecrire fichier .lock Envoyer emails Effacer fichier .lock FinSi

Posté : 26 mai 2008, 15:35
par Bidibule
Oki je vois mais le problème reste en fait le même à savoir, comment lancer mon fichier "queue.php" depuis mon script de sauvegarde des emails à envoyer.

En gros, voici avant ce que j'avais

- je stocke les mails à envoyer dans une table depuis mon script 'save.php'
- je redirige vers la page d'accueil
- avec le cron, j'envoie par paquet de 220 avec mon script 'queue.php' appelés toutes les 15 minutes

et j'aimerais ceci :

- je stocke les mails à envoyer dans une table depuis mon script 'save.php'
- j'appelle mon script 'queue.php' ET je redirige vers la page d'accueil sans devoir attendre la fin du script 'queue.php'

l'idée du lock est bonne mais j'ai toujours le problème d'appel à mon script 'queue.php' sans avoir à attendre la fin pour fermer le PC ou le navigateur

(ou alors je passe à côté d'un truc qui m'échappe grave...ça se peut je suis fiévreux
:cry: )

PS : j'adore ta phrase sur l'ignorance et la connaissance! :D

Posté : 26 mai 2008, 15:50
par zeus
Avec ma proposition de fichier .lock, tu peux laisse le script d'envoi dans ta crontab ;)

Posté : 26 mai 2008, 15:51
par Bidibule
Ok je vais aller me coucher moi.....

:D

Sinon le truc du flag marche aussi !!

Merci!