Один из наших старых устаревших серверов, который не получает дополнительных обновлений или реконфигураций, внезапно перестал преобразовывать имена хостов в IP-адреса, когда PHP выполняется в Apache. Однако он по-прежнему отлично работает при запуске из интерфейса командной строки.
На основании времени последней модификации кэшей RSS я сделал вывод, что он прекратил работу примерно 28 марта.
Чтобы воспроизвести проблему, я создал сценарий, используя fsockopen()
и он сказал «соединение не удалось (ошибка 2)». Далее я свел проблему к тому, что она связана с неудачным разрешением имени:
<?php $addr = gethostbyname("twitter.com"); echo "ADDR($addr)"; ?>
Когда я запускаю это через Apache, вывод ADDR(twitter.com)
, что неверно.
Когда я запускаю это из CLI, вывод ADDR(aaa.bbb.ccc.ddd)
с разными IP-адресами, как и ожидалось.
В настройке сервера ничего не изменилось. CLI и модуль Apache используют одно и то же php.ini
. PHP - это версия v4.4.9 с Zend Optimizer v2.5.10. Apache - это v1.3.31.
Я знаю, что версии старые. Но поскольку ничего не было изменено, решение типа «сначала попробуйте обновить версии» не является решением, поскольку набор функций / управление версиями сервера заморожены и скоро будут заменены. Тем не менее нам нужно решение.
Если я сбегу dig
через скрипт он работает в обеих средах (mod_php и CLI), но это больше, чем уродливый взлом, поскольку он потребует множества изменений и тестирования по всей базе скрипта, что также нежелательно, поскольку приложение PHP на сервере тоже заморожено , и получает только обновления безопасности. Его заменит полная перезапись (на новом сервере).
Но поскольку переписывание займет некоторое время и будут последовательно заменяться части унаследованного приложения, нам нужно исправить проблему решателя. Я уже немного погуглил, и хотя проблема известна, многие не нашли решения. Исправление для увеличения ограничений памяти не помогло. Перезагрузка не прошла. Преобразователь в mod_php просто перестал работать без видимой причины. :-(
Обновить: Тем временем я решил это, полностью остановив apache, подождав некоторое время, а затем запустив его снова. Но это не объясняет основную причину такого поведения (и, следовательно, удовлетворительного решения нет). Так что я оставляю это открытым.
Ни плавный перезапуск, ни обычный перезапуск не помогли. Мне нужно было полностью остановить apache, дождаться завершения всех процессов, а затем снова запустить apache. Задача решена. Поскольку, кажется, никто не находит объяснения основной причины такого поведения, я принимаю собственное решение.
То же самое здесь: ОК при запуске из CLI, ошибка при запуске через Apache. Я предполагаю, что это как-то связано с изменениями в серверах имен, например. в /etc/resolv.conf. Почему-то Apache (затронуты и другие программы) не проверяет наличие измененных серверов имен и не может разрешить их. Это происходит со мной, когда я переключаю сети с помощью ноутбука. Мне нужно вручную остановить apache, opera, firefox и т. Д., Чтобы они получили новые настройки сервера имен.
Из комментариев на Руководство PHP.net по gethostbyname:
Если разрешение имени не удается с apache2, mod_chroot и php5, добавьте LoadFile /lib/libnss_dns.so.2 в конфигурацию mod_chroot.
и
При использовании PHP и Apache в среде chroot в RedHat Linux я обнаружил, что мне нужно выполнить bind-mount / var / run / nscd, чтобы это заработало. Очевидно, сокет в этом каталоге нужен для всех вещей DNS.