【发布时间】:2013-12-04 03:40:57
【问题描述】:
我已经在我的服务器上启用了 OPcache。它是一个服务于 ±30 个网站的共享托管服务器。有 2 个使用 Symfony2 的高流量网站。
OPcache 是否足够智能,可以缓存到大多数高流量网站,而不用其他不那么重要的网站填充其缓存?
还是先到先得?
【问题讨论】:
我已经在我的服务器上启用了 OPcache。它是一个服务于 ±30 个网站的共享托管服务器。有 2 个使用 Symfony2 的高流量网站。
OPcache 是否足够智能,可以缓存到大多数高流量网站,而不用其他不那么重要的网站填充其缓存?
还是先到先得?
【问题讨论】:
不幸的是,几乎没有关于操作码缓存如何工作的像样的文档,但希望这将很快进入 PHP 主流。与此同时,我已经完成了这篇文章,应该会有所帮助:The Zend Engine and opcode caching。请注意,这是在我自己的实验分支的 wiki 中,但此页面是纯 OPcache。
就共享托管基础架构模板而言,操作码缓存通常无法很好地提供这些服务,这有多种原因:
大多数缓存(OPcache、APC、Xcache、...)使用共享内存缓存,当您将 R/W SMA 映射到进程空间时,实际上您将授予对 的完全 R/W 访问权限任何可以映射到它的进程。这意味着它们必须共享相同的安全域。这对于主机提供商通常希望在单独的虚拟主机之间强制执行基于 UID 的分离的共享主机来说是非常有问题的。
主流缓存都没有提供替代(即非 SMA)技术。我的 MLC OPcache 演示器在 OPcache 上使用了基于文件的层,这为共享主机提供了本地 OPcache 的大约 80% 的性能改进,但我这个分支的目的不是为了与核心扩展相反,而是为了降低这些技术的风险,以至于 PHP 在某些时候会将它们作为标准提供。
我发现 PHP 开发人员几乎没有兴趣改进共享托管 SAPI。这种观点似乎被这样一种观点所主导,即如果应用托管商对性能感兴趣,那么他们应该简单地为自己获取一个 VM 并在其中运行一个专用的 LAMP 堆栈。
但是,如果您在 Apache 下运行 mod_php5,那么启用 OPcache 很简单,并且对于大多数复杂的应用程序,例如 MediaWiki、Drupal 和基于框架的应用程序,通常可以将吞吐量提高约 2 倍( Symphony2,蛋糕,...)
对于 ~10+ vhost 最佳点,可以设置持久 GCI / FastGCI 模板(fpm 等)以使用具有每个 UID SMA 的 OPcache。虽然配置可能很困难。
很抱歉,您的回答很笼统,但您问了一个笼统的问题,没有更具体的细节,我无法给出更具体的答案。
【讨论】:
opcache.restrict_api 将 OPcache API 的使用限制在此目录中。报告 API 中还有一些功能漏洞,我试图在 5.6 版本中修复。