Использование PHP $ _COOKIE для управления сессиями - PullRequest
0 голосов
/ 30 сентября 2011

Из-за настроек сервера мне приходится использовать $ _COOKIE вместо $ _SESSION для управления переменными сеанса для проекта.

В форме поиска я установил исходный файл cookie, но неясно, полезно ли это или нужно?

setcookie('NOSG', 'oHai', time()+7200, '/', 'some.org');

Каждый раз, когда загружается страница результатов поиска, я перебираю файлы cookie и возвращаю даты, которые мне нужно очистить, а затем устанавливаю новые значения следующим образом:

if ($board) {
  foreach ($_COOKIE as $k => $v) { 
    if (preg_match('/boa_/', $k)) {
      setcookie($k, '', time()-3600, '/', 'some.org');
    }
  }
  foreach ($people as $p) {
    setcookie('boa_'.$p->ID, $p->whatever, time()+7200, '/', 'some.org');
  }
}

В основномэто используется для создания «липких» выборов на многострочных <SELECT> входах.

Является ли этот подход обоснованным?Я редко использовал $ _COOKIE для чего-либо.

// РЕДАКТИРОВАТЬ 13:12 GMT-06: 00 Все комментарии и ответы сосредоточены на фиксации сессий.Я предполагаю, что это потому, что по какой-то причине предложенный метод НЕ является правильным?Заданный вопрос об использовании $ _COOKIE для запоминания настроек формы.Кто-нибудь захочет ответить, почему метод, который я использую, подходит или не подходит для этой проблемы?

Ответы [ 3 ]

4 голосов
/ 30 сентября 2011

Ошибка

Permission denied. session.save_path is set to /var/lib/php/session PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0

Из-за ошибки со стороны вашего хоста / системного администратора.Они должны установить разрешения для / var / lib / php / session равным 777, чтобы они были доступны для записи всем пользователям.Если они используют что-то, что выполняет ваш PHP-скрипт как ваш пользователь, данные все еще в безопасности, потому что ваш пользователь будет владельцем файла данных сеанса, так что никто другой не сможет просмотреть или изменить его.Путь сохранения сеанса на лету в каталог под вашим контролем.

Если вам нужен общий файл, инициировавший сеанс, добавьте его перед session_start ():

session_save_path('/home/yoursite/sessions');
// or
session_save_path($_SERVER['DOCUMENT_ROOT'] . '../sessions');
// or, an alternate method
ini_set('session.save_path', '/home/yoursite/sessions');
session_start();

Затемсоздайте эту папку и установите соответствующие разрешения, чтобы она была доступна для чтения / записи только вашему пользователю.

2 голосов
/ 30 сентября 2011

Технически весь сеанс представляет собой текстовый файл (хорошо, вы также можете хранить данные в базе данных), содержащий переменные, которые идентифицируются значением, хранящимся в куки (или адресной строке).

Было бы невозможно воссоздать функциональность в PHP, используя такие вещи, как setcookie (), serialize () и file_put_contents (), записывающие в папку вне веб-дерева ... хотя вам также может понадобиться задание Cron для планирования сборки мусора(честно говоря, нативный PHP-сеанс GC не выглядит впечатляющим).

Вам просто нужно создать пользовательский объект для обработки сеанса и установить для него идентификатор "сеанса" в файле cookie точнотак же, как если бы вы использовали обычную обработку сессий - за исключением того, что вместо $ _SESSION вы использовали бы методы Session :: get () и Session :: set ().

Если вы сохраняете API чистым,в будущем, если вам удастся включить обработку сеансов на сервере, вам нужно только настроить объект обработки сеансов, и это не повлияет на остальныекод вашей программы - это, вероятно, хорошая идея абстрагироваться от обработки сеанса в любом случае.

0 голосов
/ 19 октября 2011

Никто из респондентов не ответил на мой вопрос: является ли использование $ _COOKIE для хранения данных сеанса надежным методом?

Опыт научил меня тому, чего они не будут.Не все браузеры обрабатывают файлы cookie одинаково.Например, Internet Explorer имеет ограничения на количество файлов cookie для каждого домена: http://support.microsoft.com/kb/941495

Таким образом, ответ - $ _SESSION превосходит файлы cookie, поскольку он обрабатывается PHP одинаково для всех браузеров.

...