Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос о сессиях в PHP

365
29 января 2004 года
MasterSID
230 / / 23.02.2003
Значит, взялся я разбираться с сессиями и заметил, что каждая сессия создает отдельный файл с именем идентификатора сессии, а потом этот файл удаляется вызовом того же скрипта по истечении срока, который прописывается в настройках PHP, либо же этот файл можно убить функцией session_destroy(). Заинтересовавшись всем этим, я полез поинтересоваться и поэкспериментировать с форумом phpBB и обнаружил интересый факт, что при работе с ним никакие файлы не создаются, хотя сессии очевидно активно используются. Сразу стало интересно как это так? Покопавшись немного в глубинах сети, наткнулся на одно упоминание о том, что помимо файлов данные сессии можно хранить в базе данных. Вот собственно и возник вопрос - а как это сделать? Про то что в php.ini вроде бы есть такая опция я уже знаю, но фишка-то в том, что у меня там стоит file, а phpBB очевидно пользуется базой данных, либо чем-то другим о чем я пока еще не знаю. Подскажите пожалуйста кто знает.
423
29 января 2004 года
Quasi
98 / / 20.01.2000
Цитата:
Originally posted by MasterSID
Значит, взялся я разбираться с сессиями и заметил, что каждая сессия создает отдельный файл с именем идентификатора сессии, а потом этот файл удаляется вызовом того же скрипта по истечении срока, который прописывается в настройках PHP, либо же этот файл можно убить функцией session_destroy(). Заинтересовавшись всем этим, я полез поинтересоваться и поэкспериментировать с форумом phpBB и обнаружил интересый факт, что при работе с ним никакие файлы не создаются, хотя сессии очевидно активно используются. Сразу стало интересно как это так? Покопавшись немного в глубинах сети, наткнулся на одно упоминание о том, что помимо файлов данные сессии можно хранить в базе данных. Вот собственно и возник вопрос - а как это сделать? Про то что в php.ini вроде бы есть такая опция я уже знаю, но фишка-то в том, что у меня там стоит file, а phpBB очевидно пользуется базой данных, либо чем-то другим о чем я пока еще не знаю. Подскажите пожалуйста кто знает.



Есть такая фича в php, как сериализация данных, т.е. сериализуешь переменные, а потом получившиюсю строку сливаешь в БД

365
29 января 2004 года
MasterSID
230 / / 23.02.2003
А ссылочкой можешь поделиться?
1.3K
30 января 2004 года
view
148 / / 14.10.2003
Цитата:
Originally posted by MasterSID
А ссылочкой можешь поделиться?



Вот пример

Код:
$SESS_DBHOST = $mysql_host;         /* database server hostname */
$SESS_DBNAME = $mysql_db;           /* database name */
$SESS_DBUSER = $mysql_user;     /* database user */
$SESS_DBPASS = $mysql_pwd;      /* database password */

$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");

function sess_open($save_path, $session_name) {
    global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;

    if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
        echo "Can't connect to $SESS_DBHOST as $SESS_DBUSER";
        echo "MySQL Error: ", mysql_error();
        die;
    }

    if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {
        echo "Unable to select database $SESS_DBNAME";
        die;
    }

    return true;
}

function sess_close() {
    return true;
}

function sess_read($key) {
    global $SESS_DBH, $SESS_LIFE;

    $qry = "SELECT value FROM sessions WHERE sesskey = '$key' AND expiry > " . time();
    $qid = mysql_query($qry, $SESS_DBH);

    if (list($value) = mysql_fetch_row($qid)) {
        return stripslashes($value);
    }

    return '';
}

function sess_write($key, $val) {
    global $SESS_DBH, $SESS_LIFE;

    $expiry = time() + $SESS_LIFE;
    $value = addslashes($val);

    $qry = "INSERT INTO sessions VALUES ('$key', $expiry, '$value')";
    $qid = mysql_query($qry, $SESS_DBH);

    if (! $qid) {
//      $qry = "UPDATE sessions SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " . time();
        $qry = "UPDATE sessions SET expiry = $expiry, value = '$value' WHERE sesskey = '$key'";
        $qid = mysql_query($qry, $SESS_DBH);
    }

    return $qid;
}

function sess_destroy($key) {
    global $SESS_DBH;

    $qry = "DELETE FROM sessions WHERE sesskey = '$key'";
    $qid = mysql_query($qry, $SESS_DBH);

    return $qid;
}

function sess_gc($maxlifetime) {
    global $SESS_DBH;

    $qry = "DELETE FROM sessions WHERE expiry < " . time();
    $qid = mysql_query($qry, $SESS_DBH);

    return mysql_affected_rows($SESS_DBH);
}

session_set_save_handler(
    "sess_open",
    "sess_close",
    "sess_read",
    "sess_write",
    "sess_destroy",
    "sess_gc");
365
30 января 2004 года
MasterSID
230 / / 23.02.2003
Спасибо большое!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог