За последние 24 часа нас посетили 17539 программистов и 1281 робот. Сейчас ищут 1403 программиста ...

какая разница между getenv и $_SERVER

Тема в разделе "PHP для новичков", создана пользователем koopakaru, 14 июн 2009.

  1. koopakaru

    koopakaru Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    64
    Симпатии:
    0
    Адрес:
    Прибалтика
    Не понятна разница между этими двумя возможностями. насколько я понимаю, что приведеный мною ниже пример выполняет одно и тоже или нет?

    Код (Text):
    1.  
    2. <?php
    3.  
    4. $ip = getenv('HTTP_CLIENT_IP');
    5.  
    6.  
    7. $ip = $_SERVER['HTTP_CLIENT_IP'];
    8. ?>
     
  2. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    koopakaru
    Getenv = $_ENV
    Почитайте про переменные окружения
     
  3. koopakaru

    koopakaru Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    64
    Симпатии:
    0
    Адрес:
    Прибалтика
    прочитала но не все поняла.
    Хочу теперь задать такой вопрос - разбирала один пример авторизации, и поняла, что возможно не совсем понимаю как он работает. Просьба объяснить.

    Код (Text):
    1.  
    2. <?php
    3. function get_ip()
    4.   {
    5.    if ($ip = getenv("HTTP_CLIENT_IP"))
    6.     {  return $ip;  }
    7.  
    8.    if ($ip = getenv("HTTP_X_FORWARDED_FOR"))
    9.     {
    10.      if ($ip == '' || $ip == "unknown")
    11.       {  $ip = getenv("REMOTE_ADDR");  }
    12.  
    13.      return $ip;
    14.     }
    15.    if ( $ip = getenv("REMOTE_ADDR") )
    16.     {  return $ip;  }
    17.   }
    18. ?>
    19. Как я вижу в функции задано аж 3 условия. Первый вариант при условии, что удалось получит реальный IP обойдя прокси, второй, если прокси не дает реального  ip, то хотя бы получить IP прокси, а 3-е условие вообще непонятно зачем, потому, что предыдущий пункт и так уже это действие выполнит. И как понять по какому же из условий будет определен IP? В каком порядке будет выполняться проверка?
    20.  
    21. Зааранее благодарна.
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    koopakaru
    Во-первых, getenv может не работать, если РНР установлен на IIS.
    Во-вторых, функция getenv возвращает вам переменные окружения, а именно $_ENV !
    Этот глобальный массив может не регистрироваться (php.ini -> GPCS).

    А почему "же"?
    Будут выполнены они в таком порядке, в каком написаны.
     
  5. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
  6. koopakaru

    koopakaru Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    64
    Симпатии:
    0
    Адрес:
    Прибалтика
    Да нет, я все по тому же вопросу пытаюсь разобраться в разнице $_ENV и $_SERVER массивах.
    Вроде использует одни и те же возможности, даже написание идентичное а разница какая-то есть, а вот понять ее не могу. Когда что лучше использовать. И вообще как то раньше я не сталкивалась с $_ENV, а вот сейчас никак не могу въехать... А пример скрипта это для примера привела. Вот и перечитала про этот $_ENV многое, но вся документация по нему как-то очень сложно написана.
    Вот если бы на примерах реально показать, в чем разница, то я бы наверное сообразила бы быстрее.

    Кстати за линк спасибо. Очень интересно рассказано о простых вещах. Жаль что не видела этой статьи пол-года назад...
     
  7. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    koopakaru

    1. Открываем php.ini
    2. Находим директиву variables_order
    3. Видим значения (по-умолчанию GPCS)
    4. Убираем S
    5. Перезапускаем веб-сервер
    6. Пробуем в скрипте сделать <?php echo $_SERVER['REMOTE_ADDR']; ?>
    7. Получаем ошибку Undefined index: REMOTE_ADDR
    8. Пробуем получить через getenv

    Может теперь наконец будет ясно, что всё зависит от желания, будут зарегистрированы эти массивы или нет.
     
  8. koopakaru

    koopakaru Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    64
    Симпатии:
    0
    Адрес:
    Прибалтика
    Apple
    Стало попонятнее, когда попробовала.
     
  9. $_ENV содержит переменные окружения системы, $_SERVER содержит переменные настройки сервера. Сервер может и наследует определенную часть настроек из системных, поэтому некоторые значения могут совпадать.
    В случае запуска php как консольной программы, многих данных в массиве $_SERVER просто не будет.
     
  10. koopakaru

    koopakaru Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    64
    Симпатии:
    0
    Адрес:
    Прибалтика
    флоппик
    Спасибо за полный и развернутый ответ. Именно это я и ожидала.