2

I came from Desktop development and I am used to see my application in the computer's memory until it is terminated by the user. But with PHP we have to rebuild all the environment (classes, objects, database connections etc.) every time a new page is requested to the server. We store a few variables in the $_SESSION array to keep the user logged if he/she is authenticated.

Is it a good idea if after the user authentication, I put the application object (and every other objects the application created into the current session so the interpreter does not need to reload everything on every request? If it is a good idea, is it only a good if my server is dedicated?

I can't think that it wont make the response faster, and also less memory consumer.

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

I want to know if it is:

  • Possible?
  • A server memory killer?
  • Faster then rebuild the app by reading all PHP files from my MVC?
  • Reliable approach?
4

1 回答 1

5

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

扩展答案:

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

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

序列化相对节省空间,但不如源代码节省空间。您的所有应用程序数据都将被序列化到磁盘,即使是每个用户/会话不会更改的数据。那么,你埋在某个班级的州代码清单?序列化。您用于处理上传的 mime 类型的扩展地图?序列化。你最终会得到一大堆数据,这些数据会很快耗尽磁盘空间,因为它基本上被复制到每个会话中,而不是只在你的应用程序中存在一次。出于空间原因和会话可管理性的原因,您不应该这样做。

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

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

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

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

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

于 2013-10-11T23:44:44.800 回答