开发者

PHP & Pear::Mail Memory Exhaustion

Solution below

Hi guys. I've been trying different ways to approach this but still hitting the same error. I have a form where you can select some users email addresses and some pdf file and it will开发者_如何学Python send to them. Problem is that PHP will throw an error because the script is using massive amounts of memory (over 90 meg). I have tried using mail() and now trying PEAR:Mail_Mime Is there another way I can do this?


include_once('Mail.php');
include_once('Mail/mime.php');
$from = "it@example.com";
$subject = $_POST[subject];
$text = $_POST[message];

if (count($_POST[emailEnq]) > 0) {
 foreach ($_POST[emailEnq] as $Ekey => $Evalue) {
  $message = new Mail_mime();
  $message->setTXTBody($text);
  if (count($_POST[emailFile]) > 0) {
   foreach ($_POST[emailFile] as $key => $value) {
    $filepath = "/home/mds07/console/admin/media/listings/" . $_POST[list_ID] . "/docs/";
    ////////////////////You will need to change the above line if the location of the PHP program ever moves////////////////////////////
    $fileatt = $filepath . $value;
    $message->addAttachment($fileatt);
   }
  }
  $body = $message->get();
  $extraheaders = array("From" => $from, "Subject" => $subject);
  $headers = $message->headers($extraheaders);
  $mail = Mail::factory("mail");
  $mail->send($Evalue, $headers, $body);
 }
}

SOLUTION

The following code is working with much better memory usage:

$from = "it@example.com";

echo 'From: '.$from."\n"; echo 'Subject: '.$_POST[subject]."\n"; echo 'Text: '.$_POST[message]."\n";

include_once('Mail.php'); include_once('Mail/mime.php'); $message = new Mail_mime(); $message->setTXTBody($_POST[message]); if (count($_POST[emailFile]) > 0) { foreach ($_POST[emailFile] as $key => $filename) { $filepath = "/home/mds07/console/admin/media/listings/" . $_POST[list_ID] . "/"; ////////////////////You will need to change the above line if the location of the PHP program ever moves//////////////////////////// $fileatt = $filepath . $filename; $message->addAttachment($fileatt); echo 'Attached File: '.$filename."\n"; } } $body = $message->get(); $extraheaders = array("From" => $from, "Subject" => $_POST[subject]); $headers = $message->headers($extraheaders); $mail = Mail::factory("mail"); if (count($_POST[emailEnq]) > 0) { foreach ($_POST[emailEnq] as $key => $recipient) { $mail->send($recipient, $headers, $body); echo 'Sent mail to: '.$recipient."\n"; } }


Without having used Pear::Mail_Mime I'd bet you run out of memory because you create a brand new Mail_Mime() object on every loop iteration, when it seems like it's the same in all of them.

Create as few as possible, taking it out of the outermost foreach.

Same for $mail. You can probably re-use the same $mail object and feed it new headers and body.

To make sure where your memory is used, surround the suspect lines with memory_get_usage() and log its output to see the increase.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜