PDF 添付ファイルを使用して、foreach ループで一度に 1 つずつ、サブスクライバーのリストに電子メールを送信する cron ジョブがあります。cron スクリプトから次のメッセージを受け取りました。
Fatal error: Allowed memory size of 94371840 bytes exhausted (tried to allocate 78643193 bytes)
このエラーを防ぐにはどうすればよいですか?
また、すべてのサブスクライバーへの送信が完了していないことは確かですが、全員に送信されなかった場合にどこで再度受信するかを知るには、どうすればこれを追跡できますか?
アップデーター:コード サンプルは次のとおりです: (ちなみに Zend Framework を使用しています)
public function send(Default_Model_MyEmail $myEmail)
{
if (null != ($id = $myEmail->attachmentId)) {
$file = new Default_Model_File();
$file->find($id);
$filepath = APPLICATION_UPLOADS_DIR . '/' . $file->getActualFilename();
$attachment = new Zend_Mime_Part(file_get_contents($filepath));
$attachment->type = $file->getMimeType();
$attachment->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$attachment->encoding = Zend_Mime::ENCODING_BASE64;
$attachment->filename = $file->getDisplayFilename();
}
$transport = new Zend_Mail_Transport_Smtp('localhost');
$mail = new Zend_Mail('utf-8');
$mail->setFrom('from@address', 'From Name');
$mail->setReplyTo('replyto@address');
$mail->setSubject($myEmail->subject);
if (isset($attachment)) {
$mail->addAttachment($attachment);
}
$subscribers = $this->getSubscribers();
foreach ($subscribers as $subscriber) {
$mail->addTo($subscriber->email);
$bodyText = $myEmail->body
. "\r\n\r\nIf for any reason you would like to be removed from this mailing list, "
. "please visit \r\nhttp://myapp.com/myemail/unsubscribe/email/"
. $subscriber->email;
$mail->setBodyText($bodyText);
$mail->send($transport);
$mail->clearRecipients();
}
}
更新:$transport
変数を再利用しています。これが複数のサブスクライバーに送信する正しい方法であるという印象を受けましたが、これが原因でしょうか? どう思いますか?
更新:メモリ使用量ステートメントを出力する一連のログ ステートメントを追加しましたが、今何をすべきか本当にわかりません。メールを送信するたびにメモリ使用量が増加します。サブスクライバ リストが 200 の場合、160 になり、メモリが不足します。私は何をすべきか?