PHP致命错误:允许的内存大小为33554432字节耗尽(尝试分配41007872字节)

时间:2010-02-17 04:24:37

标签: php memory email

当我尝试调用mail()函数时,我收到此错误。

我尝试将ini_set('memory_limit', '64m')添加到我的index.php文件中 - 其中包含()所有其他文件 - 但它没有修复它。

然后我尝试将php.ini文件添加到根目录(index.php所在的位置)中,内容为memory_limit = 64M,然后给了我 PDO Class not found 错误。所以我在PDO扩展中添加了php.ini文件,现在所有错误都消失了。

但是,代码仍然失败。 phpinfo()显示内存限制已增加到64M,但我的mail()函数正在终止页面的执行。

我该如何解决这个问题? :/

邮件功能

private static function emailPassword(SafeString $email, $password)
{
   $subject  = 'Registration';
   $message  = 'Your password is: ' . $password . "\n";
   $headers  = 'From: registration@domain.com'     . "\r\n";
   $headers .= 'Reply-to: registration@domain.com' . "\r\n";

   $message = str_replace("\n.", "\n..", $message);  

   if (!mail($email->unsafeRaw(), $subject, $message, $headers))
   {
      throw new Exception('Failed');
   }
}

4 个答案:

答案 0 :(得分:2)

(33 554 432字节)+(41 007 872字节)= 71.1081543兆字节

将memory_limit设置为96M,并将其称为一天!

答案 1 :(得分:0)

如果我查看SafeString类,我没有看到unsafeRaw()方法,但是有一个toUnsafeRawString()方法。你试过调试吗?

顺便说一句,如果您正在使用原始值,为什么要使用此类?这没有任何意义。

答案 2 :(得分:0)

如果设置你的memory_limit越来越高不起作用,也许你有一个无限循环的地方分配内存空间,直到达到极限。
我不确定如何保存str_replace()函数,但它可能在这里创建一个无限循环:

str_replace("\n.", "\n..", $message);

“\ n”。正在被替换为“\ n ..”==> “\ n ..”可能会被替换为“\ n ...”==> .... 在达到极限之前,你正在使用越来越多的内存

答案 3 :(得分:0)

您为替换提供的字符可能导致str_replace函数无休止地循环。要设置php的最大内存限制也不是一个好主意。尝试其他字符串函数。也许:

$message = preg_replace("\n.", "\n..", $message);

preg_replace对这些角色非常好,并且在不知道该做什么的情况下可能无法在许多无用的循环中运行。

我希望这会有所帮助。