0

ご意見やアドバイスをお待ちしております。私の PHP アプリケーションは、現地時間に基づいて個々のメールをユーザーに送信する必要があります。

各ユーザーには、電子メールの受信を選択した一連のタイムマークがあります。これは、タイムマーク フィールドがデータベースでどのように見えるかです: 12:00:00, 14:15:00, 16:30:00.

私はタイムマークを最も近い 15 分に丸め、15 分ごとに cronjobs を送信して、どのユーザーが電子メールにスケジュールされているかを確認し、それぞれの電子メールを1 つずつ送信しています (心配そうに見えます :-/)。

サーバーのタイムゾーンが に設定されAmerica/New_Yorkているため、ユーザーが別の場所にいるため、自分の時間に基づいてメールを送信できません。以下では、この問題を処理するモデルを開発しました。

解決:

  1. 各ユーザーのタイムゾーンを収集する
  2. 各cronjobで、タイムゾーンデータを使用してphpで各ユーザーのローカルタイムを取得します
  3. ユーザーのタイムマークの配列を作成します。

    例:12:00:00, 14:15:00, 16:30:00

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

  4. ユーザーのローカルタイムがタイムマークのいずれかに一致する場合は、電子メールを送信します

  5. 送信日でデータベースを更新

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('myemail@gmail.com', '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");

         }

    }

懸念:

  • モデルは信頼できますか?
  • パフォーマンスの問題。わずか 4 通のメールを送信するのに約 5 秒かかります。 (注: ローカル Windows サーバーのテスト環境からメールを送信しています - WAMP)
4

1 に答える 1