PHP的mail()函数仅在代码中的某个点之后才会导致500内部服务器错误

时间:2012-03-15 18:07:22

标签: php

几天前,我的自定义PHP应用程序中的所有mail()调用都会导致500 Internal Server Error,并且唯一记录的错误是Premature end of script headers。通过SSH 运行文件有时会返回segfault奇怪的是,在mail()调用工作和停止工作之间没有代码更改(在Git中跟踪更改)。

即使没有对代码进行任何更改,我仍然经历了正常检查(.htaccess,php.ini,自定义错误处理程序等),只是为了安全。

我尝试通过删除应用程序中的代码来诊断问题,直到确定问题为止。但是,这并没有将其缩小到特定的代码段,而是将mail()调用的时间加载到PHP(但尚未运行)的代码量。

在修剪后的应用程序中,我能够进行一次mail()调用,但第二次调用失败。第一次通话是在include来电之前(require有相同的结果)。第二个是在包含文件的最开头(前面只是打开的PHP标记)。

我最初的想法是某种记忆问题。奇怪的是,导致mail()调用抛出错误所需的内存使用量会根据从整个应用程序中保留/删除的代码而更改。如果它仍然可以帮助,在包含文件之前当前代码集合的内存使用是:

用法:3113696
最大:3352560

包含文件后的内存使用情况仍然未知。

我已经和我的主人谈过这个问题了,他们声称没有任何改变会导致这个问题。

我无法在其他应用程序中重现此问题。

使用的技术

  • PHP 5.3.10(5.2.17也受影响)
  • MySQLi(特别是扩展MySQLi的自定义类)
  • Suhosin Patch 0.9.10

记录错误消息

  • 脚本标题的提前结束:XXX,referer:XXX

TL; DR

如果在没有任何 PHP的情况下在代码中的某个点之后(但不是在任何特定调用之后)调用500 Internal Server Errors时,我的PHP应用程序会导致mail()导致{{1}}的原因代码被更改?

附加说明

  • 不是超时问题 - 加载时间不到一秒
  • 没有内存限制问题 - 崩溃时只使用~3MB,但我有99MB限制

5 个答案:

答案 0 :(得分:2)

如果有无法投递的电子邮件,则会出现此问题 - 如果您向网络托管发送电子邮件到同一个域,则可能会发生这种情况。网络服务器可能“错误配置”以认为它是域的邮件服务器 - 这是我的新网络主机中的默认设置(w00t!或不是)

示例:example.com的Web主机向archive@example.com发送邮件,但由于配置错误(),Web主机认为它需要在本地交付。此操作失败,Web服务器报告上述错误500.

修复方法是将服务器配置为不充当域的邮件服务器。 (我的主机在DNS控制面板中有一个选项。:s)。通过发送到非关联域进行测试。

答案 1 :(得分:1)

听起来像sendmail或者用于发送邮件的任何邮件()都可能会死亡。尝试在命令行中运行脚本,看看你得到了什么输出。

答案 2 :(得分:1)

转移到具有类似配置的其他服务器解决了这个问题,因此事实上它似乎与主机服务器有关(具体原因未知,遗憾的是,它可能仍然是一个谜)。

答案 3 :(得分:0)

这个显式代码可能是原因,此页面不起作用, 域目前无法处理此请求。 HTTP错误500 可以通过使用高级phpmailer类来避免:https://github.com/PHPMailer/PHPMailer

答案 4 :(得分:-1)

错误必定发生,因为用于发送邮件的php文件可由组写入。您应该使用权限' 644'对于PHP。