繁体   English   中英

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

[英]Page cache in PHP that handles concurrency?

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

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

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

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

谢谢!

PS应自动处理的事项示例:

  1. Apache / PHP缓存正在读取缓存文件。 缓存的文件已过时并尝试删除。
  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开发中)


无论如何:玩得开心!

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

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

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

雅各

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM