我有一个提供HTML代码的服务,在某些时候它不再被更新。 代码总是从数据库中dynamic地生成,有1000万个条目,因此每个HTML代码页面呈现在那里search60或70个条目,然后呈现页面。
所以,对于那些过期的页面,我想使用caching系统,这将是非常简单的(就像input一个带有HTML呈现的logging和(如果我需要的话)删除它)。
我试图做到基于文件,但寻找一个文件的存在,然后通过PHP传递给它实际上,它似乎太多,我想要做什么。
我正在考虑在一个带有MEDIUMBLOB的表上使用mysql(每页大约100k)。 它将保存大约150000个这样的logging(至less现在是这样)。
我的问题是:让mysql执行文件查找和传递到php还是基于文件的方法更快?
基于文件的版本的查找代码如下所示:
$page = @file_get_contents(getCacheFilename($pageId)); if($page!=NULL) { echo $page; } else { renderAndCachePage($pageId); }
它会查找是否find该文件。
MySQL表只会有一个ID(页面ID)和BLOB条目。
该系统的磁盘是一个简单的SATA RAID 1,MySQL守护进程可以获取高达2.5GB的内存(我也有一个代理运行,吃剩下的16GB的机器。)
一般来说磁盘已经很忙了。
我没有使用PEARcaching,是因为我认为(请随时纠正我)这增加了开销,我不需要,因为页面渲染代码被称为每天大约2M次,我不想通过整体代码每次(是的,我也有eacceleratorcaching代码)。
任何指向我应该去哪个方向的指针,将是非常受欢迎的。
谢谢!
我会推荐在你的特定情况下使用memcached,但这是因为你有一些备用GB的RAM。
在某些时候它不再被更新
这真的是关键 – 你如何确定一个特定的文件被认为是冻结的? 如果你不知道,那么一个简单的方法就是根据上次修改的时间来设置caching时间,例如
$minquiet=86400; // 1 day $scale=1; $ago=filemtime($file); $cache=(time()-$ago - $minquiet)/$scale; if ($cache<0) $cache=0; header("Cache-control: max-age=$cache; must-revalidate");
MySQL数据库或文件系统是否更快的问题是一个更复杂的问题。
哪个文件系统?
目录层次结构中的文件还是全部相同的目录? 如果是后者,他们都可以在一个方向吗?
如果完全绕过PHP,你肯定会获得更好的性能 – 但是这是以path中的数据为前提的,这些数据可以通过parsing来确定caching性。
$page = @file_get_contents(getCacheFilename($pageId));
OMG – 这将会给你带来糟糕的performance。 至less将其更改为stat()+ readfile()。
$page = @file_get_contents(getCacheFilename($pageId)); if($page!=NULL) {
这是否意味着根据是否存在或不存在,确定te页是否可caching? 如果是这样,那么交换这个URL,使其指向文件的位置,然后在404处理程序中实现PHP代码。