Функция mail () PHP вызывает 500 Internal Server Error только после определенной точки в коде

Несколько дней назад все вызовы mail() в моем настраиваемом приложении PHP вызывают 500 Internal Server Error и единственная зарегистрированная ошибка – это Premature end of script headers . Запуск файла через SSH иногда возвращает segfault . Странно, что код не менялся между временем, когда работала mail() , и перестала работать (изменения отслеживаются в Git).

Несмотря на то, что никаких изменений в коде не было внесено, я все же прошел проверку и выполнил обычные проверки (.htaccess, php.ini, настраиваемый обработчик ошибок и т. Д.), Чтобы быть в безопасности.

Я попытался диагностировать проблему, вырезая код в приложении до тех пор, пока проблема не будет выявлена. Однако это не сводило его к определенному фрагменту кода, а скорее количеству кода, загружаемого в PHP (но еще не запущенного) в качестве времени вызова mail() .

В обработанном приложении я смог получить один вызов mail() для работы, но второй не удался. Первый вызов был непосредственно перед вызовом include ( require имеет тот же результат). Второй был в самом начале включенного файла (которому предшествовали только первые PHP-теги).

Мои первоначальные мысли были проблемой памяти. Как ни странно, использование памяти потребовало, чтобы вызов mail() вызывал ошибки, основанные на том, какой код хранится / удаляется из общего приложения. В случае, если он все еще может помочь, использование памяти для текущей коллекции кода перед включением файла:

Применение: 3113696
Макс: 3352560

Использование памяти после включения файла до сих пор неизвестно.

Я говорил с моим хозяином о проблеме, и они утверждают, что ничего не изменилось, что может вызвать эту проблему.

Я не смог воспроизвести эту проблему в других приложениях.

Используемые технологии

  • PHP 5.3.10 (5.2.17 также затронуто)
  • MySQLi (специально настраиваемый класс, расширяющий MySQLi)
  • Suhosin Patch 0.9.10

Записан

  • Преждевременный конец заголовков скриптов: XXX, референт: XXX

TL; DR

Что может заставить мое приложение PHP начать вызывать 500 Internal Server Errors когда mail() вызывается после определенной точки в коде (но не после какого-либо конкретного вызова) без изменения кода PHP?

Дополнительные замечания

  • Не проблема с тайм-аутом – занимает меньше секунды, чтобы загрузить
  • Не проблема с ограничением памяти – только при использовании ~ 3 МБ при сбоях, но у меня есть предел в 99 МБ

Проблема возникает, если есть недопустимые электронные письма – это может произойти, если вы отправляете электронное письмо в тот же домен, что и веб-хостинг. Веб-сервер может быть «неправильно сконфигурирован», чтобы думать, что это почтовый сервер для домена – это значение по умолчанию в моем новом веб-хосте (w00t! Или нет)

Пример: веб-узел example.com отправляет почту на адрес archive@example.com, но из-за неправильной конфигурации () веб-узел считает, что он должен доставляться локально. Это не удается, и веб-сервер сообщает об упомянутой ошибке 500.

Исправление состоит в том, чтобы настроить сервер, чтобы он не выступал в качестве почтового сервера для домена. (У моего хоста была опция на панели управления DNS: s). Протестируйте с отправкой в ​​несвязанный домен.

Похоже, что sendmail или любая другая почтовая программа (), пытающаяся использовать для отправки почты, может умереть. Попробуйте запустить сценарий в командной строке и посмотреть, какой результат вы получите.

Передача на другой сервер с аналогичной конфигурацией решила проблему, поэтому кажется, что она была и фактически связана с сервером хоста (конкретная причина неизвестна, и, к сожалению, это, вероятно, останется загадкой).

Этот явный код может быть причиной, эта страница не работает, домен в настоящее время не может обработать этот запрос. HTTP ERROR 500 можно избежать, используя расширенный класс phpmailer: https://github.com/PHPMailer/PHPMailer

Вероятно, ошибка возникла из-за того, что файл php, который вы использовали для отправки почты, был доступен для записи группой. Вы должны использовать разрешения 644 для php.