这是8篇文章中的第6篇文章,详细介绍了部署到ZendServer的技巧。该系列的上一篇文章详细介绍了设置作业脚本状态代码。
今天,我将分享一些关于设置页面缓存的技巧,以及清除ZendServer页面缓存的工作。
技巧6:页面缓存
ZendServer提供页面缓存。这可以按应用程序或全局定义。我通常使用全局规则,因为我最常定义服务器别名;特定于应用程序的规则仅基于主服务器名称,这使得无法缓存每个主机名。
我首先通过使用正则表达式设置规则来定义规则。例如,对于我当前的站点,我为主机准备了这个:
(www\.)?mwop.net
这允许我在有或没有www.
前缀的情况下进行匹配。
之后,我为路径定义正则表达式,并确保匹配考虑到REQUEST_URI
(如果不这样做,任何匹配正则表达式的页面都会缓存相同的页面!)。
当我部署或运行特定作业时,我通常想要清除缓存。为此,我有一个作业队列作业,在该脚本中,我使用了page_cache_remove_cached_contents()
由ZendServer中的页面缓存扩展定义的函数。
这个函数接受一个参数。文档说它是一个URL,但实际上你需要提供你想要匹配的规则中的模式;然后它将清除与该规则匹配的任何页面的缓存。这意味着您必须提供完整的匹配项——包括方案、主机、端口和路径。请注意端口—绝对必须存在才能使匹配工作,即使它是给定方案的默认端口也是如此。
这意味着在我上面的示例中,page_cache_remove_cached_contents()
的参数变为http://(www\\.)?mwop\\.net:80/resume。如果我同时允许HTTP和HTTPS访问,那么我还需要明确清除
https://(www\\.)?mwop\\.net:443/resume
。请注意,存在正则表达式转义字符,任何条件模式也是如此。
我当前的缓存清除脚本如下所示:
chdir(__DIR__ . '/../../'); if (! ZendJobQueue::getCurrentJobId()) { header('HTTP/1.1 403 Forbidden'); exit(1); } $paths = [ '/', '/resume', ]; foreach ($paths as $path) { page_cache_remove_cached_contents( 'http://(www\.)?mwop\.net:80' . $path ); } ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK); exit(0);
如果我想更细化,我可以更改脚本以接受规则和URL,以通过JobQueue提供的参数清除;有关传递参数的信息,请参阅作业队列文档。
我将此脚本放入我的post_activate.php
部署脚本中,但没有安排:
$queue->createHttpJob($server . '/jobs/clear-cache.php', [], [ 'name' => 'clear-cache', 'persistent' => false, ]);
这将安排它在激活完成后立即运行。如果他们所做的应该导致刷新页面缓存,我也会将它从其他作业中排队;我这样做时使用完全相同的代码。
缓存清理注意事项
ZendServerPHPAPI提供了另一个看起来更相关和更具体的函数:page_cache_remove_cached_contents_by_uri()
。此特定函数接受规则名称和您希望清除的URI,并且如文档所述,这似乎是一种将特定URI的缓存清除为规则子集的好方法,而无需清除与规则匹配的所有页面的缓存。但是,从7.0版开始,此功能无法正常工作(事实上,我无法找到任何导致缓存清除的规则和URL组合)。我建议暂时只使用page_cache_remove_cached_contents()
,或者在您的框架内使用整页缓存。
下次……
本系列的下一个技巧将讨论使用ZendServerSDK从命令行部署您的应用程序。
系列其他文章
- 技巧1:zf-deploy
- 技巧2:重复作业
- 技巧3:chmod
- 技巧4:保护作业脚本
- 技巧5:设置作业状态
- 技巧7:zs-client
- 技巧8:自动化