php cookie domain,session.cookie_domain在2个子域的Plesk / PHP应用程...

Why is this not working?

默认情况下,会话会保存到服务器上的本地文件中,该文件的位置在php.ini的session.save_path中指定,例如session.save_path = / var / lib / php / sessions(如果有app.example.com和help.app) .example.com在两个具有各自文件系统的不同服务器上运行,或者即使它在同一文件系统上运行,但在php.ini中具有不同的session.save_path指令,它们也不会共享相同的$_SESSION.

如果您希望2个不同的服务器共享相同的$_SESSION,则可能的解决方案包括使用session_set_save_handler()创建共享的会话存储数据库(就像想到的MongoDB或MySQL),或者创建一个联网的文件系统并设置session.save_path = / path /到php.ini中的/ networking / filesystem / mountpoint,但是这两种方法都可能会导致明显的性能损失.

…由于Cookie是在两个域之间共享的,因此session_id()将在两边都返回相同的值,可以将其用作会话数据库的ID,请看一下http://php.net/manual/en/class.sessionhandlerinterface.php

(如果我有更多时间,但我没时间的话,我会写一个示例课)

切换到由sql-db支持的会话存储(例如MariaDB,MySQL或PostgreSQL),例如:

模式:

CREATE TABLE sessions (

id VARCHAR(255) ,

atime BIGINT ,

data BLOB

)

SessionHandlerInterface的实现:

class MySqlSessionHandler implements SessionHandlerInterface

{

protected $db;

public function __construct(string $dsn, string $username, string $password)

{

$this->db = new PDO($dsn, $username, $password, array(

PDO::ATTR_EMULATE_PREPARES => false,

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

));

}

protected function a(string $id) : bool

{

$ret = $this->db->query("UPDATE sessions SET atime = " . (time()) . " WHERE id = " . $this->db->quote($id));

return ($ret->rowCount() > 0);

}

public function close() : bool

{

// TODO: implement locking/race-condition-free session handling?

return true;

}

public function destroy(string $id) : bool

{

$this->db->query("DELETE FROM sessions WHERE id = " . $db->quote($id));

return true;

}

public function gc(int $maxlifetime) : int

{

$this->db->query("DELETE FROM sessions WHERE atime < " . (time() - $maxlifetime));

return 1; // ??? not sure what this return int is supposed to contain, docs doesn't say either

}

public function open(string $save_path, string $session_name) : bool

{

if (!$this->a($session_name)) {

$stm = $this->db->prepare("INSERT INTO sessions (id,atime,data) VALUES(?,?,?);");

$stm->execute(array($session_name, time(), serialize(null)));

}

return true;

}

public function read(string $session_id) : string

{

if (!$this->a($session_id)) {

throw new \InvalidArgumentException("supplied session id does not exist.");

}

return $this->db->query("SELECT data FROM sessions WHERE id = " . $this->db->quote($session_id))->fetch(PDO::FETCH_ASSOC)['data'];

}

public function write(string $session_id, string $session_data) : bool

{

// optimization note: this function can be optimized to do everything in a single query, instead of using a() (which also use a query)

if (!$this->a($session_id)) {

throw new \InvalidArgumentException("supplied session id does not exist.");

}

$stm = $this->db->prepare("UPDATE sessions SET data = ? WHERE id = ?");

$stm->execute(array($session_data, $session_id));

return true;

}

}

用法:

// for DSN documentation, check http://php.net/manual/en/ref.pdo-mysql.connection.php

$handler = new MySqlSessionHandler ('mysql:host=mydb.foo.com;dbname=sessions;charset=utf8mb4','MySqlUsername','MySqlPassword');

session_set_save_handler($handler, true);

session_start();

>现在,他们绝对应该共享会议.

>警告:撰写本文时未经测试,但这在理论上应该可行.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值