limite d'exécution de script, aide/suggestion svp

Petit nouveau ! | 7 Messages

04 mars 2010, 19:37

Bonjour,

Voici une brève explication du problème:

J'ai un script appelé en cronjob qui, en gros envoit des courriels à des membres (un genre de «mail list», mais un peu plus complexe), car chaque courriel est unique au membre. Il y a environ 20 à 25 courriels pour l'instant à envoyer, donc, ce n'est pas trop grave. Si j'exécute le script en remplaçant l'envoit des courriels par un afichage, le script prend moin d'une seconde à s'exécuter au complet.

Le problème est que la liste des membres augmente et qu'en utilisant la fonction «mail» de php, l'hébergeur fait une vérification du courriel par un antivirus et anti-spam, ce qui ralenti le processus d'envoit à environ .7 secondes par courriel.. Donc, pour l'envoit des courriels, ca prend un peu plus de 20 secondes.

Ayant une limite de 30 secondes pour le script, je vois la ligne de rupture de très près.

L'hébergement se fait sur un serveur partagé, en safe_mode. Donc, on oubli les «ini_set» pour le «time_execution» car non autorisé et ce n'est pas très bien vu de la part des hébergeurs en général.

Si vous avez une solution suggestion ou besoin de plus de détails, n'hésitez pas.

Merci!

ViPHP
AB
ViPHP | 5818 Messages

04 mars 2010, 20:03

Tu peux programmer 10 crons espacés de cinq minutes par exemple. Envoyé par paquets de 25 tu pourras envoyer au total 250 mail.
Ce peut être le même cron (appelé dix fois) qui mémorise en bdd ou dans un fichier texte l'état d'avancement de l'envoi de tes mails.

Petit nouveau ! | 7 Messages

04 mars 2010, 20:23

Oui, j'avais pensé a cette solution, mais ne sachant pas combien de courriels doivent être envoyés à la base, il est difficile de faire ainsi...

Je vais essayé d'être plus clair dans l'objectif du script:

En gros, c'est une sorte de boutique en ligne regroupant plusieurs marchands, mais avec un envoit des commandes une fois par semaine.

Le script fais des opérations dans la base de données (effaces les utilisateurs inactifs, fait du ménage, inscrit les commandes passées, etc).

Le script prend les commandes reliés à un marchand et lui envoit un lien html vers la liste de ce qu'il doit faire, ou le livrer pour et à quelle commande (client) ses produits doivent être préparés.

Un courriel est envoyé à chaques marchands qui a eu une commande et par la suite, un courriel contenant des liens vers les différentes commandes est envoyé au gestionaire de la boutique contenant des informations concernant les commandes ( en l'occurence, ce ne sont que des liens html).

Ayant plusieures tables de liées, et un nombre de courriels indéfini, il est difficile de lancer le script a toutes les x temps étant donné les différentes opérations à exécuter.

Sinon, ca serait de lancer différents script pour les différentes opérations, mais cela impliquerait d'envoyer plusieurs courriels à l'Administrateur pour lui signaler si les opérations ont réussit ou pas... Ça commencerait à être lourd en nombre de courriels que l'administrateur recevrait.

J'espère que cette explication est mieux.

Mammouth du PHP | 985 Messages

04 mars 2010, 20:27

Je ne comprends pas très bien ton premier post:
A moins que je me trompe, le script devrait envoyer les 25 mails d'un coup, mais ce qui produit le décallage de 20 secondes, c'est le serveur mail, avec ces vérifications...
Donc je ne voie pas le rapport avec le temps d'exécution du script...

Le script n'est pas censé vérifier sur la boite mail distante si le mail est bien reçue avant d'envoyer le suivant...
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
AB
ViPHP | 5818 Messages

04 mars 2010, 20:39

Je ne comprends pas très bien ton premier post:
A moins que je me trompe, le script devrait envoyer les 25 mails d'un coup, mais ce qui produit le décallage de 20 secondes, c'est le serveur mail, avec ces vérifications...
Donc je ne voie pas le rapport avec le temps d'exécution du script...

Le script n'est pas censé vérifier sur la boite mail distante si le mail est bien reçue avant d'envoyer le suivant...
mail .... Retourne TRUE si le mail a été accepté pour livraison, FALSE sinon.
Il est important de noter que ce n'est pas parce que le mail a été accepté pour livraison qu'il arrivera à destination
La fonction mail vérifie donc que le mail a été accepté pour livraison ce qui peut prendre plus ou moins de temps...

Mammouth du PHP | 985 Messages

04 mars 2010, 20:51

Par l'intermédiaire du serveur SMTP?
Et l'antivirus agit entre les 2?

Si oui, alors je ne comprends pas comment les scripts de maillings peuvent fonctionner au dessus de 30 mails sans cronjobs...
Modifié en dernier par Dr@ke le 04 mars 2010, 21:18, modifié 2 fois.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Petit nouveau ! | 7 Messages

04 mars 2010, 21:12

les mail list comme phpList utilisent normalement AJAX (donc javascript) pour relancer le script apres un certain temps, donc, il doit y avoir un navigateur d'ouvert. S'il s'exécute en cronjob, ils utilisent la commande «set_time_limit» pour allonger le temps d'exécution permis et voir meme l'enlever, mais cela ne fonctionne que si le serveur n'est pas en safe_mode. Donc, je ne peux utiliser ces solutions.

Mammouth du PHP | 985 Messages

04 mars 2010, 21:18

Ok, je ne me suis jamais encore penché sur les script maillings.

Sinon, je pense que de toute façon c'est une mauvaise idée et/ou solution de changer le temps maximum d'exécution des scripts.

De plus au final, c'est une bonne chose, cela permet aussi de moins surcharger le serveur mail et l'anti-virus.

Bref désolé pour l'intervention, j'avais besoin de quelques éclaircissements.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphanteau du PHP | 31 Messages

04 mars 2010, 21:21

Bonjour,

Étant donné le peu de maîtrise que tu as sur le serveur c'est assez compliqué. Es-ce que tu as envisagé de prendre un serveur dédié ?

Sinon, une solution possible serait que ton cron enregistre les envois à faire dans une table à part (par exemple tu enregistres l'adresse du destinataire et le contenu du message). Une fois cela fait, tu lance une autre tache (toutes les minutes ?) qui marque les 5 premiers enregistrements marqués comme non envoyés comme étant "en cours d'envois", envoie les 5 mails, efface les enregistrements correspondants et s'arrête.

C'est un peu ... moyen mais si tu n'as aucun moyen de permettre aux scripts de durer plus de 30 secondes et qu'un envoi en dire 7 tu n'as pas des masses de choix.

Petit nouveau ! | 7 Messages

04 mars 2010, 21:29

Merci Mercantos pour ta suggestion.

Le problème étant toujours que je ne sais pas combien de courriels doivent être envoyés, je ne peux pas faire cela.

Ce qu'il faudrait, c'est qu'a la fin du script, qu'il se rappelle lui même ou un script qui ne gere que les courriels, mais dans une autre instance (donc, pas en include, mais avec une commande shell). Le problème, c'est que je ne sais pas si cela est possible.

Merci!

ViPHP
AB
ViPHP | 5818 Messages

04 mars 2010, 22:34

Merci Mercantos pour ta suggestion.

Le problème étant toujours que je ne sais pas combien de courriels doivent être envoyés, je ne peux pas faire cela.

Merci!
J'arrive toujours pas à comprendre pourquoi tu ne pourrais pas faire cela. Il suffit de séparer les tâches comme mentionner plus haut.
Un cron qui fait la gestion de tes commandes et enregistre en bdd les mail à envoyer. Puis quelques minutes plus tard une série de cron pour envoyer les messages. C'est pas un souci si la liste est vide, le cron ne fera rien.
Il s'agit juste de définir un nombre de cron pour te permettre d'envoyer un maximum de X messages. Et si la limite est dépassée tu peux toujours t'envoyer un mail pour te prévenir qu'il faut augmenter ce nombre...

Eléphanteau du PHP | 31 Messages

04 mars 2010, 23:36

Effectivement, s'il n'y a rien a envoyer le cron d'envoi ne ferait rien.

Il suffit de le lancer toutes les minutes et s'il y a des choses à envoyer il envoi, sinon il ne fait rien.