gpt4 book ai didi

php - 将整个应用程序放入$_SESSION 中可以吗?

转载 作者:行者123 更新时间:2023-12-02 21:47:09 25 4
gpt4 key购买 nike

我来自桌面开发,我习惯于在计算机内存中查看我的应用程序,直到它被用户终止。但对于 PHP,每次向服务器请求新页面时,我们都必须重建所有环境(类、对象、数据库连接等)。我们在 $_SESSION 数组中存储一些变量,以便在用户通过身份验证时保持用户登录状态。

如果在用户身份验证之后,我将 application 对象(以及应用程序创建的所有其他对象)放入当前 session 中,这样解释器就不需要在每个请求上重新加载所有内容,这是一个好主意吗? ? 如果这是一个好主意,那么只有我的服务器是专用的才好吗?

我认为它不会使响应更快,并且内存消耗更少。

<?php
// if user and password match:
session_start()
$_SESSION['Application'] = new TApplication('index/index');
$_SESSION['Application']->SetUser($userName);
$_SESSION['Application']->ConfigureUserPermissions;
$_SESSION['Application']->RUN;

<?php
// any request after user is logged and application is set:
session_start()
if (isSet($_SESSION['Application']) && (!$_SESSION['Application']->GetUser = null))
{
$_SESSION['Application']->ExecuteAction($_GET['url']);
}

我想知道是不是:

  • 可能吗?
  • 服务器内存 killer ?
  • 通过从我的 MVC 读取所有 PHP 文件来重建应用会更快吗?
  • 可靠的方法?

最佳答案

简短回答:不,这是一个坏主意。

扩展答案:

session 的存储方式取决于您的配置。默认情况下,它们通常存储在一个文件中(每个唯一 session 一个文件)。有时它们存储在数据库中。无论哪种方式,此存储都会首先序列化 $_SESSION 中的所有数据。

序列化速度相当快,但不如执行实际源代码那么快。因此,对每个请求取消序列化并再次序列化整个应用程序的对象树几乎肯定会比仅仅执行应用程序慢。因此,出于性能原因,您不应该这样做。

序列化相对节省空间,但不如源代码节省空间。所有应用程序数据都将序列化到磁盘,即使是每个用户/ session 不会更改的数据。那么,您在某个类(class)中埋藏的状态代码列表是什么呢?连载了。您用来处理上传的 mime 类型的扩展图?连载了。您最终会得到相当大的困惑数据,这些数据将很快耗尽磁盘空间,因为它基本上被复制到每个 session ,而不是仅在应用程序中存在一次。出于空间原因和 session 可管理性原因,您不应该这样做。

只有某些类型的数据可以被序列化。任何指向资源的内容(例如数据库连接、文件句柄等)都将无法序列化,并且在反序列化对象后尝试使用它时会中断。出于兼容性原因,您不应该这样做。

无论对象是否在 session 中,都会使用内存。将应用程序填充到 session 中对于内存没有任何好处。额外的序列化可能会导致内存使用量增加。

the interpreter does not need to reload everything on every request

这实际上并不是现代 PHP 环境(或为 Web 构建的任何其他语言环境)的真正工作方式。大多数(如果不是全部)源代码都已预加载。我认为您低估了环境快速执行代码的能力。与解释器和 Web 服务器对抗通常是一个坏主意。序列化和反序列化大量数据通常比重新执行所有代码的成本要高得多。

session 存储并不便宜。最好只放置处理当前 session 所需的数据,仅此而已,以保持较低的序列化成本。如果计算某些数据很慢并且您不想每次都重新计算它,那么当然,找到一个地方来存储它并且不要每次都重新计算它。如果是用户数据,那可能应该在数据库中。如果它特定于 session ,当然,将其放入 $_SESSION 中一段时间​​,但理想情况下,$_SESSION 中只有几个指向记录的小键在数据库或其他能够更有效地保存大量数据的地方。

关于php - 将整个应用程序放入$_SESSION 中可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19328706/

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