PHP中的页面缓存处理并发?

时间:2009-08-04 08:17:52

标签: php caching

我在这里已经阅读过以前的答案,关于PHP中的缓存以及它们链接到的文章。我查看了经常推荐的Pear Cache_Light,QuickCache和WordPress超级缓存。 (对不起 - 显然我只允许超链接一次。)

要么没有处理并发问题,要么没有人明确地在文档中提到它们。

有人能指出我处理并发的PHP页面缓存的方向吗?

这是在共享主机上,所以很遗憾,memcache和操作码缓存不是一个选项。我不使用模板引擎,并希望避免依赖它。 WP Super Cache的方法更可取 - 即在wwwroot下存储静态文件以让Apache为它们提供服务 - 但不是必需的。

谢谢!

P.S。应自动处理的事项示例:

  1. Apache / PHP缓存正在读取缓存文件。缓存的文件已过时并尝试删除。
  2. 已删除缓存文件,因为它已过时。对该文件的请求进入,文件正在重新创建。 该文件的另一个请求在此期间进入。

6 个答案:

答案 0 :(得分:2)

似乎PEAR :: Cache_Lite具有处理并发问题的某种安全性。
如果你看一下constructor Cache_Lite::Cache_Lite的手册,你有这些选择:

  

<强> fileLocking       启用/禁用fileLocking。可以避免恶意下的缓存损坏   情况。

     

<强> writeControl       启用/禁用写入控制。启用写入控制将会轻微减慢   缓存写入但不是缓存   读。写控制可以检测到一些   损坏的缓存文件,但也许不是   一个完美的控制。

     

<强> readControl       启用/禁用读取控制。如果启用,则嵌入控制键   缓存文件与此密钥进行比较   与之后计算的那个   读

     

<强> readControlType       读控制的类型(仅当启用了读控制时)。必须是'md5'   (对于md5哈希控件(最好但是   最慢)),'crc32'(对于crc32哈希   控制(轻微安全但是   更快))或'strlen'(长度   只测试(最快))

使用哪一个仍然取决于您,并取决于您准备牺牲的性能类型 - 以及应用程序中可能存在的并发访问风险。


您可能还想查看Zend_Cache_Frontend_Output,使用Zend_Cache_Backend_File之类的内容作为后端来缓存页面。

那个似乎也支持某种安全性 - Cache_Lite已经给你的东西也是如此(所以我不会第二次复制粘贴)


作为旁注,如果您的网站在共享主机上运行,​​我认为它没有那么多用户?因此,并发访问的风险可能不高,是吗?

无论如何,我可能不会再搜索那些牵引框架提出的建议:它已经足以满足您的应用需求: - )

(我从来没有见过任何缓存机制“比那些允许你做的更安全”......而且我从来没有遇到过那种灾难性的并发问题......在3年内PHP开发)


无论如何:玩得开心!

答案 1 :(得分:1)

我很想修改一个现有的缓存。 Zend Framework的缓存应该能够做到这一点。如果没有,我会改变它。

您可以创建一个非常原始的锁定策略。该数据库可用于跟踪所有缓存的项目,允许锁定更新,允许人们等待其他人的更新完成,...

这将处理您的ACID问题。您可以将其他人的更新锁定设置为非常短的时间段,或者可能只是为了该往返而完全跳过缓存,具体取决于您的服务器负载/容量以及生成缓存内容的成本。

雅各

答案 2 :(得分:1)

并发资源创建即缓存砰击/线程竞争在繁忙的网站上可能是一个严重的问题。这就是为什么我创建了同步读/写进程/线程的缓存库。

它具有优雅和清晰的结构:接口 - &gt;适配器 - &gt;容易扩展的类。在github页面我详细解释了砰击的问题以及图书馆如何解决它。

在此处查看: https://github.com/tztztztz/php-no-slam-cache

答案 3 :(得分:0)

  1. 在Linux下,通常,文件将保持“打开”以进行读取,即使它被“删除”,直到进程关闭文件。这是系统中内置的东西,有时会导致磁盘使用大小的巨大差异(删除3G文件时仍然“打开”意味着仍然在磁盘上分配,直到进程关闭它) - 我'我不确定在linux下是否也是如此。
  2. 假设有一个日志文件系统(大多数Linux文件系统和NTFS) - 那么在该进程关闭文件之前,不应将该文件视为“已创建”。这应该显示为不存在的文件!

答案 4 :(得分:0)

  

假设一个日志文件系统(大多数Linux文件系统和NTFS) -   然后在该过程之前不应将该文件视为“已创建”   关闭文件。这应该显示为不存在的文件!

不,它一旦被创建就可见,你必须锁定它。 重命名是原子的。所以你可以打开(),写(),关闭(),重命名(),但这不会阻止同时重新创建两次相同的缓存项。

  

已删除缓存文件,因为它已过时。   对该文件的请求进入,文件正在重新创建。在此期间,另一个文件请求就出现了。

如果未锁定,将提供半完成文件,或者两个进程将尝试同时重新生成同一文件,从而产生“有趣”的结果。

答案 5 :(得分:0)

您可以在数据库中缓存页面,只需创建一个简单的“名称,值”表并在其上存储缓存页面。