- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
事情是这样的。我的一位同事正试图覆盖我们使用的框架的 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/
假设我的 Linux 系统中运行着 20 个进程/deqamons,与 SHUTDOWN 相比,HALT 对我的进程/守护进程的影响有何不同 最佳答案 通常,人们使用 shutdown command
我无法理解差异。帮我看看这个区别。而ProcessPoolExecutor呢,他的行为是一样的吗? def func(task): do_something(task) tasks = [ta
在某个时候,在代码推送后不久,我们看到我们的 Web 应用程序多次重启,但没有任何日志记录表明存在任何问题。所以我找到了这篇文章:http://weblogs.asp.net/scottgu/4331
这个问题已经有答案了: Difference between shutdown and shutdownNow of Executor Service (3 个回答) 已关闭 4 年前。 以下是Exe
这个问题在这里已经有了答案: close vs shutdown socket? (9 个回答) 关闭 5 年前。 在此 MSDN 页面上: Sending and Receiving Data o
我想知道使用elasticsearch shutdown API和终止elasticsearch进程(ctrl + c)之间的区别。我实际上不以正常关闭为答案,因为我想知道发出关闭API调用时ES实际
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
Java 定时器调度任务:servive JVM 关闭? Timer timer = new Timer(); timer.scheduleAtFixedRate(...) JVM关闭后,调度的任务还
这个问题已经有答案了: Difference between shutdown and shutdownNow of Executor Service (3 个回答) 已关闭 5 年前。 我正在检查j
我正在 Windows 10 上的 CPython 3.7 中实现一个 Server 类,其中使用永久启动服务的 Server.serve 方法和 Server.shutdown code> 停止服务
为了避免延长等待时间,建议您在调用 awaitTermination() 之前先调用 shutdown(),因为后者不适合杀死执行者。但是,为了等待任务完成,您是否应该使用 invokeAll() 来
我正在用 Python 为老式计算机系统编写一个模拟器,在摆脱停止状态后尝试“重新启动”模拟器核心线程时,我遇到了一些抛出异常的问题。 “运行处理器”方法是一个更大类的一部分,如下所示: def ru
我有以下代码,用于在端口 8000 上运行本地 HTTP 服务器: # Omitted imports and irrelevant things for brevity. class Threade
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util
我制作了一个程序,它会在设定的时间后关闭 PC。用户使用 2 个旋转框(一个用于小时,另一个用于分钟)输入时间,然后我将它转换为毫秒: ms = (ui->hBox->text().toInt() *
class System { public: virtual ~System() final { Shutdown(); }; virtual void Shu
看下面的代码: public void pinger() { ScheduledThreadPoolExecutor executor = new Schedule
我开发了一个小型 Java 应用程序,在其中使用 Quartz.jar 库。 但是当执行我的应用程序并调用 Quartz 时,我在控制台中收到以下错误消息: org.quartz.SchedulerE
我有 parking 系统的代码。当空格数超过 20 时,它会发送错误消息,因为 20 是空格的限制。我想在此之后尝试关闭程序。 我已尝试做您可以在 Python 中做的事情。这是: import s
我们在 RHEL (jdk 1.7.. 51) 上使用 Neo4j2.0.1 - 我们在一个同步线程上调用 GraphDatabaseService.shutDown(),并且此方法永远不会返回或引发
我是一名优秀的程序员,十分优秀!