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


PHP's mail() function causes a 500 Internal Server Error only after a certain point in the code

几天前,我的自定义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的自定义类)
  • 苏红素贴剂0.9.10

记录的错误消息

  • 脚本头提前结束:XXX,refer:XXX

TL;DR

mail()在代码中的某个点之后(但不是在任何特定调用之后)被调用而没有任何PHP代码被更改时,是什么导致我的PHP应用程序开始导致500 Internal Server Errors

其他注意事项

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

如果有无法送达的电子邮件,就会出现问题——如果您将电子邮件发送到与您托管的域相同的域,就会发生这种情况。网络服务器可能"配置错误",认为它是域的邮件服务器-这是我的新网络主机(w00t!或否)中的默认设置

示例:Example.com的web主机向archive@example.com但是由于配置错误(),web主机认为它需要在本地交付。这失败了,并且web服务器报告所提到的错误500。

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

听起来像sendmail或任何试图用来发送邮件的mail()可能正在消亡。试着在命令行中运行脚本,看看你得到了什么输出。

转移到具有类似配置的另一台服务器解决了这个问题,因此看起来它实际上是主机服务器的问题(具体原因未知,遗憾的是,它可能仍然是个谜)。

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

错误可能是因为用于发送邮件的php文件可由组写入。您应该使用php的权限"644"。