Сессия
Есть приложение основная часть которого написана на asp.net и меньшая часть написана php в будущем все будет мигрировать на php. Вопрос как организовать сессию так что бы она работала в обоих частях имею ввиду данные в сессии записанные в asp.net были доступны в php?
Создаешь папку, tempses с доступом для пхп и асп. Генерируешь уникальный файл для каждого пользователя... типа "asfdasdsad123sv" - это как имя файла, так и значение в сессии. Поскольку куки будет видеть как пхп так и асп, Написать 4 функции (чтение/запись занчения) для ПХП и АСП - плевое дело... Хоть храни в формате
Ключ=Значение
Ключ=Значение
Ключ=Значение
Единственное, что права доступа к сей папки грамотно настрой... и добавь .htaccess или че там у тебя, чтобы листинг запретить для веб сервера
Цитата:
уникальный файл
будет храниться на жестком диске.А не замедлит ли это работу всего приложения?
Запись: $data = serialize($_SESSION);
Чтение: $_SESSION = unserialize($data);
Но в АСП ты сие не прочитаешь
А вот если в АСП есть парсер Json,то вариант:
Запись: $data = json_encode($_SESSION);
Чтение: $_SESSION = json_decode($data, true);
Очень даже разумненький..
И гораздо быстрее чем через базу..
Только уборщика не забудь со временем сделать, чтобы не засорить ЖД
а как на счет подключения к этому файлу порядок чтения записи и т.д и т.п......
Код:
function _open()
{
global $_sess_db;
if ($_sess_db = mysql_connect('127.0.0.1', 'root', '')) {
return mysql_select_db('db_test', $_sess_db);
}
return FALSE;
}
function _close()
{
global $_sess_db;
return mysql_close($_sess_db);
}
function _read($id)
{
global $_sess_db;
$id = mysql_real_escape_string($id);
$sql = "SELECT access FROM sessions WHERE id = '$id'";
if ($result = mysql_query($sql, $_sess_db)) {
if (mysql_num_rows($result)) {
$record = mysql_fetch_assoc($result);
return $record['access'];
}
}
return '';
}
function _write($id)
{
global $_sess_db;
$access = time();
$id = mysql_real_escape_string($id);
$access = mysql_real_escape_string($access);
$sql = "INSERT INTO sessions VALUES ('$id', '$access')";
return mysql_query($sql, $_sess_db);
}
function _destroy($id)
{
global $_sess_db;
$id = mysql_real_escape_string($id);
$sql = "DELETE FROM sessions WHERE id = '$id'";
return mysql_query($sql, $_sess_db);
}
function _clean($max)
{
global $_sess_db;
$old = time() - $max;
$old = mysql_real_escape_string($old);
$sql = "DELETE FROM sessions WHERE access < '$old'";
return mysql_query($sql, $_sess_db);
}
session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');
session_start();
{
global $_sess_db;
if ($_sess_db = mysql_connect('127.0.0.1', 'root', '')) {
return mysql_select_db('db_test', $_sess_db);
}
return FALSE;
}
function _close()
{
global $_sess_db;
return mysql_close($_sess_db);
}
function _read($id)
{
global $_sess_db;
$id = mysql_real_escape_string($id);
$sql = "SELECT access FROM sessions WHERE id = '$id'";
if ($result = mysql_query($sql, $_sess_db)) {
if (mysql_num_rows($result)) {
$record = mysql_fetch_assoc($result);
return $record['access'];
}
}
return '';
}
function _write($id)
{
global $_sess_db;
$access = time();
$id = mysql_real_escape_string($id);
$access = mysql_real_escape_string($access);
$sql = "INSERT INTO sessions VALUES ('$id', '$access')";
return mysql_query($sql, $_sess_db);
}
function _destroy($id)
{
global $_sess_db;
$id = mysql_real_escape_string($id);
$sql = "DELETE FROM sessions WHERE id = '$id'";
return mysql_query($sql, $_sess_db);
}
function _clean($max)
{
global $_sess_db;
$old = time() - $max;
$old = mysql_real_escape_string($old);
$sql = "DELETE FROM sessions WHERE access < '$old'";
return mysql_query($sql, $_sess_db);
}
session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');
session_start();
Представленный код является решением в верном направлении (имеется ввиду использование session_set_save_handler), но не смущает ли вас, что в этой сессии вы максимум можете сохранить дату обращения к ней? в _write() нет второго параметра, который принимал бы $data
Смею предложить использовать в качестве хранилища memcache/redis вместо mysql
Цитата: Romik
но не смущает ли вас, что в этой сессии вы максимум можете сохранить дату обращения к ней? в _write() нет второго параметра, который принимал бы $data
Смею предложить использовать в качестве хранилища memcache/redis вместо mysql
Смею предложить использовать в качестве хранилища memcache/redis вместо mysql
Да вы правы на 100 % и про $data и про memcache. Когда найду решение данной задачи выложу код здесь.