Функция PHP mail () вызывает 500 Internal Server Error только после определенного момента в коде - PullRequest
3 голосов
/ 15 марта 2012

Несколько дней назад все 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 МБ

Ответы [ 5 ]

2 голосов
/ 29 января 2014

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

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

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

1 голос
/ 03 апреля 2012

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

1 голос
/ 17 марта 2012

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

0 голосов
/ 10 мая 2017

Этот явный код может быть причиной, эта страница не работает, Домен в настоящее время не может обработать этот запрос. ОШИБКА HTTP 500 можно избежать с помощью расширенного класса phpmailer: https://github.com/PHPMailer/PHPMailer

0 голосов
/ 13 июля 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...