$_REQUEST[session_name()] оказался пуст. Что делать?

В своих проектах, где необходимо авторизовать пользователя, я пользуюсь старым добрым механизмом PHP сессий. На страницах которые требуется показывать как посетителям прошедшим авторизацию, так и нет, в самом начале кода применяю такую конструкцию:

1
if (isset($_REQUEST[session_name()])) session_start();

В этом случае, в отличии от простого вызова функции session_start(), сессия стартанет только если браузером был прислан идентификатор сессии. Т.е. например если посетитель ранее успешно залогинился, то на странице будут доступны сессионные переменные, а если нет то вообще говоря сессия не будет здесь активна.

Благодаря тому что сессия не запускается без разбору, немного снижается нагрузка на сервер и решается проблема появления в поисковиках адресов страниц с переменной PHPSESSID в конце.

Недавно в результате переустановки php на локальной машине сессии перестали работать. Более детальное изучение показало, что с ними все нормально, а все дело в том что глобальный массив $_REQUEST просто напросто пуст, вернее никаких сессионных переменных в нем нет. Глянув файл php.ini , я обнаружил строки:

; This directive determines which super global data (G,P,C,E & S) should
; be registered into the super global array REQUEST. If so, it also determines
; the order in which that data is registered. The values for this directive are
; specified in the same manner as the variables_order directive, EXCEPT one.
; Leaving this value empty will cause PHP to use the value set in the
; variables_order directive. It does not mean it will leave the super globals
; array REQUEST empty.
; Default Value: None
; Development Value: “GP”
; Production Value: “GP”
; http://php.net/request-order
request_order = “GP”

Значение “GP” параметра request_order говорит о том, что в массив $_REQUEST будут заноситься только $_GET или $_POST, получается если переменная передается через $_COOKIE, а в нашем случаем с PHPSESSID именно так и происходит, то она в массиве не будет доступна. Для того чтобы добавить в $_REQUEST переменные из $_COOKIE, изменим ее на:
request_order = “GPС”
И все заработает.

Комментарии:

  1. Михаил

    Блин, два дня с этой же проблемой сидел, перерыл уже все мануалы и сайты, скрипты уже переписал, ничего не помогало, и вот наконец нашёл! Спасибо большое!)

  2. руслан

    Спасибо!!

  3. Роман

    Фух! Несколько дней мучался, перебрал весь двиг, что только не делал с сессиями, пока не вышел на проблему с $_REQUEST. Спасибо большое!!!

    ПС: Для тех, кто будет искать в php.ini настройку request_order – обратите внимание, что она сначала упоминается выше, как:
    ; request_order
    ; Default Value: None
    ; Development Value: “GP”
    ; Production Value: “GP”
    а ниже, так, как упомянуто в статье. Менять надо именно там.