【问题标题】:how to create shared object in memory using PHP?如何使用 PHP 在内存中创建共享对象?
【发布时间】:2011-02-01 14:00:25
【问题描述】:


我的网站中有一个块,显示数据库表中的最新 20 项。
现在我需要创建一个数组或对象驻留在内存中,然后为浏览我网站的所有用户访问它? 我可以用 PHP 来做吗?

感谢您的帮助

【问题讨论】:

  • 你已经有了。该对象称为“查询缓存”,驻留在 DB 恶魔的内存中
  • 我不喜欢访问数据库!!正如我告诉你的那样,我将获得最新的 20 件物品,这些物品每时每刻都会改变。所以我想避免访问数据库并对其进行开销
  • 这毫无意义。上面,Alaa 说它“每时每刻”都在变化,但在下面他们说缓存将从数据库中更新,大概是“每时每刻”……那为什么不直接查询数据库,然后跳过中间人呢?除非这已经是一个拥有数千次点击的庞大应用程序,并且 DB 开销是对事物的明显拖累,否则这有过早优化的味道。
  • 100k 一天(仅限于 8 小时工作日)大约是 8 秒;我认为这不是一个巨大的数量,但我不是大型应用程序的专家。我再次建议,尽管在您迁移到 memcache 或 APC 之前,您执行指标并确定它实际上不是导致任何延迟的数据库开销(您没有说明是否这样做,或者实际上是否存在任何延迟,所以我们仅根据您共享的小信息运行)。故事的寓意:不要假设有开销,先测试一下。如果你有,那就太好了,但你还没有透露这个事实。
  • 上面的补充:一天 8 小时的 100k 实际上每秒只有 3 次点击,我认为这是任何系统都可以在没有花哨的缓存的情况下处理的。

标签: php object shared-memory


【解决方案1】:

如果您在 Windows 服务器上,请查看 APC 或 memcache 或 WinCache 等选项。这些都提供了缓存数据/对象的选项。

如果这是为了显示数据库中的最新项目,则每次向该数据库添加内容时都需要更新它,否则它将与数据库不一致

【讨论】:

  • 确定我会更新它,我在我的网站中使用drupal,因此我将在插入时使用nodeapi更新这个对象顺便说一句......我的服务器是linux CENTOS
【解决方案2】:


感谢您的贡献。
我找到了一种方法。
Alternative PHP Cache (APC) 是一个免费且开放的 PHP 操作码缓存。它的目标是为缓存提供框架。
尝试此代码并刷新页面或使用不同的浏览器打开它

【讨论】:

    【解决方案3】:

    PHP 是无状态的,因此不可能在不同会话之间轻松共享变量。 你可以通过一个技巧来做到这一点。 创建所有这些值的数组, 现在序列化数组$sharedObj = serialize ($originalArray) ; 您可以在$sharedObject 中获取您的$originalArray 的序列化变量 将$sharedObject 写入文本文件,您可以读取文本文件并反序列化该数据(您从文本文件中获取),您可以获得相同的数组。

    如果仍有问题,请告诉我。

    【讨论】:

    • 现在的问题是,文件系统的开销是否比数据库多?
    • @Andrew:确实——在我们去memcached 之前,我们为此使用了一个小的ramzdisk——正是因为磁盘太慢了。不过,那是一种“10k+ 同时用户”的网络应用程序。
    • 这听起来不是个好主意。我认为 DB 查询和 memcached 都会比重复 1)写入和 2)读取文件系统更快。
    • 天啊,XML 文件。比疾病更糟糕的治疗方法。
    • @Alaa:序列化和反序列化 XML 的开销以及磁盘 I/O 瓶颈可能大于避免使用数据库所带来的速度提升。
    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 2019-03-06
    • 1970-01-01
    • 2014-07-26
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多