Zend Framework 何时从会话 table 中删除条目?

When does Zend Framework delete entries from the session table?

在我们将项目从 PHP5 切换到 PHP7 之后,会话 table 上的 SELECT(死锁)和 DELETE(超时)命令期间出现问题。好久没看,但是自2020年Octoboer以来,已经有超过2000万(!)个条目。显然,删除时间太长破坏了select声明。

我们将生产系统切换回 PHP5,这里似乎没有发生删除。目前,生产数据库中最早的条目来自我们清理后的 2 天前。我们的测试系统(PHP7 上的 运行,有自己的数据库)似乎可以清理超过 10 小时的任何东西(因此生命周期值为 36000 秒,如会话 table 中所示).

由于没有 cronjob 或任何类似的设置来清理,Zend Framework 似乎可以自行清理。但是我们看不到这是什么时候发生的,所以我们想了解这背后的“魔法”。

它是 Zend Framework 1.12(我知道,很老了,但决定首先切换框架不是在我手中,而是在筹备中)。

这里是死锁本身的例外情况:

PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 20003 Adaptive Server connection timed out [20003] (severity 6) [DELETE FROM "Session" WHERE ("modified" + "lifetime" < 1644330881)] in /var/www/[...]/library/Zend/Db/Statement/Pdo.php:228
Stack trace:
#0 /var/www/[…]/library/Zend/Db/Statement/Pdo.php(228): PDOStatement->execute(Array)
#1 /var/www/[…]/library/Zend/Db/Statement.php(303): Zend_Db_Statement_Pdo->_execute(Array)
#2 /var/www/[…]/library/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array)
#3 /var/www/[…]/library/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('DELETE FROM "Se...', Array)
#4 /var/www/[…]/library/Zend/Db/Adapter/Abstract.php(664): Zend_Db_Adapter_Pdo_Abstract->query('DELETE FROM "Se...')
#5 /var/www/[…]/library/Zend/Db/Table/Abst in /var/www/[…]/library/Zend/Db/Statement/Pdo.php on line 235

编辑:

有一个 class 名为

Zend_Session_SaveHandler_DbTable

使用名为 gc 的方法。但是调用的时候还是不明显

会话处理程序的 gc() 方法由 PHP 调用。在此处查看如何使用 PHP 的本机函数注册处理程序:https://github.com/diablomedia/zf1-session/blob/11c4bf70b8f87a3f30883fd85f2b9fe4b8afd250/src/Zend/Session.php#L265-L272

因此,您的 php.ini(https://www.php.net/manual/en/session.configuration.php#ini.session.gc-probability 和其他)中的会话垃圾收集设置似乎对于不同的 PHP 版本是不同的。检查它们,您应该会看到不同之处。