Сделать stream_socket_client быстрее с gethostbyname? - PullRequest
2 голосов
/ 19 апреля 2011

Мы открываем около 100 подключений с помощью stream_socket_client к различным веб-сайтам.

Иногда это занимает некоторое время, я предполагаю, что из-за разрешения IP-адреса (например, до 40 секунд, затем повторите попытку 4-5секунд).

Я знаю, что мы можем также кэшировать IP-адреса в программном обеспечении (получить их с помощью gethostbyname), но проблема в том, что некоторые сайты используют общие IP-адреса, а некоторые сайты используют субдомены (тот же IP, что и у основного домена).Таким образом, если бы мы использовали IP, только запросы всегда направлялись бы в одно и то же место, а не к разным сайтам с этим IP.

Есть ли обходной путь, чтобы мы могли увеличить скорость и настроить таргетинг на нужные нам сайты?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

DNS-кеширование - отличная идея, но я рекомендую делать это вне вашего приложения; Я использовал PowerDNS рекурсор с отличными результатами уже много лет, это хороший твердый код. (PDNS избежал некоторых существенных недостатков безопасности, которые мешали BIND, изучая программное обеспечение рекурсора DNS Дана Бернштейна.)

Выполняя кэширование вне приложения, вы полностью избавляетесь от необходимости пытаться сопоставить IP-адрес с правильными заголовками Host: в своих запросах, и , и вы получаете полный доступ к встроенным DNS. в кешировании интеллекта. (PDNS будет уважать время жизни результатов, что потребует усилий вашей команды для правильного повторного внедрения.)

Но я предполагаю, что большая часть проблемы заключается в том, что DNS-запросы, вероятно, выполняются последовательно в вашем приложении, после предыдущего. Если вы собираетесь использовать одни и те же 100 имен в течение всего дня, то, вероятно, будет достаточно использовать PDNS-рекурсор сам по себе.

Если 100 имен на запрос не сильно перекрываются, то вам, вероятно, потребуется распараллелить запросы DNS , сделанные вашим приложением, чтобы вы могли иметь одновременно 100 ожидающих запросов DNS, а не чем только один невыполненный запрос одновременно. Один «дешевый» подход заключается в передаче всех запросов внешней программе, которая запускает несколько десятков потоков и выполняет запросы на все имена. (И опускает их на пол. Полагайтесь на PDNS-рекурсор, чтобы кэшировать их все.) Немного больше работы - это создать несколько десятков потоков или процессов непосредственно в вашей программе PHP для выполнения всех поисков. Это позволит либо использовать ответы напрямую, либо снова предварительно заполнить кэш-память рекурсоров PDNS, прежде чем ваш старый последовательный код выполнит поиск.

И большая часть работы будет полностью переходить на асинхронные DNS-запросы, например, предоставляемые библиотекой libadns. Это даст большую выгоду, если будет без перекрытия между различными пакетами при поиске 100 имен.

1 голос
/ 19 апреля 2011

Вы можете легко ускорить разрешение, если введете имена хостов и IP-адреса в файл hosts (/etc/hosts на * nix машинах, %SystemRoot%\system32\drivers\etc\hosts на Windows-машинах).

Возможно, вам придется изменить конфигурацию в /etc/host.conf (я не знаю, где изменить для Windows), потому что по умолчанию первая попытка состоит в том, чтобы спросить имя и затем проверить файл /etc/hosts.

Чтобы убедиться, как работает функция gethostbyname, которая реализована в вашей системе, попробуйте найти правильную справочную страницу (т. Е. http://linux.die.net/man/3/gethostbyname).

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