gpt4 book ai didi

php - 这是一个真正的挑战 : why does PHP call shutdown function before sessions are written?

转载 作者:可可西里 更新时间:2023-11-01 12:59:16 26 4
gpt4 key购买 nike

事情是这样的。我的一位同事正试图覆盖我们使用的框架的 session 处理。这个框架默认使用PHP自己的原生 session 处理,但他现在试图在请求之间实现一个数据库层。

问题是数据库对象在写入 session 时不可用,但它可用于其他功能,例如从 session 读取数据时。这是一种野蛮的行为。这是我们所做的:

register_shutdown_function('exithandler'); 

session_set_save_handler(
'sess_open',
'sess_close',
'sess_read',
'sess_write',
'sess_destroy',
'sess_gc'
);

这些函数中的每一个还会在我们的日志文件中写入一行,我们可以使用函数名称进行跟踪。每当调用该函数时都会执行此操作。现在这里有两个请求的 URL,第一个是实际写入 session 的地方( session 的新数据),第二个是刚刚检查 session 数据的地方(没有写入)。这是谜题:

/login/
sess_open
sess_read
exithandler
sess_write
sess_close

/account/
sess_open
sess_read
sess_write
sess_close
exithandler

为什么这种行为不同?为什么在将数据存储到 session 之前调用退出处理程序,为什么对于常规页面却不是这样,即使确实调用了相同的方法?

问题是在调用 exithandler 之后我们的类都不再可用,我假设 PHP 垃圾收集器已经在我们所有的类上调用了 __destruct() 方法并且它们已经消失了。这太糟糕了。

有人知道为什么 PHP 会这样吗?

最佳答案

正如您的评论所说的 PHP5.4,您可能想看看 SessionHandlerInterface() .您可以在 open() 方法中传递 register_shutdown_function 以半自动化该过程并真正利用 PHP5.4 功能。

<?php
class MySessionHandler implements SessionHandlerInterface
{
private $savePath;

public function open($savePath, $sessionName)
{
register_shutdown_function('session_write_close');
$this->savePath = $savePath;
if (!is_dir($this->savePath)) {
mkdir($this->savePath, 0777);
}

return true;
}

public function close()
{
return true;
}

public function read($id)
{
return (string)@file_get_contents("$this->savePath/sess_$id");
}

public function write($id, $data)
{
return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
}

public function destroy($id)
{
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}

return true;
}

public function gc($maxlifetime)
{
foreach (glob("$this->savePath/sess_*") as $file) {
if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
unlink($file);
}
}

return true;
}
}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

关于php - 这是一个真正的挑战 : why does PHP call shutdown function before sessions are written?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12268256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com