【问题标题】:PHP variable cachingPHP 变量缓存
【发布时间】:2012-05-22 06:03:12
【问题描述】:

我在 MySQL 数据库中有一些大部分时间都是静态的数据。它们主要是几乎静态的值,如城市、州和种族。我想将它们缓存在一个变量中,最好是在内存中,这样我就不需要在每次加载页面时都对 MySQL 执行另一个查询。

问题是,我的主机不支持 memcache 也不支持 APC。我能找到的唯一加速器是 eAccelerator,我认为它不会实现我的想法。

有什么办法可以做缓存吗?是http://www.k-disk.net

谢谢

【问题讨论】:

  • 把它们放在一个文件里怎么样? MySQL,确实会自己做一些缓存。
  • 是的,如果它们从不更改,您可以将它们声明为 PHP 数组并将它们粘贴到某个文件中。
  • 它们不是“从不”改变,但它们几乎没有改变。新城市,新地区,有时还有新名字。有点像中间的几年。如果您一次又一次地查询此类数据,并且连续几年得出相同的答案,无论您的查询在哪里运行,这样的数据只会浪费资源。

标签: php hosting eaccelerator


【解决方案1】:

缓存是无处不在的时空权衡的一个很好的例子 编程。您可以通过使用空间来存储结果来节省时间。 [1]

在网站上实现缓存的方法有很多。让我们看看它们从前端开始,然后向后端移动,而不涉及太多细节。

HTTP 缓存

How To Optimize Your Site With HTTP Caching

应用级缓存

这是“昂贵的查询”数据库对象的缓存。 例如:memcache、在文件中缓存页面等。

操作码缓存

如:PHP 加速器、eAccelerator 等

数据库级缓存

通过根据需要和机器硬件调整其参数来优化数据库。

在您的情况下,我建议使用 my.cnf 进行调整,因为给定足够的 RAM,MySQL 非常快。尽量不要预先优化。

【讨论】:

  • 我不认为我可以访问 my.cnf :D 是的,MySQL 相当快,但是当我们处理其他数据时,MySQL 会将这些数据保存在内存中吗?并且查询 MySQL 这么小的东西,并且在几年内不会改变,我认为这是一种资源浪费。我打算将它们存储在内存中。也许只有几 MB 的 RAM,并且永远留在那里。有点像 Java 中的单例。我的目标是避免不必要的 IO 开销,并将它们保存在内存中。
  • 好吧,除非您每天都获得大量点击,这会对您网站的其他部分产生不利影响,否则我真的不会花太多时间来优化它。你知道他们怎么说过早优化:)
  • 嗯,我的习惯是总是编写这样的任何应用程序:)。所以当他们告诉我他们没有任何持久缓存时,我有点迷茫。无论如何,它大多是静态的,PHP 在每个页面请求时从磁盘或缓存中读取数据。
【解决方案2】:

您可以使用共享内存扩展。

看看这个基本示例:http://www.php.net/manual/en/shmop.examples-basic.php

【讨论】:

    【解决方案3】:

    您可以只将一个文件写入您的服务器,该文件保存一个序列化的 php 变量数组。只需将所有变量插入关联数组,然后序列化并保存。虽然老实说我不明白为什么不将变量保存到数据库中的变量表中。这不是一项昂贵的操作。

    $myvars = array(
      'how_high_do_i_jump' => 10,
      'which_tv_show_is_best' => 'Glee',
      'enable_caching' => true,
      'mathematical_solution' => 4534.234
    );
    
    $file_str = serialize($myvars);
    
    //Save the file
    file_put_contents('myvars.ser', $myvars);
    
    //To reverse just do this
    $file = file_get_contents('myvars.ser');
    
    $myvars = unserialize($file);
    

    如果这对您不起作用,如果您具有 SSH 访问权限,则可以通过一种方法在您的共享主机上获取 memcache。我实际上是在hostmonster上做到这一点的。这是对它的介绍(虽然这不是我最初使用的文章)。
    http://andrewpeng.net/posts/2011/06/271273-memcached-and-dreamhost-shared-tutorial.html

    【讨论】:

    • 然后,每次用户请求此页面时,我都需要读取磁盘。类似于报告或地理数据。我的目标是完全消除这种情况,所以我只需要查询内存中的 mmy 对象。正如我所说,像 Java 中的单例一样提供静态哈希。
    • 我不知道 PHP 中有任何这样的结构。但也许有,其他人可以告诉我们。
    • memcached 或 apc 可以解决我的问题,但它们不可用。所以我实际上正在寻找替代品。
    • 您有 SSH 访问权限吗?如果你这样做了,那么我在上面发布的链接将告诉你如何添加 memcache。
    【解决方案4】:

    您可以使用 file_put_contents() 和 file_get_contents() 创建自定义缓存类,从磁盘存储和读取数据。

    【讨论】:

    • 我想避免任何不必要的 IO 成本。保存到磁盘不会解决这个问题。我正在寻找可以在所有页面之间的 RAM 中保留这些值的东西,而 PHP 只需要在 RAM 中找到这些值。没那么大,反正几年也不会变。
    猜你喜欢
    • 2013-08-31
    • 2011-08-05
    • 2015-04-15
    • 2011-09-16
    • 2014-03-24
    • 2013-11-12
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多