簡體   English   中英

如何在仍保存數據庫中的會話數據的同時在cakePHP中設置會話cookie路徑?

[英]How do I set the session cookie path in cakePHP while still saving session data in the database?

默認情況下,cakePHP將會話cookie放在應用程序級別。 例如,如果您在www.mydomain.com/myapp上有cakePHP應用程序,則cookie將存儲在“/ myapp”中。 我需要將我的會話數據提供給www.mydomain.com上的其他應用程序,所以我希望將會話cookie存儲在“/”中。

我發現了一些關於如何執行此操作的文章,但是當使用這兩個熱門帖子/指南中解釋的方法時,它會禁用保存在數據庫中的會話。

如何根據您的需要彎曲CakePHP的會話處理

cakePHP - Cookbook - Sessions

有沒有人知道如何將會話cookie路徑更改為“/”,同時仍然能夠在數據庫中保存會話數據?

謝謝!

這不能在PHP級別而不是CakePHP本身完成嗎?

因此,您可以使用session_set_save_handler() (手冊頁)以下列方式來實現存儲在數據庫中的會話。 以下代碼來自maria at junkies dot jp對PHP 手冊頁的評論,我沒有專門測試它:

<?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);

?>

所以你可以在你的bootstrap文件中引用它。

基本上,默認情況下,普通服務器中的會話應該是全局的。 至少已經在所有服務器上,我已經使用過..所以我實際上會在腳本中的一些硬核解決之前更改我的服務器。

但是,如果你正在使用一些與會話相關的類,那么在末尾有__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文件:

<?

session_start();

echo $_SESSION['foo'];

?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM