Недавно я обновил один из моих серверов, и с тех пор у меня возникла проблема с некоторыми конкретными командами PHP (см. Ниже). Я считаю, что это проблема конфигурации, но я уже рассмотрел несколько вещей и не знаю больше. Так что, возможно, у кого-то из вас есть хорошая идея:
Я использую следующий код для отображения стандартного логотипа на сайте интрасети или пользовательского логотипа:
if(L_HEADER) {
$logo = L_HEADER;
}
else {
$logo = 'logo.png';
}
$properties = getimagesize(CONFIG_URL . 'images/' . $logo)
L_HEADER и CONFIG_URL — это константы с предопределенными значениями (другой файл):
Конкатенация работает правильно, что также подтверждается сообщением об ошибке лог-файла Apache:
Предупреждение PHP: getimagesize (Http: //billing.intranet.opb/images/opb_beta.png): не удалось открыть поток: ошибка HTTP-запроса! HTTP / 1.1 404 НЕ НАЙДЕН
в /var/www/billing/templates/header.inc.php в строке 42
Поэтому первым очевидным выводом будет: путь неверен. Но это не так, поверь мне. Я проверил это как 1.000 раз. На самом деле, первое любопытство заключается в том, что изображение отображается и ссылается правильно на пару строк ниже в коде того же файла:
echo '<img src="' . CONFIG_URL . 'images/' . $logo . '"width="' . $properties[0] . '" height = "' . $properties[1] . '" />";
Поскольку я получаю ошибку, упомянутую выше, высота и ширина равны «0», но, глядя на исходный код, URL-адрес в порядке, доступ к нему вручную открывает изображение, а при замене ширины и высоты на ручные значения изображение отображается очень хорошо. ,
Более любопытно, хотя (а также мой текущий finx), при изменении getimagesize на следующее, это работает просто отлично:
$properties = getimagesize($_SERVER['DOCUMENT_ROOT'] . /public_html/images/' . $logo);
Я упомяну, что я использую редирект Apache; Вот почему в URL вы не видите «public_html», а в абсолютном пути второго примера вы его видите.
То же самое происходит с «file_exists». URL не работает, абсолютный локальный путь к тому же файлу работает.
Еще одно любопытство: в другом куске кода я проверяю обновления на сайте. Там я использую «реальный» публичный URL с file_exists и fopen. Я выгляжу так и прекрасно работает:
if(file_exists('http://desk.co.cr/df_stable.txt') {
if(($handle = fopen('http://desk.co.cr/df_stable.txt', 'r')) !== FALSE) {
// some other code
}
}
Теперь то, что я уже проверил:
Некоторая справочная информация:
Пока у меня нет идей.
В вашем вопросе скрыта эта важная подсказка, которую вы уже нашли:
Еще одно любопытство: в другом куске кода я проверяю обновления на сайте. Там я использую «реальный» публичный URL
Итак, неверный URL-адрес относится к непубличному домену, который был настроен на вашем ПК для поиска правильного IP-адреса. Скорее всего, это было сделано либо путем запуска локального DNS-сервера, либо путем настройки файла «hosts» ПК для жесткого кодирования адреса для этого домена.
Однако, когда вы запрашиваете URL-адрес у самого сервера, в игру вступает совершенно другая конфигурация DNS, поэтому, вероятно, он просто не знает, где находится этот сервер — даже если он сам! Вам необходимо настроить параметры DNS сервера или /etc/hosts
чтобы соответствовать тому, что на вашем компьютере.
Одна связанная с этим возможность заключается в том, что сервер является настроен с тем же адресом поиска, но маршрутизатор не позволяет ему подключаться к себе таким образом. Одним из способов решения этой проблемы является указание записи файла hosts на 127.0.0.1 и настройка соответствия Apache.
Если вы можете получить командную строку на сервере, вы можете попробовать:
nslookup billing.intranet.opb
# if that returns the right IP address, see if it's reachable:
ping billing.intranet.opb
# and if it's the right server, it will be listening on port 80:
telnet billing.intranet.opb 80
# telnet will either time out, or connect and give you a prompt
Если telnet соединяется, вы даже можете написать HTTP-запрос вручную (пустая строка завершает запрос; не занимайте слишком много времени, иначе сервер выручит), например:
HTTP/1.1 HEAD /
Host: billing.intranet.opb
Других решений пока нет …