Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将整个应用程序放入$\u会话可以吗?_Php_Session - Fatal编程技术网

Php 将整个应用程序放入$\u会话可以吗?

Php 将整个应用程序放入$\u会话可以吗?,php,session,Php,Session,我来自桌面开发,我习惯于在计算机内存中查看我的应用程序,直到它被用户终止。但是使用PHP,每次向服务器请求新页面时,我们都必须重建所有环境(类、对象、数据库连接等)。我们在$\u SESSION数组中存储一些变量,以便在用户通过身份验证时保持其日志记录 如果在用户身份验证之后,我将应用程序对象(以及应用程序创建的其他对象)放入当前会话中,这样解释器就不需要在每次请求时都重新加载所有内容,这是一个好主意吗?如果这是一个好主意,那么只有我的服务器是专用的,这才是一个好主意吗 我不认为它不会使响应更快

我来自桌面开发,我习惯于在计算机内存中查看我的应用程序,直到它被用户终止。但是使用PHP,每次向服务器请求新页面时,我们都必须重建所有环境(类、对象、数据库连接等)。我们在
$\u 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']);  
    }

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

扩展答案:

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

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

序列化相对节省空间,但不如源代码节省空间。所有应用程序数据都将序列化到磁盘,甚至每个用户/会话都不会更改的数据也会如此。因此,您在某个类中埋藏的状态代码列表?已序列化。您用于处理的mime类型的扩展映射加载?序列化。您将得到一大堆数据,这些数据将很快占用磁盘空间,因为它们基本上被复制到每个会话,而不是只在应用程序中存在一次。出于空间和会话可管理性的原因,您不应该这样做

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

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

解释器不需要在每次请求时都重新加载所有内容

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


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

据我所知,
$\u sessionode>变量在页面视图之间被序列化到磁盘,所以每次有新的请求传入时,您仍然需要重建数据库连接等。您应该尝试一下,然后才能发现为什么这种方法如此糟糕。我的意图是开发类似Office应用程序包的东西,其中有许多共享c的应用程序数据库中的类和表,包括user data.Server-cache(用于共享应用程序范围的资源)和session(可能用于用户特定的资源),不要将两者混合使用,因为这将浪费资源。@EASI:所以解决真正的任务。做些工作,然后进行配置,必要时进行优化。按此特定顺序