【问题标题】:PHP Performance: Storing a Class Object in a Session vs Static vs GlobalsPHP 性能:在会话中存储类对象 vs 静态 vs 全局
【发布时间】:2012-11-22 14:18:16
【问题描述】:

我一直在寻找这个问题的答案,到目前为止我一直无法找到答案。我的问题是;存储不需要任何动态输入的巨大全局类的最佳方法是什么,只需要使用一次。

我们以一个模板类为例:

<?php
class Design_API{
   function loadfile($file){
     //load file here
   }

   // do file manipulation here

   function presentfile(){
      echo($this->file);
   }

}
?>

将此类用作布局的基本示例。使用它的最佳方式是性能和安全性。是否将其创建为全局实例?将实例存储在会话中;或者干脆把它变成一个静态类。

另外,假设我们使用了一个会话,如果 2 个客户端在同一毫秒访问该站点,php 是否会锁定会话文件,从而强制客户端 2 的 Web 加载需要更长的时间?

【问题讨论】:

    标签: php performance session web


    【解决方案1】:

    这个问题有点混乱,无法以一致的方式回答,所以这里有几点:

    • 一个客户端不会阻止另一个客户端,除非他们正在访问共享资源
    • 会话不是不同用户之间共享的资源,忘记这个误解
    • 无论您在哪里存储对象,性能几乎都不会改变
    • 它使不同请求和用户之间的差异更小,因为请求之间不共享资源
    • 首先编写您的意思和最可维护的代码,稍后在证明它很慢(可能不会)时优化它以提高性能
    • 尽可能避免使用全局变量
    • 不要在会话中存储不属于那里的东西,例如代码
    • 尽量避免static类,它们会导致代码耦合,应该减少这种耦合
    • static 类不一定更快

    【讨论】:

    • 关于会话的概念不一定是会话是共享的。因为事实上他们不是我知道的。这是因为通过存储许多会话并且处理会话所需的时间越长,PHP 就会使服务器上的会话文件保持打开状态以进行写入。如果超过 2 个客户端尝试使用这些会话访问相同的 php 文件,这会导致服务器锁定。如此处所述; konrness.com/php5/how-to-prevent-blocking-php-requests
    • @Chris 每个用户都有自己的会话文件,因此它只会阻止同一用户,而不是跨不同用户。
    【解决方案2】:

    处理这个问题的最好方法是使类成为一个单例类并使用静态方法来实例化它。

    在会话中存储对象会涉及序列化和反序列化,这对性能非常不利。此外,如果您将任何资源存储在类中,它们将无法序列化。

    【讨论】:

    • 我非常不同意 Singletons 是“最好的方式”。它们是一种有一些缺点的方式,即:static 调用 == 代码耦合 == 降低了灵活性和可测试性。
    • 虽然我同意您关于 Singleton 作为模式的评论,但这只是单例作为概念的实现之一(即仅单实例),我认为有必要指出概念本身并不一定是坏的。例如,在大多数情况下,只有一个数据库连接实例是最有意义的。还有很多其他模式实现了这个概念,没有你提到的缺点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2013-11-04
    • 2017-07-20
    • 1970-01-01
    • 2013-07-06
    • 2021-09-15
    • 1970-01-01
    相关资源
    最近更新 更多