powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / fgetc ждёт 30 секунд перед считыванием из сокета
10 сообщений из 10, страница 1 из 1
fgetc ждёт 30 секунд перед считыванием из сокета
    #37738584
mnvx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь отправить email из PHP. PHP на компьютере с Windows 7.
В php.ini установлено max_execution_time = 70

Открывается сокет, устанавливается таймаут (который на самом деле не устанавливается, но проблема не в этом), и читается посимвольно поток (и выводится в лог):

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    $this->smtp_conn = @fsockopen($host,    // the host of the server
                                 $port,    // the port to use
                                 $errno,   // error number if any
                                 $errstr,  // error message if any
                                 $tval);   // give up after ? secs

    if(substr(PHP_OS, 0, 3) != "WIN") {
        socket_set_timeout($this->smtp_conn, $tval, 0);
    }

    file_put_contents ('c:\log.txt', $filetext.'getlines... ('.date('H:i:s').');   ');

    while (false !== ($char = fgetc($this->smtp_conn))) {
        $filetext = file_get_contents ('c:\log.txt'); 
        file_put_contents ('c:\log.txt', $filetext.$char.' ('.date('H:i:s').');   ');
    }



Вывод получается вот такой, т.е. перед считыванием первого символа (2) проходит 30 секунд:

getlines... (14:31: 10 ); 2 (14:31: 40 ); 2 (14:31:40); 0 (14:31:40); (14:31:40); m (14:31:40); a (14:31:40); i (14:31:40); l (14:31:40); . (14:31:40); a (14:31:40); v (14:31:40); t (14:31:40); o (14:31:40); d (14:31:40); o (14:31:40); m (14:31:40); . (14:31:40); r (14:31:40); u (14:31:40); (14:31:40); E (14:31:40); S (14:31:40); M (14:31:40); T (14:31:40); P (14:31:40);
(14:31:40);
(14:31:40);

Если выполнить эту же команду через телнет (telnet myservername.ru 25), то ответ в консоль возвращается мгновенно:
автор220 myservername.ru ESMTP

На этом же компьютере установлен почтовик (bat), который читает и отправляет почту без задержек.

Подскажите, в чём может быть причина того, что через консоль всё работает прекрасно, а через php возникает такая вот 30 секундная задержка?
...
Рейтинг: 0 / 0
fgetc ждёт 30 секунд перед считыванием из сокета
    #37739047
mnvx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Буду рад любой идее.

Вот ещё выяснялись дополнительные обстоятельства.
Пробую отправить почту с помощью VBScript.

Вот файлик send_mail_test.vbs, который отправляет почту:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SendMail WScript.Arguments(0), WScript.Arguments(1), WScript.Arguments(2) 

' //Oleav's function. Based on www.w3schools.com source.
Sub SendMail(ToAddress, Subject, FileName) 
  Set objMessage = CreateObject("CDO.Message") 
  objMessage.Subject = Subject
  objMessage.From = "myaddress@mydomain.ru"  
  objMessage.To = ToAddress
  objMessage.HTMLBody = ReadFileContents(FileName) 'Text
  objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing")=2 'Name or IP of remote SMTP server
  objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver")="mail.avtodom.ru" 'Server port
  objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") =25 
  objMessage.TextBodyPart.Charset="windows-1251" 'Кодировка. Спасибо: http://www.askit.ru/custom/vba_office/m13/13_08_cdo_vba.htm
  objMessage.Configuration.Fields.Update
  objMessage.Send
  Set objMessage = Nothing
End Sub

const ForReading = 1, ForWriting = 2, ForAppending = 8

function ReadFileContents(FileName)
  set FileSys = CreateObject("Scripting.FileSystemObject")
  set FileForRead = FileSys.OpenTextFile(FileName, ForReading)
  AllText = FileForRead.ReadAll
  FileForRead.Close
  set FileForRead = Nothing
  ReadFileContents = AllText
end function



Вот батник, который запускает этот файл:

Код: sql
1.
C:\Windows\System32\wscript.exe C:\TEMP\send_mail_vbs\send_mail_test.vbs "myaddress@mydomain.ru", "Proverka 2", "mail.txt"



Всё работает прекрасно, если запускать батник из консоли. Отправляет мгновенно и получаю письмо мгновенно!

Но всё меняется, когда я запускаю этот VBScript из php:
Код: php
1.
2.
3.
4.
5.
6.
<?php
	echo 'start...';
	file_put_contents('c:\temp\send_mail_vbs\mail.txt', '<p>first line</p><p>second</p><p>third <b>bold</b> line.</p>');
    exec('start c:\temp\send_mail_vbs\send_mail_test.vbs "Nikolai.Matushenkov@bmw-avtodom.ru" "head!" "c:\temp\send_mail_vbs\mail.txt"');
	echo 'finish!';
?>



Отправка-то происходит мгновенно, но доходит это письмо стабильно за 5 минут. Если отправить повторное письмо, не дождавшись 5 минут, то первое письмо не доставляется, а второе приходит спустя 5 минут.

И почтовый клиент эти 5 минут как-то подозрительно долго проверяет письма. По минуте ожидает ответа при каждом запросе. А как только письмо получил, так и скорость проверки увеличивается, за 1 секунду дальше проверяет наличие писем.

В общем, подскажите, в чём может быть дело? Буду рад любой идее. Может быть причина в каких-то специфических настройках операционной системы на моём компе? Может быть в сети проблема? В почтовом сервере? Куда копать?
...
Рейтинг: 0 / 0
fgetc ждёт 30 секунд перед считыванием из сокета
    #37739086
mnvx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И ещё одна важная подробность. Этот-же скрипт запуска VBScript (exec) с другого сервера этой-же сети отрабатывает без нареканий. Проблема в настройке моего компьютера? Пробовал отключать антивирус, брандмауэр отключен. Что ещё можно посмотреть?
...
Рейтинг: 0 / 0
fgetc ждёт 30 секунд перед считыванием из сокета
    #37739113
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mnvxвсё меняется, когда я запускаю этот VBScript из php:Сам то пхпшный скрипт запускаете как?
...
Рейтинг: 0 / 0
fgetc ждёт 30 секунд перед считыванием из сокета
    #37739179
mnvx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle,

Просто в браузере открываю страничку php
...
Рейтинг: 0 / 0
fgetc ждёт 30 секунд перед считыванием из сокета
    #37739291
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mnvx,

Не все так просто, ознакомьтесь с основами работы PHP.
Попробуйте выполнить скрипт php из консоли. Если при вызове из консоли будет работать нормально, тогда проблема скорее всего в настройках вебсервера или в связке вебсервера и пхп.
...
Рейтинг: 0 / 0
fgetc ждёт 30 секунд перед считыванием из сокета
    #37739978
mnvx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle,
Спасибо, Вы правильно указали направление! Один и тот-же скрипт из консоли отрабатывает прекрасно, а при открытии страницы из браузера возникает задержка с доставкой почты.
Какие настройки веб-сервера стоит смотреть, в чём может быть дело?
...
Рейтинг: 0 / 0
fgetc ждёт 30 секунд перед считыванием из сокета
    #37740151
mnvx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, ещё 1 момент. Пробовал отправить письмо с помощью sendmail.exe (из консоли). С моего компьютера письмо отправляется с задержкой 5 минут (5 минут висит консоль, пока письмо не отправится). А с соседнего компьютера этой же сети, с помощью sendmail отправка проходит без проблем.
...
Рейтинг: 0 / 0
fgetc ждёт 30 секунд перед считыванием из сокета
    #37740174
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mnvxКакие настройки веб-сервера стоит смотреть, в чём может быть дело?Окружение, пользователь (профиль), права доступа, несовместимость версий, черт знает что еще... Недавно пробегала тема с похожей проблемой, под IIS скрипт отказывался корректно работать, под Апачем заработал нормально.

mnvxС моего компьютера письмо отправляется с задержкой 5 минут (5 минут висит консоль, пока письмо не отправится). А с соседнего компьютера этой же сети, с помощью sendmail отправка проходит без проблем.Антивирус, проблема с ДНС, маршрутизацией? Хотя, слишком уж долгие задержки. А что говорят по этой теме админы?
...
Рейтинг: 0 / 0
fgetc ждёт 30 секунд перед считыванием из сокета
    #37747750
mnvx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle, спасибо за советы.
Админы порекомендовали попробовать переустановить сетевые драйвера, несмотря на то, что конфликтов в конфигурации не отмечено системой.
Но в итоге перенесли скрипты на другой сервер и там всё работает корректно, меня это на данный момент устраивает. Если вдруг установится причина тормозов с почтой, отпишусь...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / fgetc ждёт 30 секунд перед считыванием из сокета
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]