【发布时间】:2021-06-18 08:46:20
【问题描述】:
我在 PHP 8 上遇到了一个非常奇怪的会话问题(即使它也不适用于 7.4,但在 7.3 上效果很好)。
我所做的是创建一个类,在其中设置导出对象并将其存储在会话 $_SESSION['AjaxExport'][sessionid] 上。现在我想加载这个通过引用存储在处理导出的 ifram 上的对象。当我 session_start 时,它根本无法加载会话。
AjaxExporter Class
private function ExportIntro(){
while (ob_end_clean());
// remove any old ajax exports
unset($_SESSION['AjaxExport']);
$rnd = rand(1, 99999);
$this->sessionid = uniqid($rnd, true);
$_SESSION['AjaxExport'][$this->sessionid] = &$this;
在上面,加载用户获取链接以启动导出的模式。通过单击该链接,我加载了以下函数,该函数从会话中加载对象并开始通过自动重新加载导出到正在导出的过程中,例如 (10%-20%...)
class NG_ADMIN_AJAXEXPORTER_CONTROLLER extends NG_ADMIN_BASE {
public function Export()
{
$sessionid = '';
if (!empty($_REQUEST['exportsess']) && isset($_SESSION['AjaxExport'][$_REQUEST['exportsess']])) {
$sessionid = $_REQUEST['exportsess'];
}
else {
return;
}
$exporter = &$_SESSION['AjaxExport'][$sessionid];
$exporter->sessionid = $sessionid;
$exporter->HandleToDo($_REQUEST['action']);
}
}
当进程尝试启动时,我根本没有会话。 session_start():解码会话对象失败。会话已在...中销毁。
还尝试在这两个类上实现 Seriazable,但这也无法正常工作,因为即使存储了对象,它的属性中也没有值,所以它是无用的(即使我使用了引用 &)。
正如我上面提到的,这段代码在 php 7.3 中工作得很好,问题从 7.4 和 php 8 开始出现
【问题讨论】:
-
您是否有多个请求正在运行?如果您使用 PHP 的默认会话处理程序,第一个请求将锁定会话文件。 (我在使用 MySql 的自定义会话时遇到了问题,其中长请求会覆盖更新更快的请求)。附:对象总是通过引用,因此在将 $this 分配给会话时不需要“&”
-
不,我没有运行多个请求。还要检查一下,类似的事情正在发生,bugs.php.net/bug.php?id=79031