по функции 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() при очень большом количестве проверяемых хостов способна зависать, тормозить ?
Есть ли какое то другое решение?
Спасибо!
 

fixxxer

К.О.
Партнер клуба
Разбей на мелкие пачки и проверяй каждую пачку отдельным процессом, параллельно.

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

Если получается настолько много процессов, что возникает проблема накладных расходов на контекст-свитчи, можно сделать асинхронку с неблокирующим i/o - если php то на reactphp, или вообще на каком-нибудь nodejs или golang это написать. По сути та же очередь получится, но параллелизация в рамках одного процесса.
 
Последнее редактирование:

rafaello

Новичок
честно говоря, не особо ясно представляю, как можно параллельно воспроизводить процесс? Ведь если я разобью на части, то каким образом можно параллельно выполнить цикл foreach для каждой части?
 

fixxxer

К.О.
Партнер клуба
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 &
...
 

AnrDaemon

Продвинутый новичок
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);
 

fixxxer

К.О.
Партнер клуба
При этом 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-му порту кто-то отвечал? (Только не то, что ты щас сам поднимешь ;))
 

AnrDaemon

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

fixxxer

К.О.
Партнер клуба
Бывает же!

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

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

через 15 минут письмо от этого же клиента менеджеру
Строго говоря, это-то как раз ничего не доказывает :)
 

rafaello

Новичок
$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 ?
А еще момент. Список проверяемых хостов все время меняется, он не постоянный, так что у меня нет возможности разбить его на части и сделать из каждой части отдельный файл. Я могу только в процессе разбивать его на части, но не более...
Так что, если нужно проверить "почтовость" домена:
мне не надо проверять почтовость домена, мне только надо извлечь список мх-хостов и все.
 

rafaello

Новичок
И что ты с ними будешь делать дальше?
мне надо разбить список подписчиков на группы, по каждому почтовому провайдеру. Например, все на майл.ру, бизнес.майл.ру в том числе или все на яндексе, корпоративная.яндекс то же.
 

AnrDaemon

Продвинутый новичок
То есть ты делаешь ту же ошибку, что сделал я…
Сам не понимаешь? Или не хочешь понять?
 

rafaello

Новичок
То есть ты делаешь ту же ошибку, что сделал я…
Сам не понимаешь? Или не хочешь понять?
Не понимаю, о чем речь? Ведь мы вообще отклонились от темы топика. А ведь тема была как можно ускорить процесс получения мх-записей при большом списке?
Я получил один ответ, что надо сделать несколько параллельных процесса, но так до конца этот вариант не доведен до ума.
 

AnrDaemon

Продвинутый новичок
Не сканируй каждые 5 минут, единственный вариант.
Считывай TTL и храни данные в кэше.
И повторяю, ты пропустишь домены, у которых нет выделенных MX.
 

fixxxer

К.О.
Партнер клуба
Вот у меня есть один файл.php, который работает по крону каждые пять минут.
Что мешает заменить одну эту запись в crontab на 50 таких, как я показал? Или вызывать из крона не php-файл, а шелл-скрипт?
 
Последнее редактирование:
Сверху