2009-11-06 86 views
1

我想创建一个缓存系统,将跳过一些机制,以提高性能。PHP - Memcache - HTML缓存

我有一些例子:

1)我有一个是每隔一小时更新的动态PHP页面。每个用户的页面内容都是相同的。所以在这种情况下,我可以:

a)创建一个HTML页面,并且该页面可以每小时生成一次。在这种情况下,我想绕过PHP,所以应该有一个静态页面,如果数据库更新,将生成一个新的HTML文件。我怎样才能做到这一点?我可以创建一个生成HTML文件的crontab脚本,但它看起来并不是一个很好的方法。 b)将输出缓存在内存中,以便网络服务器每隔一小时更新一次内容。我想我需要一个Web服务器的内存缓存模块。有一个用于lighttpd的非官方memcache模块,但它看起来并不稳定,我也听说过nginx的memcache模块,但不知道这是否可能。这种方式看起来更加优雅和可能,但是如何呢?有任何想法吗? (再次,我想绕过PHP在这种情况下)

另一个例子是,我有一个动态的PHP页面,每小时更新,在该页面中只有用户的详细信息部分是完全动态的(因此用户登录或看看他/她在该部分的状态)

同样,我该如何为这个页面创建一个缓存系统?我认为,如果我能找到第一个例子的解决方案,那么我可以在该部分中使用AJAX和相同的解决方案。我对么?

编辑:我猜,我无法说清楚。我想完全绕过PHP。 PHP脚本将每小时运行一次,之后不会进行PHP调用。我想删除它的开销。

由于提前,

回答

1

请使用静态HTML。每小时只需用输出更新一个静态HTML文件。您需要每小时使用cron运行PHP脚本到fopen()fwrite()到文件。没有必要打PHP来检索任何页面。只需为该特定页面制作一个.htaccess mod_rewrite重定向规则即可维护当前的URL命名。

虽然不是很优雅,静态HTMLgzip压缩对我来说是更有效,并会使用更少的带宽

使用cron来每小时运行PHP脚本的例子:

输入这些值:

01 * * * * php -f /path/to/staticHtmlCreater.php > /dev/null 

的最后部分,确保你不会有任何输出。这个cron会在每小时的第一分钟运行。

UPDATE

无论我错过了关于您的动态用户配置文件信息的部分,或者是我最初的评论后加入。如果你只使用单个服务器,我建议你切换到APC,它提供了比memcached更快的操作码缓存和缓存机制(对于单个服务器应用程序)。如果用户的配置文件数据是低于(位于用户的窗口视图下方),您可能会等待发出AJAX请求,直到用户向下滚动到指定的点。您可以在Facebook状态页面上看到此功能。

+0

这没有解决第二个例子;使用AJAX的建议通过混合PHP(此时不可避免)的“开销”(我的上帝,几毫秒被废弃,人们!)与第二个由JavaScript驱动的请求混淆起来,这会导致更多的开销被带入等式。让PHP解析一个静态文件可能会很好,但是来自某种内存缓存设备的PHP会更好。而且任何你可以在一个请求中做的事情可能比启动AJAX更好;即使一个iFrame会更好 - 这不是AJAX应该是的。 – Dereleased 2009-11-06 22:26:14

+0

是的,你对AJAX是正确的,但至少该页面将呈现非常快,用户细节部分在这一点上并不重要。它可以在1秒后。 谢谢, – murat 2009-11-07 03:35:20

0

如果这仅仅是一个单一的Web服务器,则可以只使用PHP的APC模块来缓存页面的内容。它并不是真正设计来缓存整个页面,但它应该在一个捏。

编辑:我忘了提及APC尚未与PHP一起发货,但可以从PECL安装。它将作为PHP 6的一部分发货。

+0

这个或memcached,只是PHP检索你需要的任何值。另外,除非需要全部性感和动态,否则可能不需要将AJAX带入用户数据的图片中;实际上,PHP对字符串来说非常好,所以只需加载页面的静态部分并打包用户特定的数据应该很容易。 – Dereleased 2009-11-06 17:36:50

+0

感谢您的迅速回复。我已经在使用memcached操作码缓存系统xcache。我喜欢它们,但我真的不使用PHP一个小时,数据每小时更新一次。所以如果可能的话,我想完全绕过PHP。它将每小时运行一次。 – murat 2009-11-06 17:37:40

0

一个很好的方法是将静态内容存储在文件中。事情应该这样工作:

  • 你的PHP脚本被称为
  • 如果你的内容的文件已经1个多小时前修改(宽度filemtime($ yourFile))
    • 重新生成内容+它在文件中存储+发送回客户端
  • 其他
    • 发送的文件内容是(与文件($ yourFile),或回声的file_get_contents($ yourFile)

在每一个情况下,即使在重负载下的伟大工程。

+0

,除非该文件特别大,此时'fpassthru'会好很多。请参阅http://us.php.net/manual/en/function.fpassthru.php – Dereleased 2009-11-06 17:42:30

+0

谢谢,但我想完全绕过PHP。我不想使用PHP并删除其开销。那就是问题所在。 – murat 2009-11-06 17:47:43

+0

然后,一个crontab是要走的路,例如每小时调用一次将生成HTML文件的脚本。 – Nicolas 2009-11-06 20:59:32