Comment créer une file d’attente d’e – mails qui envoie 100 e – mails par seconde via Amazon ses
Ce n’est plus un secret que je me connecte à WP offload ses, un nouveau plug – in que nous espérons lancer bientôt qui simplifiera le processus d’envoi de courriels de votre site à Amazon ses. Bien que je l’ai mentionné précédemment sur ce blog, il y a une chose que je n’ai pas mentionnée, c’est la performance que vous pouvez vous attendre à en tirer. Dans l’article de cette semaine, j’ai décidé de prendre du recul et d’examiner le système de files d’attente que nous avons mis en place et comment nous avons réduit ses performances à la dernière once. Nous savions tout de suite que nous devions mettre en place une file d’attente d’e – mail afin de ne pas envoyer d’e – mail immédiatement, mais de faire la file d’attente et le traitement par lots. Les serveurs SMTP ont généralement une file d’attente intégrée, mais comme nous utilisons l’API Amazon ses au lieu de SMTP, nous devons mettre en œuvre notre solution.
S’il n’y a pas de file d’attente, nous rencontrons des situations où le site tente d’envoyer des centaines, sinon des milliers, d’e – mails en même temps, ce qui entraîne in évitablement un crash en raison d’un manque de mémoire ou de temps de traitement des demandes. Les restrictions tarifaires d’Amazon ses doivent également être prises en considération, elles ne sont pas gravées dans la pierre et varient d’un compte à l’autre. Une fois que nous avons réalisé que nous devrions créer une file d’attente, mon cerveau va directement à la file d’attente WP, une bibliothèque de plugins WordPress créée par notre Ashley Rich. Nous l’avons déjà utilisé dans d’autres plug – ins, comme le plug – in WP migrate DB pro Topic + plug – in file d’attente et le plug – in Image Processing queue.
Pourquoi la file d’attente Wp est – elle sélectionnée? Il vous permet d’enregistrer un emploi et d’ajouter plus d’emplois à la file d’attente, puis de les exécuter via WP Cron, faisant un excellent travail. J’ai étudié d’autres systèmes de files d’attente et même les services de files d’attente simples d’Amazon. Toutefois, j’ai décidé de ne pas le faire, car le fait de dépendre d’un autre service entraînerait des coûts et une complexité supplémentaires. De plus, si nous voulons apporter des modifications ou
ERS, $Attachment);}}}}}}} Ce qui précède vérifie si la fonction WP _ mail () est écrasée et si le plug – in WP offload ses est configuré pour envoyer des messages, la fonction WP mail () est créée.
Il accepte toutes les mêmes données que la fonction WP _ mail () originale et les transmet à notre Gestionnaire de courrier personnalisé. Ajouter à la file d’attente afin que nous ayons besoin d’ajouter des courriels à la file d’attente. La méthode mail _ hander () nommée dans la fonction WP mail () ci – dessus combine tous les attributs passés à WP mail () et insère un nouveau processus de courriel dans la file d’attente: fonction publique mail Handler ($$to, $subject, $$message, $$headers, $$Attachments) {$ATTS = apply filters (‘WP mail’, compact (‘to’, ‘subject’, ‘message headers’,’ attachchmessages’, $$headers, $$headers, $$Attachments) {$ATTS = apply filters (‘WP mail’, compact (‘to’, ‘subject’, ‘message headers’,’ attachchmail headers’, ‘attachchmail’, $mailmailmailmailmailments’); $settings = $this – > Settings – > get _ Settings () ; $ Ceci – > get _ queue () – > push (New email Job ($ATTS, $settings, $this – > delay); Renvoie True;} Ceci enregistre le travail de courriel dans la base de données pour traitement ultérieur. En ce qui concerne le travail par courriel, voici ce qui suit:
Class e – mail _ Jobs extensions Jobs {\/ * * * @ var Array * \/ private $ATTS; \/ * * * @ var Array * \/ private $settings; \/ * * * pass any necessary data to Jobs. * @ Param string $ATTS * \/ public Function Structure ($ATTS, $Settings) {$this – > ATTS = $ATTS; $this – > Settings = $settings;} \/ * * Gérer la logique de travail Poignée de fonction publique () {global $WP _ offload ses; if (isset ($this – > ATTS [‘to’]) {$to = $this – > ATTS [‘to’]] If (isset ($this – > ATTS [‘subject]) {$subject = $this – > ATTS [‘ subject]]} If (isset ($this – > ATTS [‘message]) {$message = $this – > ATTS [‘ message]} If (isset ($this – > ATTS [‘headers]) {$headers = $this – > ATTS [‘ headers]]; If (isset ($this – > ATTS [‘attachments]) {$attachments = $this – > ATTS [‘ attachments];} Client = $WP _ offload ses – > get ses API () – > get client () Courriel = nouveau courriel ($destinataire, $sujet, $message, $titre, $pièce jointe, $ceci – > paramètres) $ Original = $email – > prepare () Données = tableau (‘x message id = > $this – > ID (),
« rawmessage» = > array (‘Data’ = > $original,),); Retourner $client – > getcommand (‘sendrawmail’, $Data);} Lorsque la file d’attente traite une tâche, elle restaure la classe email _ job à partir de la base de données en utilisant les propriétés qui lui sont passées dans le constructeur, puis appelle la méthode Process () pour exécuter la tâche.
La fonction privée execute () {global $WP _ offload ses; \/ \/ start Command Pool $client = $WP offload ses – > get ses API () – > get client (); $$Command Pool = new commandpool ($$client, $$this – > commands, [competition ‘= > = > $$this – > $this – > Command’ = > $$this – > $this – > Command Command execute () {global $WP offload ses; \/ \/ START commandpool $client = $WP offload ses; \/ \/ START commandpool $client = $WP offload ses – > get ses API () – > get API () – > = > fonction (resultingerface $result, $iterkey, promiseinterface $aggregatepromisepromisepro) {$id = $this – > Command [$iterkey] [‘X – message ; $ Job = $this – > connection – > get Job ($ID) $ Ceci – > connexion – > supprimer ($job);}, » \