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