mail () проблема тайм-аута - PullRequest
       1

mail () проблема тайм-аута

9 голосов
/ 21 ноября 2011

Когда я выполняю свой почтовый скрипт через браузер, возвращается фатальная ошибка тайм-аута (если я не резко увеличу время выполнения, тогда все будет работать нормально, а не решение, которое я ищу). Письмо отправляется на , но для его поступления (в мой почтовый ящик) требуется вечность (в среднем 5 минут)!
(Учитывая, что через командную строку он работает отлично, я думаю, что SMTP на php.ini, безусловно, хорошо настроен.)

Итак, этот код выполняется по запросу браузера:

<?php
mail('amatos@example.com', 'test subject', 'test body', 'From: Andre Matos <amatos@example.com>');
?>

и когда я запускаю этот же (действительно ли это то же самое? Я сам начинаю сомневаться) код из командной строки:

php -r "mail('amatos@example.com', 'test subject', 'test body', 'From: Andre Matos <amatos@example.com>');"

работает отлично! Сценарий запускается, он останавливается и электронное письмо приходит мгновенно (2/3 секунды).

Итак, что может вызвать эту разницу и как ее исправить? Есть идеи?
Заранее спасибо.


[править] дополнительная информация:
- машина windows
- сервер localhost
- php.ini одинаков как для браузера, так и для экземпляра cli


[edit2]
Спасибо всем за попытку угадать, в чём была проблема. Я поставил вопрос о том, что у кого-то была проблема раньше, и он знал что-то конкретное. Поскольку ничего конкретного не появилось, и ни одно из предложений не сработало, я решил принять тот, который позволил мне сделать больше выводов о проблеме ... +1 За все ваши полезные знания / мысли (/ догадки) :-)

Ответы [ 6 ]

5 голосов
/ 24 ноября 2011

Я выдвинул гипотезу о некоторых причинах, но я привык к Linux, и на Windows могу только догадываться:

  1. php_cli и mod_php - это два разных бинарных файла, mod_php может быть слегка поврежден
  2. php_cli и mod_php используют 2 разных пользователей, проблема может быть в сетевом профиле пользователя apache (dns, firewall, proxy ...)
  3. ваш скрипт php находится в «проблемном» месте или содержит какой-то проблемный символ,но ваш скрипт cli по параметру, попробуйте выполнить тот же скрипт: php -fz: \ path \ to \ php \ mail.php
3 голосов
/ 25 ноября 2011

Учитывая это примечание от http://php.net/manual/en/function.mail.php,, вполне вероятно, что проблема связана с MTA, а не с PHP напрямую:

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

Возможно, это как-то связано с тем, как MTA отвечает конкретному пользователю, или с правилами пользовательского брандмауэра для исходящих почтовых соединений на вашем компьютере. Можете ли вы запустить командную строку как пользователь веб-сервера, а не как вы? Если это так, это создает проблему заново из командной строки?

Как насчет того, чтобы веб-сервер выполнял командную строку PHP, а не анализируемый файл PHP? (Например, возможно, вы можете запустить пакетный скрипт через CGI.) Это решает проблему?

(Извините, что это скорее догадки, чем конкретные ответы.)

2 голосов
/ 28 ноября 2011

Моим первым предположением будет то, что версия вашего почтового сообщения в браузере уже имеет контекст или соединения, готовые к отправке.Напротив, прямое (php -r) выполнение должно загружать почтовый контекст.

Чтобы подтвердить эту идею, вы можете сделать цикл для отправки 10 писем и проверить, быстрее ли отправляются письма после первого, гораздо быстрее.,

2 голосов
/ 25 ноября 2011

Перед отправкой почты в сценарии обязательно распечатайте ini_get() переменных SMTP, smtp_port и sendmail_from и убедитесь, что это рабочие значения.PHP, работающий в Windows, не имеет преимущества отправки почты через Sendmail, и независимо от того, что разработчики PHP собрали вместе, он в лучшем случае отрывочен.сервер выдает ошибку, которую клиент не передает должным образом:

c:\> telnet smtp.domain.com 25

220 smtp.domain.com ESMTP Postfix
helo mailtest
250 smtp.domain.com
mail from: user@local.com
250 2.1.0 Ok
rcpt to: user@remote.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
from: user@local.com
to: user@remote.com
subject: test mail

this is a test message
.
250 2.0.0 Ok: queued as 42AD8364FE0E
quit
221 2.0.0 Bye
2 голосов
/ 25 ноября 2011

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

Вы пробовали PHP mailer ?

По моим наблюдениям, он отправляет письма в течение нескольких секунд. Ниже приведен пример того, как использовать класс php mailer.

include  "class.phpmailer.php";
$msg="Hello! This is a test..."
$mail=new PHPMailer();
$email="someone@friend.com"; //person who receives your mail
$mail->IsSMTP();
$mail->Host = "localhost";
$mail->SMTPAuth = true; 
$mail->Username = "admin@example.com"; //your mail id
$mail->Password = "sdfsd441"; //password for your mail id
$mail->SetFrom('admin@example.com', 'admin'); //from address
$mail->AddAddress($email);
$mail->Subject ="Test Mail";
$mail->Body = $msg;
$mail->IsHTML(true);
$mail->MsgHTML($msg);
$mail->Send();  

РЕДАКТИРОВАТЬ:
В руководстве по PHP они указали так:

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

так, что может вызвать задержку? Я думаю, что эта ссылка может помочь вам.

2 голосов
/ 21 ноября 2011

Просто чтобы прояснить: php-экземпляр, используемый скриптом, такой же, как и код командной строки?

Многие веб-хосты используют smtp-relay, который будет собирать кучу писем и отправлять их все сразу, поэтому, если ваша почта опаздывает, не будет странным поведением.Однако длительное время выполнения не является нормальным.

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