我有一個cron作業,通過PDF附件發送電子郵件到一個訂閱者列表,每次一個在foreach循環中。我從cron腳本得到了這個消息:Zend_Mail:如何解決PHP致命錯誤:允許的內存大小用盡?
Fatal error: Allowed memory size of 94371840 bytes exhausted (tried to allocate 78643193 bytes)
我需要做什麼來防止這個錯誤?
而且,我敢肯定,它沒有完成發送給所有用戶,所以我應該如何跟蹤此所以它知道在哪裏再次回升,如果沒有發送給大家?
更新:下面是一個代碼示例:(我使用Zend框架的方式)
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('[email protected]', 'From Name');
$mail->setReplyTo('[email protected]');
$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,然後耗盡內存。我該怎麼辦?
這是一個非常詳細的答覆:-) – 2009-12-31 19:41:04
這是一個非常詳細的問題。 – Malfist 2009-12-31 19:43:01
然而,所有其他的答案提供了一個起點找到一個解決方案... – 2009-12-31 19:53:05