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

时间:2013-10-11 23:25:49

标签: php session

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

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

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

<?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']);  
    }

我想知道它是否是:

  • 可能的?
  • 服务器内存杀手?
  • 通过阅读PHP中的所有MVC个文件,快速重建应用程序?
  • 可靠的方法?

1 个答案:

答案 0 :(得分:5)

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

扩展回答:

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

序列化非常快,但不如执行实际源代码那么快。因此,让每个请求的整个应用程序的对象树不再序列化和序列化几乎肯定会比执行应用程序慢。因此,出于性能原因,您不应该这样做。

序列化相对空间有效,但不像源代码那样节省空间。您的所有应用程序数据都将序列化到磁盘,甚至是每个用户/会话不会更改的数据。那么,你的状态代码列表已隐藏在某个类的某个类中?序列化。你用来处理上传的mime类型的扩展地图?序列化。你最终会得到一大堆数据会很快耗尽磁盘空间,因为它基本上被复制到每个会话而不是仅仅在你的应用程序中存在一次。出于空间原因和会话可管理性的原因,您不应该这样做。

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

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

  

解释器不需要在每个请求上重新加载所有内容

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

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