現在、Cakephp2を利用したメール送信機能を実装しています。
今回CakeEmailを使用せずに独自のメソッドでメール送信機能を実装し、その中でrenderを使用してメールテンプレートをロードしています。
送信機能をループさせて複数の宛先にメールを送信しようとしていますが、大量のメールを送信するとメモリが圧縮されて処理速度が遅くなっていく現象が起きています。
具体的には、メール送信前のメモリ使用量は8.7MBですが、300通送信すると53MBに上昇しその後も上昇を続けます。
各プロセスのメモリ増加量を調べると、Controller :: renderを呼び出す部分がほとんどを占めているため、レンダリングの際にメモリを使っているのだと思いますが、render()をループすることによってメモリ使用量が増加する原因または解決策がありましたらご教授いただきたいです。
よろしくお願いします。
追記:
メール送信
php
1// 送信するメール取得 2$mails = $this->MailList->getSendMails(); 3foreach ($mails as $mail) { 4 // 送信先保存 5 if (!$this->saveTargetData($mail)) { 6 continue; 7 }; 8 $limit = 300; 9 $offset = 0; 10 while ($targets = $this->MailDeliveryTarget->getTargets($mail, $limit, $offset)) { 11 foreach ($targets as $target) { 12 // メール送信 13 $result = $this->Sys->sendMailTemplate('reserved_mail', ['input' => $input]); 14 if ($result) { 15 // 送信成功時処理 16 } else { 17 // 送信失敗時処理 18 } 19 } 20 unset($targets); 21 $offset += $limit; 22 } 23}
sendMailTemplateメソッド
php
1function sendMailTemplate($tpl, $data = array()) 2 { 3 $to = $this->getMailTo($tpl, $data); 4 $from = $this->getMailFrom($tpl, $data); 5 return $this->sendMail($to, $from, $this->getMailSubject($tpl, $data), $this->getMailBody($tpl, $data)); 6 } 7 8function getMailTo($tpl, $data) 9 { 10 return trim(convert_nl($this->_getMailTemplate($tpl."/to", $data), "")); 11 } 12// getMailFrom, getMailSubject, getMailBodyも_getMailTemplateに渡す引数以外は同じ処理 13 14function _getMailTemplate($tpl, $data) 15 { 16 if (!is_file(dirname(dirname(dirname(__FILE__))).DS."Template".DS."mail".DS.str_replace("/", DS, $tpl).".txt")) { 17 return ""; 18 } 19 20 $bk = array(); 21 foreach (array("layout", "ext") as $v) { 22 $bk[$v] = $this->Controller->$v; 23 } 24 $bk_output = $this->Controller->response->body(); 25 26 $this->Controller->layout = ""; 27 $this->Controller->ext = ".txt"; 28 $this->Controller->response->body(""); 29 30 $this->Controller->set($data); 31 $this->Controller->mail_render = true; 32 $this->Controller->render("/".ltrim($tpl, "/")); // この部分での処理速度が伸びていく 33 $out = $this->Controller->response->body(); 34 $this->Controller->mail_render = false; 35 36 $this->Controller->response->body($bk_output); 37 foreach (array("layout", "ext") as $v) { 38 $this->Controller->$v = $bk[$v]; 39 } 40 41 return $out; 42 }
回答2件
あなたの回答
tips
プレビュー