Changeset 103808 in spip-zone


Ignore:
Timestamp:
Apr 7, 2017, 9:37:11 AM (2 years ago)
Author:
cedric@…
Message:

Les webhooks de feedbacks peuvent etre appeles a grande frequence si on a envoye beaucoup de mails, et faire des operations SQL a chaque hit est mauvais pour la perf du serveur
On memorise donc les infos dans un fichier de tmp/newsletter_feedbacks/ et un cron se charge du depouillement asynchrone, le plus efficacement possible

Location:
_plugins_/mailshot/trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/mailshot/trunk/genie/imap_feedback.php

    r94427 r103808  
    6161                                                    }
    6262                                                    if ($event) {
    63                                                             $feedback($event,$original_recipient,$tracking_id);
     63                                                            $feedback($event,$original_recipient,$tracking_id,true);
    6464                                                    }
    6565                                            }
  • _plugins_/mailshot/trunk/genie/mailjet_feedback.php

    r84981 r103808  
    6060                                                if ($event) {
    6161                                                        #var_dump("$event : ".$email->to_email);
    62                                                         $feedback($event,$email->to_email,$tracking_id);
     62                                                        $feedback($event,$email->to_email,$tracking_id,true);
    6363                                                }
    6464                                        }
  • _plugins_/mailshot/trunk/mailshot_pipelines.php

    r98684 r103808  
    3939                $taches_generales['imap_feedback'] = 3400;
    4040        }
     41
     42        // depouiller les feedbacks en async, toutes les 5mn
     43        $taches_generales['feedbacks'] = 300;
    4144
    4245        return $taches_generales;
  • _plugins_/mailshot/trunk/newsletter/feedback.php

    r102612 r103808  
    2121 *   reject : email rejete
    2222 *   spam : email taggue en spam
    23  * @param $email
    24  * @param $tracking_id
     23 * @param string $email
     24 * @param string $tracking_id
     25 * @param bool $is_cron
    2526 */
    26 function newsletter_feedback_dist($quoi,$email,$tracking_id){
     27function newsletter_feedback_dist($quoi,$email,$tracking_id, $is_cron = false){
     28        static $file;
    2729
     30        // si on est pas dans un cron, il faut eviter de consommer des ressources car on peut avoir beaucoup d'appels concurrent par webhook
     31        // on enregistre les infos dans un fichier a depouiller en cron
     32        if (!$is_cron) {
     33
     34                if (!$file){
     35                        $file = sous_repertoire(_DIR_TMP, 'newsletter_feedbacks') . substr(md5(@getmypid() . '-' . $_SERVER['REQUEST_TIME']), 0, 8);
     36                }
     37                // tous les feedbacks d'un meme hit dans le meme file, une ligne de JSON par feedback
     38                $row = json_encode(array($quoi, $email, $tracking_id)) . "\n";
     39                // pas de concurrence puisque fichier propre au hit, on file_put_contents au plus vite, sans lock ni precaution
     40                file_put_contents($file, $row, FILE_APPEND);
     41
     42        }
     43        else {
     44
     45                newsletter_feedback_un($quoi,$email,$tracking_id);
     46
     47        }
     48}
     49
     50/**
     51 * Depouiller un lot de feedbacks (issu d'un fichier)
     52 * @param array $feedbacks
     53 */
     54function newsletter_feedback_lot($feedbacks) {
     55        $recompte_mailshots = array();
     56
     57        $nb = count($feedbacks);
     58        spip_log('newsletter_feedback_lot : '.$nb.' feedbacks', 'newsletter_feedback');
     59
     60        foreach($feedbacks as $feedback) {
     61                if (count($feedback)>=3) {
     62                        list($quoi, $email, $tracking_id) = $feedback;
     63                        if ($id_mailshot = newsletter_feedback_un($quoi, $email, $tracking_id, false)) {
     64                                $recompte_mailshots[$id_mailshot] = true;
     65                        }
     66                }
     67                else {
     68                        spip_log('feedback lot mal formate : '.var_export($feedback, true), 'newsletter_feedback');
     69                }
     70        }
     71
     72        // et on demande un recomptage async des mailshots vus
     73        if (count($recompte_mailshots)) {
     74                $recompte_mailshots = array_keys($recompte_mailshots);
     75                foreach ($recompte_mailshots as $id_mailshot) {
     76                        job_queue_add("mailshot_compter_envois","mailshot_compter_envois",array($id_mailshot),"inc/mailshot",true);
     77                }
     78        }
     79
     80}
     81
     82
     83/**
     84 * Prendre en compte un feedback, en lancant un recomptage si besoin
     85 * @param string $quoi
     86 * @param string $email
     87 * @param string $tracking_id
     88 * @param bool $recompter
     89 * @return int|bool
     90 *   id_mailshot du feedback si il y a eu modif, false sinon
     91 */
     92function newsletter_feedback_un($quoi,$email,$tracking_id, $recompter = true) {
    2893        if (!in_array($quoi,array('read','clic','soft_bounce','hard_bounce','reject','spam'))){
    2994                spip_log("$quoi inconnu ","newsletter_feedback"._LOG_INFO_IMPORTANTE);
    30                 return;
     95                return false;
    3196        }
    3297
     
    3499                OR !intval($id_mailshot=$m[1])){
    35100                spip_log("tracking_id $tracking_id inconnu","newsletter_feedback"._LOG_INFO_IMPORTANTE);
    36                 return;
     101                return false;
    37102        }
    38103
    39104        if (!$row = sql_fetsel("*","spip_mailshots_destinataires","id_mailshot=".intval($id_mailshot)." AND email=".sql_quote($email))){
    40105                spip_log("email $email introuvable dans lot mailshot #$id_mailshot","newsletter_feedback"._LOG_INFO_IMPORTANTE);
    41                 return;
     106                return false;
    42107        }
    43108
     
    82147                        $unsubscribe($email,array('notify'=>false));
    83148                }
    84                 // et on demande un recomptage async
    85                 job_queue_add("mailshot_compter_envois","mailshot_compter_envois",array($id_mailshot),"inc/mailshot",true);
     149                if ($recompter) {
     150                        // et on demande un recomptage async
     151                        job_queue_add("mailshot_compter_envois","mailshot_compter_envois",array($id_mailshot),"inc/mailshot",true);
     152                }
     153                return $id_mailshot;
    86154        }
    87155        else {
     
    89157        }
    90158
     159        return false;
    91160}
  • _plugins_/mailshot/trunk/paquet.xml

    r103720 r103808  
    22        prefix="mailshot"
    33        categorie="communication"
    4         version="1.21.3"
     4        version="1.22.0"
    55        etat="stable"
    66        compatibilite="[3.0.5;3.1.*]"
Note: See TracChangeset for help on using the changeset viewer.