Как установить путь файла cookie сеанса в cakePHP при сохранении данных сеанса в базе данных? - PullRequest
4 голосов
/ 01 сентября 2011

По умолчанию cakePHP помещает куки-файл сессии на уровень приложения.Например, если у вас есть приложение cakePHP по адресу www.mydomain.com/myapp, файл cookie сохраняется в «/ myapp».Мне нужно, чтобы мои данные сеанса были доступны другим приложениям на www.mydomain.com, поэтому я бы хотел, чтобы вместо этого файл cookie сеанса сохранялся в "/".

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

Как отрегулировать обработку сеансов CakePHP для ваших нужд

cakePHP - Кулинарная книга - Сеансы

Кто-нибудь знает, как изменить путь файла cookie сеанса на "/", при этом сохраняя возможность сохранения данных сеанса в базе данных?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 сентября 2011

По умолчанию сеансы на обычном сервере должны быть глобальными по умолчанию. По крайней мере, были на всех серверах, которые я использовал .. Так что я бы на самом деле поменял свой сервер до некоторого жесткого обхода в скрипте.

Однако, если вы используете некоторый связанный с сеансом класс, у которого есть функция __destruct() в конце ... и в нем, у вас есть session_destroy(); ИЛИ на самом деле не имеет значения, где session_destroy (); сидит, но это имеет значение для вашей проблемы, связанной с путем. Я провел несколько быстрых тестов и сеансы по умолчанию являются глобальными в домене ... однако, на второй странице, очевидно, переменная не отображается, если страница триггера убивает ее.

Мой тест:

файл trigger.php:

<?

session_start();

echo $_SESSION['foo'] = 'bar';

// session_destroy(); <- This kills it
// Otherwise $_SESSION['foo'] gets displayed on the child.php file in test/ directory

?>

test / child.php file:

<?

session_start();

echo $_SESSION['foo'];

?>
0 голосов
/ 01 сентября 2011

Разве это не может быть сделано на уровне PHP, а не в самом CakePHP?

Таким образом, вы можете использовать session_set_save_handler() (man-страницу) следующим способом для достижения сеансов, хранящихся в базе данных. Следующий код взят из комментария на странице справки по PHP от maria at junkies dot jp , и я его специально не проверял:

<?php
class Session
{

    /**
     * a database connection resource
     * @var resource
     */
    private $_sess_db;

    /**
     * Open the session
     * @return bool
     */
    public function open() {

        if ($this->_sess_db = mysql_connect(SESSION_DB_HOST,
                                            SESSION_DB_USER,
                                            SESSION_DB_PASS)) {
            return mysql_select_db(SESSION_DB_DATABASE, $this->_sess_db);
        }
        return false;

    }

    /**
     * Close the session
     * @return bool
     */
    public function close() {

        return mysql_close($this->_sess_db);

    }

    /**
     * Close the session
     * @return bool
     */
    public function close() {

        return mysql_close($this->_sess_db);

    }

    /**
     * Read the session
     * @param int session id
     * @return string string of the sessoin
     */
    public function read($id) {

        $id = mysql_real_escape_string($id);
        $sql = sprintf("SELECT `data` FROM `sessions` " .
                       "WHERE id = '%s'", $id);
        if ($result = mysql_query($sql, $this->_sess_db)) {
            if (mysql_num_rows($result)) {
                $record = mysql_fetch_assoc($result);
                return $record['data'];
            }
        }
        return '';

    }

    /**
     * Write the session
     * @param int session id
     * @param string data of the session
     */
    public function write($id, $data) {

        $sql = sprintf("REPLACE INTO `sessions` VALUES('%s', '%s', '%s')",
                       mysql_real_escape_string($id),
                       mysql_real_escape_string($data),
                       mysql_real_escape_string(time()));
        return mysql_query($sql, $this->_sess_db);

    }

    /**
     * Destoroy the session
     * @param int session id
     * @return bool
     */
    public function destroy($id) {

        $sql = sprintf("DELETE FROM `sessions` WHERE `id` = '%s'", $id);
        return mysql_query($sql, $this->_sess_db);

}

    /**
     * Garbage Collector
     * @param int life time (sec.)
     * @return bool
     * @see session.gc_divisor      100
     * @see session.gc_maxlifetime 1440
     * @see session.gc_probability    1
     * @usage execution rate 1/100
     *        (session.gc_probability/session.gc_divisor)
     */
    public function gc($max) {

        $sql = sprintf("DELETE FROM `sessions` WHERE `timestamp` < '%s'",
                       mysql_real_escape_string(time() - $max));
        return mysql_query($sql, $this->_sess_db);

    }

}

//ini_set('session.gc_probability', 50);
ini_set('session.save_handler', 'user');

$session = new Session();
session_set_save_handler(array($session, 'open'),
                         array($session, 'close'),
                         array($session, 'read'),
                         array($session, 'write'),
                         array($session, 'destroy'),
                         array($session, 'gc'));

// below sample main

session_start();
session_regenerate_id(true);

?>

Так что вы можете сослаться на это в вашем файле начальной загрузки.

...