Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/01/2011, 12h00   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2010
Messages : 77
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 77
Points : 12
Points : 12
Par défaut emailing à route via une tache symfony

Bonjour à tous,

J'ai mis en place un moteur d'emailing qui doit être lancer tous les jour sà une heure précise via une tache symfony que j'ai crée.
Le problème c'est que lorsqu'il s'agit d'envoyer un emailing à 10 ou 15 personnes ca marche sans probleme; mais là je dois l'envoyer à 8000 personnes et ca ne marche pas meme pas pour le premier.
Dans mon fichier factories.yml j'ai essayer ces deux strategies d'envoi :spool et realtime rien n'a change
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
prod:
  logger:
    class:   sfNoLogger
    param:
      level:   err
      loggers: ~
 
  mailer:
    class: sfMailer
    param:
      logging:           %SF_LOGGING_ENABLED%
      charset:           %SF_CHARSET%
      delivery_strategy: realtime
      transport:
        class: Swift_SmtpTransport
        param:
          host:       ****
          port:       ****
          encryption: 
          username:   
          password:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
prod:
  logger:
    class:   sfNoLogger
    param:
      level:   err
      loggers: ~
 
  mailer:
    class: sfMailer
    param:
      logging:           %SF_LOGGING_ENABLED%
      charset:           %SF_CHARSET%
      delivery_strategy: spool
      transport:
        class: Swift_SmtpTransport
        param:
          host:       ****
          port:       ****
          encryption: 
          username:   
          password:
ma tache est bien créee dans le dossier lib/task

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
class emailingTask extends sfBaseTask {
 
    protected function configure()
  {
    // // add your own arguments here
     //$this->addArguments(array(new sfCommandArgument('my_arg', sfCommandArgument::REQUIRED, 'My argument')));
 
    $this->addOptions(array(
      new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'frontend'),
      new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'prod'),
      new sfCommandOption('connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'doctrine'),
      // add your own options here
    ));
 
    $this->namespace        = 'send';
    $this->name             = 'emailing';
    $this->briefDescription = '';
    $this->detailedDescription = <<<EOF
The [send:emailing|INFO] task does things.
Call it with:
 
  [php symfony send:emailing|INFO]
EOF;
  }
 
/*  protected function execute($arguments = array(), $options = array())
  {
    // initialize the database connection
    //$databaseManager = new sfDatabaseManager($this->configuration);
    //$connection = $databaseManager->getDatabase($options['connection'])->getConnection();
 
      //$this->logSection('say', 'Hello, '.$arguments['my_arg'].'!');
     try
      {
         $client = new SoapClient('http://hyundai.bdmr.fr/hyundai/ws/SimpleWS?wsdl');
         $connexion = $client->authenticate('WSDL','buno2010');
 
 
      }
       catch(SoapFault $e)
       {
           exit ($e->getMessage());
       }
      $from = 'arnaud2004@yahoo.fr';
      $recipient = 'arnaud.femtchou@digikeys.fr';
      $subject = 'sujet';
      $messageBody = $connexion ;
 
      $mailer  = $this->getMailer();
      $mailer->composeAndSend($from, $recipient, $subject, $messageBody);
 
    // add your code here
  }*/
 
 
 
  protected function execute($arguments = array(), $options = array())
  {
   ....
}
et sur le serveur j'appelle ma tache comme ceci pour qu'elle se lance à 11h37 par exemple

Code :
1
2
 
37 11  * * * /usr/bin/php5 --php-ini /etc/php5/apache2/php.ini /var/www/emailingauto/symfony send:emailing --application="frontend" > /home/result.log
elle marche bien quand il s'agit d'une petite quantite mais quand on passe la barre des 2000 ! ca merde!!

Au secouuuuuuuuurs!!!!!!!!
lepopol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 12h41   #2
Invité régulier
 
Inscription : octobre 2010
Messages : 28
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 28
Points : 7
Points : 7
Je dis peut être une bêtise, mais ca ne peut pas être dû au fait que par défaut PHP limite le temps d'exécution d'une page à 30secondes, et que envoyer 8000emails risque de mettre plus que 30sec ?
oOZarkOo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 12h53   #3
Candidat au titre de Membre du Club
 
Inscription : avril 2010
Messages : 77
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 77
Points : 12
Points : 12
je sais pas trop comment ca marche; mais je pense que, vu que c'est une tache que j'appelle et non une page web; le timing de 30s n'est pas pris en compte. bon après je suis pas très sur de c que je dis.

Mais même si le timing est de 30s , il devait au moins marcher pour les premiers mails, ce qui n'est pas le cas.

ceci dit où est ce que je peux augmenter le temps d'exécution sur un projet symfony??.
lepopol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 13h41   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
oOZarkOo +1

Tu envoies 8000 courriels différents ou un courriel à 8000 personnes ?

Edit
La durée maximum d'exécution est pour tous les scripts PHP, ligne de commande ou pas.

La modification est dans les php.ini.

Attention, suivant ta configuration, il est possible que tu aies un php.ini pour le web et un autre pour la ligne de commande. Vérifie avec un phpInfo() que tu peux lancer en web et en local pour comparer.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 14h36   #5
Candidat au titre de Membre du Club
 
Inscription : avril 2010
Messages : 77
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 77
Points : 12
Points : 12
j'essaye d'envoyer 8000 e-mails à 8000 personnes; parce que chaque e-mail est personnaliser par le nom, prénom et autre
je viens d'augmenter la timeout et redémarrer le serveur, mais rien ne marche!
lepopol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 15h04   #6
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
A raison de 2 courriel par seconde, il nous reste dans les 4000s de traitement, soit plus d'une heure, on est loin des 30"...

Peut-être avec un traitement réentrant, dans le genre, tu traites X courriel, puis ton application renvoie la requête et se ferme.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 15h41   #7
Candidat au titre de Membre du Club
 
Inscription : avril 2010
Messages : 77
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 77
Points : 12
Points : 12
Je parcoure une table avec la boucle for; je récupère chaque personne et ses info, je configure mon template et j'envoie un émail, jusqu'à la fin de la table mail.bien sûr y a deux ou trois méthodes qui sont appelées entre temps.

Ca devrait aller ca!??

PS: la population était au nombre de 8133 et le truc a juste route 122 mails s'est arrêté.J n sais pas si cette info peut vous guider.
lepopol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 17h02   #8
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Ceci confirme la durée de traitement de plus ou moins (un peu moins) de deux courriel par seconde.

Il faut donc, soit que les traitements durent moins de 30 seconde (peut réaliste), soit utiliser un code ré-entrant. Voir précédant poste.

Je ne pense pas que passer les paramètres de php pour autoriser des scripts de 90 minutes soit une bonne idée.

Edit
Une autre idée. Tu crées soit un champs dans ta table, soit une table supplémentaire pour ceux qui doivent recevoir un courriel. L'idée est de pouvoir facilement vérifier à qui le courriel à été envoyé.

Tu limites volontairement ta procédure à un certain nombre de personnes parmi celles qui n'ont pas encore eu leur courriel (dison 100, soit moins de 30" de traitement).

Tu crées un cron qui envoie la commande toutes les minutes.

Il faudra donc 80 minutes pour envoyer tes courriels. Et plus de blocage. Après, tu peux toujours adapter en fonction des performances.

Attention aux procédures anti-spam de certains serveur de messagerie (ton serveur, pas celui des destinataires) qui risquent de voir ta procédure comme une tentative de spam.

Attention aux demandes préalables d'autorisation d'envoyer un courriel qui doit être faîte à tous particulier en France.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h49.


 
 
 
 
Partenaires

Hébergement Web