Scriptul meu pentru a trimite e-mailuri bazate pe ora locală a fiecărui utilizator

Îmi post scriptul PHP în speranța părerilor și sfaturilor tale. Aplicația mea PHP trebuie să trimită e-mailuri individuale utilizatorilor în funcție de ora lor locală.

Fiecare utilizator are un set de note de timp la care au ales să primească e-mailuri. Acesta este modul în care arată un câmp de timp în baza de date: 12:00:00, 14:15:00, 16:30:00 .

Sunt rotunjirea marcajelor de timp în cel mai apropiat sfert de oră și trimiterea cronjobs la fiecare sfert de oră pentru a verifica ce utilizatori sunt programați pentru un e-mail și trimiterea e-mailurilor respective câte unul (aspect îngrijorat: - /) într-o buclă.

Fusul orar al serverului meu este setat la America/New_York , deci nu pot trimite e-mailuri pe baza timpului meu, deoarece utilizatorii se află în diferite locații. Mai jos am dezvoltat un model care ar trebui să rezolve problema.

Soluție:

  1. Collect each user's timezone
  2. On each cronjob get each user's localtime in PHP using their timezone data
  3. Create array of user's time-marks.

    Example: 12:00:00, 14:15:00, 16:30:00 to

    Array ( [0] => 12:00:00 [1] => 14:15:00 [2] => 16:30:00 )

  4. If user's localtime matches one of his/her time-mark send email

  5. Update database with date sent

Script PHP:

    //loop through user's entries table that holds content to be emailed    
    foreach ($entries as $entry) { 

         //create array of user's time-marks set            
         $timemarks_arr = array_map( "trim", str_getcsv($entry->timemarks));

         //get user's localtime
         $timezone = $entry->timezone; //user's time-zone
         $userlocaltime = gmt_to_local($timestamp, $timezone, $daylight_saving); //gets user's localtime

         //if a user's time-mark matches his/her localtime      
         if (in_array($userlocaltime, $timemarks_arr))
         {  
                //send email using Codeigniter's email class

                $this->email->clear(); //reset between cycles

                $this->email->from('[email protected]', 'Name');
                $this->email->to($entry->email); 

                $this->email->subject($entry->content);
                $this->email->message($entry->content); 

                $this->email->send();   

                echo $this->email->print_debugger();                    

                //update date sent
                $user_id = $entry->user_id;

                $this->db->query("UPDATE `entries` SET date_sent=now() WHERE `user_id` = $user_id AND `entry_id` = $entry->entry_id");

         }

    }

Preocupările:

  • Modelul este sigur?
  • Probleme de performanță. Este nevoie de aproximativ 5 secunde pentru a trimite doar 4 e-mailuri .. (Notă: trimit e-mailuri din mediul de testare pe serverul meu local de ferestre - WAMP)
0
de ce să nu convertiți fiecare utilizator preferat de timestamp la ora corespunzătoare din fusul orar înainte de ao salva, mai degrabă decât să o stocați și trebuie să o convertiți pentru fiecare calcul?
adăugat autor Rooster, sursa
Nu trebuie să faci toate aceste calcule ar trebui să te salveze o grămadă de timp
adăugat autor Rooster, sursa
puteți să păstrați întotdeauna o economie de lumină naturală și să nu economisiți timp de vară atunci să schimbați câmpul pe care îl căutați în funcție de economia de vară sau nu.
adăugat autor Rooster, sursa
@MrSlayer, durează atât de mult fără interogarea de actualizare
adăugat autor CyberJunkie, sursa
@ MikeB, mulțumesc. Pe baza datelor de profil este nevoie de 2.1155 secunde pentru a trimite 1 e-mail .. Presupun că stamp este de vina?
adăugat autor CyberJunkie, sursa
@JohnB este o idee minunată! Nu am considerat-o
adăugat autor CyberJunkie, sursa
@JohnB, singura problemă pe care o pot gândi să folosesc acea metodă este economisirea de vară. Efectuarea calculelor oferă întotdeauna timpul corect actual, în timp ce înregistrările salvate pe timestamp pot fi învechite.
adăugat autor CyberJunkie, sursa
adăugat autor CyberJunkie, sursa
Poate durează mult deoarece interogările de trimitere UPDATE interoghează în fiecare iterație a buclă. S-ar putea să fie mai bine să construiți doar o serie de user_id și entry_id care au fost trimise, apoi să creați o comandă SQL după terminarea buclă.
adăugat autor Quantastical, sursa
Probleme de performanță: Primul pas este să profilați codul
adăugat autor Mike B, sursa

1 răspunsuri

dacă nu configurați un script de server pentru timpul serverului, tot ce puteți face este să obțineți ora locală.

Ceea ce aș face este să scrieți un program simplu în C ++ sau în altă limbă care să vă poată actualiza înregistrările bazei de date. Programul trebuie setat să înregistreze timpul serverului în baza de date cu ora, iar atunci când utilizatorii trebuie să-i apeleze, să le citească câmpul din baza de date. Am facut asta inainte si a functionat destul de bine.

0
adăugat
PHP România, Moldova
PHP România, Moldova
173 participanți

Vorbim despre Yii, Laravel, Symphony, MySQL, PgSQL, WP, OpenCart... Pentru confort, opriți notificările. Parteneri: https://ciupacabra.com @js_ro @node_ro @python_ro @seo_ro @Romania_Bot Offtop: @holywars_ro Joburi: @php_job @Grupuri_IT

MySQL - comunitatea Română
MySQL - comunitatea Română
19 participanți

Comunitatea română a programatorilor MySQL.