2011-04-18 48 views
0

的某些部分我有执行下列步骤瓶颈放慢我的剧本

  1. 用户登录脚本中,增加了一个短信,并指定收件人。该信息被添加到“排队的消息表”中;
  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(); 
     } 
} 

回答

0

我猜测它有可能成为你正在使用的API。我不得不与apis一起工作,因为极端的速度很慢。也许尝试剖析代码的不同部分具有标杆类:

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

那将是发现代码中最慢的部分快速而简便的方法。

+0

将消息传递给API是可以的,通过ID循环并将其记录到数据库中是很慢的部分,我想知道是否可以找到更好的方法来生成并记录ID – elf1984 2011-04-18 23:21:00

0

我猜这是在某种循环上运行吗?而不是一次插入一个未知数量的记录,请查看用户指南中的Active Record的insert_batch()方法http://codeigniter.com/user_guide/database/active_record.html您可以使用一次数据库调用来插入所有记录。所有循环将不必将数据插入数据库,而是构建一个将插入的所有数据的数组。循环完成后,为刚刚构建的数组运行insert_batch('f_sent_sms',$ my_data)。

@Matthew已经说过,所有这一切都是一个好主意(之前和之后)。

+0

如果您阅读示例代码上面,检查这个方法log_sms(),那是你在说什么?我从ID数组构建一个查询并运行一次查询来插入数据 – elf1984 2011-04-19 21:00:46