Я искал внутреннее представление файла сеанса PHP, и я заметил, что ключи сеанса разделены символом канала |
.
Прежде чем попасть в проблему, с которой я столкнулся, позвольте мне дать краткое руководство по форматированию файла сеанса. По крайней мере, так оно было отформатировано на моем Mac (10.9.4, PHP 5.4.24).
Формат Session File
Скажем, у меня есть следующий код:
$_SESSION["age"] = 26;
$_SESSION["car"] = "Mazda";
$_SESSION["nerdy"] = true;
$_SESSION["likes"] = array(42, "being meta");
$_SESSION["stats"] = array("bmi" => 1000);
Затем он сохраняется в переменной сеанса, как это:
age|i:26;car|s:5:"Mazda";nerdy|b:1;
likes|a:2:{i:1;i:42;i:2;s:10:"being meta"}
stats|a:1:{s:3:"bmi";i:1000}
Общий формат является
session_key|session_value[;session_key|value] etc.
где session_value
имеет общую форму
type[:size]:value
Более конкретно (если кто интересуется),
- строки:
s:3:"some text"
- целых чисел:
i:4
- BOOLEANS:
b:1
(истина) илиb:0
(false) - массивы:
a:2:{session_value;session_value;session_value;session_value}
где четыре session_value
с в массиве размера 2 являются key;value
key;value
пар.
Проблема
Вы можете видеть, что в приведенном выше, сеансовые ключи верхнего уровня разделены |
характера. Но что, если одно из наших имен ключей сеанса включает символ |
?
Ну, я попробовал. И когда я это сделал, весь файл сеанса (в /tmp
) был пустой (и переменные определенно не были установлены). Является ли это надзором со стороны разработчиков PHP или недокументированным ограничением (или он где-то документирован)?
Это можно легко решить, поставив сами ключи $ _SESSION в кавычки или обратный сбой любого канала в строке ключа $ _SESSION. Это не большая проблема для меня лично, так как я не могу понять, почему мне нужно поставить |
в ключ переменной $ _SESSION - просто интересно.
Это связано с комментариями уже с 2008 года. Хотя они на самом деле не обращались к ним, они также не «фиксируют» его в ближайшее время. Вместо этого вы можете использовать другие символы. – skrilled