Назад | Перейти на главную страницу

Большая задержка ответа сервера - от 60 до 90 секунд - при использовании PHP Mail () на IIS7.5

У нас есть Windows 2008 Server с PHP 5.2.11 на IIS 7.5

Когда любой скрипт на сервере вызывает mail() функция не выдает ошибок и отправляет электронное письмо почти мгновенно. Однако сервер «зависнет» примерно от 60 до 90 секунд, пока не начнет отправлять информацию обратно в браузер. Эта задержка кажется больше, если mail() в последние 2 минуты не звонили.

Я рассматривал эту проблему на вкладке «Сеть» инструментов разработчика Chrome, и там просто написано «ожидание» в течение всего этого периода. По истечении этой задержки вся информация правильно отправляется в браузер, и страница отображается нормально.

Потенциально важные части phpinfo() вывод:

Internal Sendmail Support for Windows - enabled
sendmail_from - no value
sendmail_path - no value
SMTP - mail.samedomain.com
smtp_port - 25
mail.force_extra_parameters - no value

PHP mail () для начала довольно неэффективен, Руководство по PHP сам говорит:

Стоит отметить, что функция mail () не подходит для больших объемов писем в цикле. Эта функция открывает и закрывает сокет SMTP для каждого письма, что не очень эффективно.

Не особенно актуально, когда количество сообщений равно 1, но есть еще одна потенциальная проблема:

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

Таким образом, в отличие от версии для Unix, он не может запускать локальный демон, он должен ждать сети.

Я не программист, но это явно проблема кодирования. Вероятно, функция почты ожидает определенного ответа от вашего MTA и не получает его, 60 секунд звучат как довольно стандартное значение тайм-аута. Кроме того, ваш код пользовательского интерфейса не должен ждать mail (), который обычно является фоновым процессом. Сделать это асинхронно не так уж сложно.

В итоге вы, вероятно, могли бы исправить это на уровне MTA (возможно, установив локальный на сервере IIS), но на самом деле это проблема кодирования. Вежливо посоветуйте своим разработчикам не использовать mail (), когда важна производительность, и не блокировать код вашего внешнего интерфейса, когда вы этого ждете.