по функции getmxrr()

rafaello

Новичок
Здравствуйте!
Есть такая необходимость проверить мх-записи у очень большого списка хостов, например 5-10-20 тысяч.
Использую примерно такую схему:
PHP:
$mx_hosts = array(host1.ru, host2.ru, ..........); // несколько тысяч
foreach($mx_hosts as $mx_host){
getmxrr($mx_host, $array);
............// здесь еще код присутствует
}
Я заметил, что эта операция занимает очень большое количество времени.
А мне проверять надо постоянно, то есть каждые пять минут 24 часа в сутки.
Подскажите пожалуйста, действительно ли функция getmxrr() при очень большом количестве проверяемых хостов способна зависать, тормозить ?
Есть ли какое то другое решение?
Спасибо!
 
Разбей на мелкие пачки и проверяй каждую пачку отдельным процессом, параллельно.

Еще можно сделать FIFO-очередь и запустить пачку процессов, вычитывающих из очереди - тогда не надо думать о пачках, достаточно регулировать число процессов.

Если получается настолько много процессов, что возникает проблема накладных расходов на контекст-свитчи, можно сделать асинхронку с неблокирующим i/o - если php то на reactphp, или вообще на каком-нибудь nodejs или golang это написать. По сути та же очередь получится, но параллелизация в рамках одного процесса.
 
Последнее редактирование:
честно говоря, не особо ясно представляю, как можно параллельно воспроизводить процесс? Ведь если я разобью на части, то каким образом можно параллельно выполнить цикл foreach для каждой части?
 
PHP:
$mx_hosts_sections = [
1 => ['host1.ru', 'host2.ru' ...],
2 => ['host101.ru', 'host102.ru'],
...
];
$mx_hosts = $mx_hosts_sections[$_SERVER['argv'][1]];
foreach ...
Код:
#!/bin/sh
php script.php 1 &
php script.php 2 &
...
 
Fair warning: getmxrr() получает только MX RR.
При этом RFC не требует его наличия для доставки почты.
Так что, если нужно проверить "почтовость" домена:
PHP:
          if(!(checkdnsrr($t['domain'], 'MX') || checkdnsrr($t['domain'], 'A') || checkdnsrr($t['domain'], 'AAAA')))
            throw new Exception("No MX/A/AAAA RR found for {$v} in {$tmp[$field]}", 0);
 
При этом RFC не требует его наличия для доставки почты.
А еще по rfc вот это все - корректные email-адреса:
Код:
Abc\@[email protected]
Fred\ [email protected]
Joe.\\[email protected]
"Abc@def"@example.com
"Fred Bloggs"@example.com
customer/[email protected]
[email protected]
!def!xyz%[email protected]
allen@[127.0.0.1]
allen@[IPv6:0:0:1]

Можешь привести хоть один пример, чтобы MX-записи не было, но по 25-му порту кто-то отвечал? (Только не то, что ты щас сам поднимешь ;))
 
Могу привести целую кучу :)
Я так с рассылкой на сайте прокололся.
Менеджер общается с клиентом, я делаю рассылку по этому же адресу - "No MX RR".
И через 15 минут письмо от этого же клиента менеджеру. Было стыдно…
 
Бывает же!

Я как-то проверял довольно крупную базу на тему битых/дохлых емейлов - такого примера ни одного не было.

Впрочем, там 98% были всякие стандартные gmail-ы. Гмейлы и еще некоторые, где это имеет смысл (то есть smtp честно отвечает, что нету такого ящика) еще попытался проверить через smtp (смотрел ответ на RCPT TO: и разрывал соединение), но gmail быстро заблеклистил IP :)

через 15 минут письмо от этого же клиента менеджеру
Строго говоря, это-то как раз ничего не доказывает :)
 
$mx_hosts_sections = [
1 => ['host1.ru', 'host2.ru' ...],
2 => ['host101.ru', 'host102.ru'],
...
];
$mx_hosts = $mx_hosts_sections[$_SERVER['argv'][1]];
foreach ...
.....
#!/bin/sh
php script.php 1 &
php script.php 2 &
...
Вот у меня есть один файл.php, который работает по крону каждые пять минут. Как в этот файл я могу подключать скрипт #!/bin/sh ?
А еще момент. Список проверяемых хостов все время меняется, он не постоянный, так что у меня нет возможности разбить его на части и сделать из каждой части отдельный файл. Я могу только в процессе разбивать его на части, но не более...
Так что, если нужно проверить "почтовость" домена:
мне не надо проверять почтовость домена, мне только надо извлечь список мх-хостов и все.
 
И что ты с ними будешь делать дальше?
мне надо разбить список подписчиков на группы, по каждому почтовому провайдеру. Например, все на майл.ру, бизнес.майл.ру в том числе или все на яндексе, корпоративная.яндекс то же.
 
То есть ты делаешь ту же ошибку, что сделал я…
Сам не понимаешь? Или не хочешь понять?
 
То есть ты делаешь ту же ошибку, что сделал я…
Сам не понимаешь? Или не хочешь понять?
Не понимаю, о чем речь? Ведь мы вообще отклонились от темы топика. А ведь тема была как можно ускорить процесс получения мх-записей при большом списке?
Я получил один ответ, что надо сделать несколько параллельных процесса, но так до конца этот вариант не доведен до ума.
 
Не сканируй каждые 5 минут, единственный вариант.
Считывай TTL и храни данные в кэше.
И повторяю, ты пропустишь домены, у которых нет выделенных MX.
 
Вот у меня есть один файл.php, который работает по крону каждые пять минут.
Что мешает заменить одну эту запись в crontab на 50 таких, как я показал? Или вызывать из крона не php-файл, а шелл-скрипт?
 
Последнее редактирование:
Сверху