0

次の手順を実行するスクリプトがあります

  1. ユーザーがログインし、SMS メッセージを追加して、受信者を指定します。その情報は「キューに入れられたメッセージ テーブル」に追加されます。
  2. 一部のプロセスは API を使用してメッセージを送信し、メッセージは「送信済みメッセージ テーブル」に移動されます。
  3. 配信報告が来て、「送信メッセージテーブル」からメッセージが削除され、「送信メッセージログテーブル」に送信メッセージを参照するログエントリが追加されます。

「キューメッセージテーブル」に大量のメッセージがキューイングされている場合、手順(2)および(3)に時間がかかります。

メッセージが API にプッシュされる前に、後でレポートを取得するときに参照できるように、受信者ごとにランダムな一意の ID が生成されます。この ID は、テーブル「送信済みメッセージ ログ テーブル」に使用されます。

以下はサンプルスクリプトです

<?php
class Message {

    /*
    * random unique id for mobile number
    */
    protected $mobile_ids = array();

    public function add_unique_id($id, $mobile) 
    {
        $this->mobile_ids[] = array($id, $mobile);
    }

    public function get_unique_id()
    {
        return $this->mobile_ids;
    }

    // The method that generated the xml for API
     public function makeXML($param,$multi_part=false) 
     {
            $xmlString =
            "<SMS>
            <authentification>
            <username>sss</username>
            <password>sss</password>
            </authentification>
            <message>
            <sender>sender</sender>";
            if($multi_part == "longSMS") $xmlString .= "<type>longSMS</type>";

            $xmlString .= "<text>{$param['text']}</text></message><recipients>";

            // Array of mobile numbers came from $param
            $phone_numbers = $param['numbers'];

            // Loop through the array and generate <gsm messageId='0001'>mobile</gsm>
            foreach($phone_numbers as $mobile) {

                // Generate id for mobile
                $msg_id = $this->make_random_int();

                /**
                 * This is the slow part of the script,
                 * IDs are added to the array for logging into the database
                 * When message is sent, i looped through the id and created a log for this message
                 **/
                $this->add_unique_id($msg_id, $mobile);


                $xmlString .= "<gsm messageId=\"{$msg_id}\">{$mobile}</gsm>";
            }
            $xmlString .= "</recipients></SMS>";
            return $xmlString;
        }

         /**
          * This is the method that created the log
         * Log the sms
         * You will need to call $msgid = $this->update_db('the sms')
         * return value of $msgid is last_insert_id
         */
        public function log_sms($msgid) {
            // Log the currently sent message
            $userData = array();
            $now = date('Y-m-d H:i:s');
            foreach ($this->mobile_ids as $data) {
                $userData[] = "('{$msgid}', '{$data[0]}', '{$data[1]}', 'QUEUED', '0000-00-00', '0000-00-00', '{$now}')";
             }

             $query = 'INSERT INTO sent_sms_log (txtId,msgID,mobile,status,sentdate_time,deliver_date_time,sysdate_time) VALUES' . implode(',', $userData);
             $this->ci->db->query($query);

             $this->mobile_ids = array(); // reset the array
        }       
     // Make random int
      protected function make_random_int() {
            $this->ci->load->helper('string');
            $int =  random_string('numeric', 12);
            return $int;
        }

         /**
         * Update database after sms sent
         * @return int
         */
        public function update_db($msg, $owner, $qid=0) {
            $data = array('qid'=> $qid, 'sms' => $msg, 'date_time' => date('Y-m-d H:i:s'), 'owner' => $owner);
            $this->ci->db->insert('f_sent_sms', $data);
            return $this->ci->db->insert_id();
        }
}
4

2 に答える 2

0

おそらく、使用しているAPIである可能性が高いと思います。非常に遅いさまざまなサービスの API を使用する必要がありました。ベンチマーク クラスを使用して、コードのさまざまな部分をプロファイリングしてみてください。

http://codeigniter.com/user_guide/libraries/benchmark.html

これにより、コードの最も遅い部分をすばやく簡単に見つけることができます。

于 2011-04-18T23:17:26.597 に答える
0

これは現在、ある種のループで実行されていると思いますか?不明な数のレコードを一度に 1 つずつ挿入する代わりに、ユーザー ガイドhttp://codeigniter.com/user_guide/database/active_record.htmlで Active Record の insert_batch() メソッドを確認してください。1 つのデータベース呼び出しを使用して挿入できます。あなたのすべての記録。データベースにデータを挿入するループの代わりに、ループが行う必要があるのは、挿入されるすべてのデータの配列を作成することだけです。ループが完了したら、作成した配列に対して insert_batch('f_sent_sms', $my_data) を実行します。

@Matthewがすでに言ったように、それをすべて(前後に)ベンチマークすることをお勧めします。

于 2011-04-19T19:19:40.897 に答える