【问题标题】:Pinning objects to memory将对象固定到内存
【发布时间】:2012-05-21 11:20:44
【问题描述】:

我试图想出一种简单的方法来永久地将 PHP 对象固定到内存中,然后让其他更临时的对象在它们正常工作的页面请求服务期间可以使用它来发送消息。我对 Wordpress 还比较陌生,所以也许我把事情弄得太复杂了……让我通过一个例子来展示我想要做什么:

  1. 在启动时加载一个 UOM(度量单位)对象,该对象轮询数据库以获取单位列表、默认单位、单位类别(例如,磅是imperial 度量)、转换率等。
  2. 想要使用 UOM 转换或查找的后续服务请求只需调用全局 UOM 对象 ($UOM->get_measures_for_category ('speed'))。该对象已经在内存中,不需要返回数据库来处理请求。
  3. UOM 上的 update() 方法将允许基于事件或时间的触发器请求 UOM 对象进行自我更新。

这只是服务请求经常使用的一些相对静态的数据集的一个示例,并且重复查询数据库将是浪费的。希望人们熟悉这种模式,并且可以向我指出一些示例,说明如何在 Wordpress/PHP 环境中执行此操作。

【问题讨论】:

    标签: php performance memory


    【解决方案1】:

    对于您想要的,这不是最好的方法。但是,您所谈论的内容需要了解 PHP 的基本原则之一和一般的编程(也称为作用域),即全局作用域是什么。

    所以,如果你在全局范围内声明:

     $uom = new UOM_Class();
    

    然后在之后的任何文件中写入:

    global $uom;
    $uom->something();
    

    它会起作用的。

    然而,这都是浪费,相反,你会更好地使用静态方法,更像是单例模式,例如:

    UOM::Something();
    

    我把它留给你一个任务,让你了解什么是单例,什么是作用域,这些是 PHP 的基本原则,你不应该在不知道作用域的情况下声称了解 PHP。最好的说法是在日常对话中,称为context,全局范围就等于同时在每个人的耳边大喊大叫。每个人都可以访问它,它不是你想污染的东西

    对不起,如果我看起来有点苛刻,这里有一些文章应该会有所帮助,他们谈论范围、单例和其他一些方法,比如对象工厂

    http://php.net/manual/en/language.variables.scope.php http://www.homeandlearn.co.uk/php/php8p2.html

    http://php.net/manual/en/language.oop5.patterns.php

    【讨论】:

    • 我明白什么是单例和范围。我认为您对我的经验水平做出了一些错误的假设。
    • 我的问题确实来自于不了解 Wordpress 中的对象生命周期。我的假设是它实际上是无状态的,并且每个 Web 请求都会导致一组操作,但在这些操作结束时——无论它们包括对象工厂、单例、全局变量等等——通过管道的下一个请求具有无法访问这些对象。我希望创建一个对象池,其中包含事务可以访问的半静态信息(理想情况下是通过命名空间而不是全局变量),而无需每次都访问数据库。
    • 我想像 memcached 和 redis 这样的技术/技术可能会与我的需求重叠,但我还没有使用过这些,我的印象是它们的方法更通用,因此是共享对象池解决方案如果已知该模式具有高重用性,则设计的可能会带来更大的好处。
    • 我不知道有任何这样的解决方案,除非涉及缓存插件,否则 WordPress 本身也不处理任何此类机制,也许您应该修改您的问题以使其更清楚,这并不完全很明显,您想创建一个对象的实例并使其在 PHP 实例之间的内存中持久存在。
    • 您最好的选择可能是使用 WP_Cache 和一个缓存插件,使其持久化
    【解决方案2】:

    我最初发布时没有明确提出我的问题,但根据与 Tom 的对话,我同意在 Stack Overflow 上更清楚地重新发布此问题。

    【讨论】:

    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2013-08-06
    • 2013-02-17
    相关资源
    最近更新 更多