【问题标题】:PHP & Pear::Mail Memory ExhaustionPHP & Pear::Mail 内存耗尽
【发布时间】:2011-04-20 21:23:59
【问题描述】:

以下解决方案

大家好。我一直在尝试不同的方法来解决这个问题,但仍然遇到同样的错误。我有一个表格,您可以在其中选择一些用户的电子邮件地址和一些 pdf 文件,并将其发送给他们。问题是 PHP 会抛出错误,因为脚本使用了大量内存(超过 90 兆)。我曾尝试使用 mail(),现在尝试 PEAR:Mail_Mime 还有其他方法可以做到这一点吗?


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);
 }
}

解决方案
以下代码可以更好地使用内存:

$from = "it@example.com";

echo '来自:'.$from."\n"; echo '主题:'.$_POST[主题]."\n"; echo '文本:'.$_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] 。 "/"; ////////////////////如果php程序的位置曾经移动////////////////////////////////////////////////////////////// /////////////// $fileatt = $文件路径。 $文件名; $message->addAttachment($fileatt); echo '附加文件:'.$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 '发送邮件到:'.$recipient."\n"; } }

【问题讨论】:

    标签: php loops email pear


    【解决方案1】:

    如果没有使用过 Pear::Mail_Mime,我敢打赌你会用完内存,因为你在每次循环迭代时都会创建一个全新的 Mail_Mime() 对象,而看起来它在所有循环中都是一样的。

    尽可能少地创建,将其从最外层的 foreach 中取出。

    $mail 也是如此。您可能可以重复使用相同的 $mail 对象并为其提供新的标题和正文。

    为确定您的内存在哪里使用,请用memory_get_usage() 包围可疑行并记录其输出以查看增加情况。

    【讨论】:

    • 太好了。考虑将新的工作代码添加到您的问题中以获得更完整的外观,而不是将其单独作为答案。
    猜你喜欢
    • 2015-10-01
    • 2014-09-08
    • 2013-07-06
    • 2014-06-28
    • 1970-01-01
    • 2013-07-22
    • 2014-06-30
    • 2015-07-02
    相关资源
    最近更新 更多