2009-08-04 75 views
6

我读过以前的关于PHP缓存的解答,以及他们链接到的文章。我已经检查了经常推荐的Pear Cache_Light,QuickCache和WordPress超级缓存。 (对不起 - 我被允许超链接一次。)PHP中处理并发性的页面缓存?

要么没有处理并发问题,要么没有明确地声明他们在他们的文档中做。

任何人都可以指向处理并发性的PHP页面缓存的方向吗?

这是在一个共享的主机上,所以memcache和操作码缓存不幸是不可选的。我不使用模板引擎,并且希望避免依赖某个引擎。 WP超级缓存的方法是可取的 - 即将静态文件存储在wwwroot下让Apache为其提供服务 - 但这不是必需条件。

谢谢!

P.S.应该自动处理的东西的示例:

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

回答

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

编辑感谢,这是资料。 “会发生什么?” P.S.中的问题只是修辞。我已经更新了这个问题来反映这一点。 Ack! – WalterGR 2009-08-04 09:47:37

+0

Ack!我忘了我在问题标题中写下了“实施/发现”。我删除了“实施”。如果谈到这一点,我会打开另一个问题。再次感谢。 – WalterGR 2009-08-04 09:51:23

0

假设一个日志文件系统(大多数Linux文件系统和NTFS) - 那么该文件不应被理解为“创造”,直到处理 关闭的文件中看到。这应该显示为一个不存在的文件!

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

缓存文件被删除,因为它已被废弃。 该文件的请求进入,并且该文件正在重新创建过程中。在此期间,另一个文件请求进入。

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

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作为后端。

这一个似乎支持某种形式的安全性,以及 - 东西一样kinf是Cache_Lite已经给了你(所以我不会复制粘贴第二次)


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

无论如何,我可能不会搜索任何进一步什么那些拖框架建议:它已经可能足以满足您的应用需要更多的:-)

(我从来没有见过任何缓存mecanism “更安全”比那些允许你这样做......我从来没有碰到诸如此类的一些灾难性的并发问题尚未...在这3年PHP开发的)


总之:有好玩!

+0

Pear Cache_Light不处理所有的并发问题 - 例如,当文件被锁定写入时从缓存中读取。 (或者我应该说:并发性问题是针对应用程序代码的。)这对我来说是不可行的。你问,“......所以并发访问的风险可能不是那么高,是吗?”尽管访问次数明显呈现出较大的趋势(例如,在中午更多,周三更多),但从第二位到第二位的页面请求是随机的。并发性是所有网站的问题。 – WalterGR 2009-08-04 11:55:49

0

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

1

我会试图修改一个现有的缓存。Zend Framework的缓存应该能够做到这一点。如果不是,我会改变它。

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

这将处理您的ACID问题。您可以在很短的时间内为其他人的更新设置锁定,或者根据您的服务器负载/容量以及生成缓存内容的成本,可能只是在整个过程中跳过缓存。

雅各

1

并发资源创建又名缓存猛击/线程的比赛可以在繁忙的网站是一个严重问题。这就是为什么我创建了同步读/写进程/线程的缓存库。

它具有优雅和清晰的结构:接口 - >适配器 - >类,方便扩展。在github页面中,我将详细解释砰击问题以及图书馆如何解决问题。

检查在这里: https://github.com/tztztztz/php-no-slam-cache