我正在使用共享主机,但无法启用 APC。有一个关于此问题的帖子这里,唯一建议的理由是出于安全考虑(php-cgi vs mod_php)。我询问了主机,他们说这是由于性能原因,具体来说,I/O 会导致机器宕机。我不太明白这一点——使用共享内存操作码缓存肯定会有较少的I/O?基本上,如果我正在建立一个共享托管公司(我做不到!)我会认为使用缓存(如果安全性允许)来提高所有客户端的性能会非常有意义。
有人能帮我解释一下吗?TIA
答案1
我想说,共享主机方案中的 APC 通常不是一个好主意。
您的主机的答案是正确的,但这不是唯一的原因。
当您获得共享主机时,您应该意识到您并不是唯一使用托管您网站的服务器的人。根据托管公司的服务器,可能有 300 个(或更多)客户也在该机器上托管他们的网站。
这些网站通常有许多 php 文件。例如Joomla 1.6驱动的网站有大约 3000 个 php (~10mb) 文件(包括网站和管理面板)。想象一下,所有这 300 个客户都在使用 Joomla 平台,而这些网站
- 经常光顾
- 生成平均服务器负载
这意味着所有这些客户端最终将有 ~900000 个文件需要缓存 - ~3000mb RAM 将仅用于缓存 php 文件。如您所知,在 APC 中,您还可以存储“用户缓存条目”,您通常可以在其中存储设置或序列化对象。我无法说那里会有多少 RAM,因为这取决于您存储的内容,但我们假设还有额外的 50-100mb。
目前我们已经使用了大约 3.1GB 的 RAM。
现在添加运行基本服务(Apache、FTP、PHP、MySQL、PostgreSQL、SendMail 和服务器备份工具)所需的一些 RAM。您最终可能会得到大约 5-6GB 的 RAM,这些 RAM 几乎会一直被使用。
APC 的其他问题出现在您缓存时 - 每个人都可以看到您缓存的内容(据我所知)。因此,您可能需要加密存储的内容 - 这将需要更多 CPU,因为您将一直加密/解密。此外,如果有人意外清除了所有缓存的文件/用户条目,服务器将疯狂地尝试重新缓存。
底线是,没有系统管理员会费尽心机启用和支持 APC。这对公司来说也不是什么好处。他们宁愿让 300 多个客户付钱给他们,也不愿与 APC 打交道,担心他们的服务器会不会随时宕机或出问题。
更好的解决方案是,如果客户获得一台(托管)专用服务器。这样,客户将成为该服务器上唯一托管网站的人,他可以要求支持人员在服务器上安装他想要的任何内容。这将更加容易,并可让客户、系统管理员和托管公司免于长白头发 :)
我希望这能帮助您更好地理解为什么 APC 不包含在共享主机中。
答案2
每: http://www.php.net/manual/en/apc.configuration.php#ini.apc.mmap-file-mask
apc.mmap_file_mask 字符串
如果使用 MMAP 支持进行编译 --启用 mmap这是传递给 mmap 模块的 mktemp 样式 file_mask,用于确定 mmap 的内存区域是文件支持的还是共享内存支持的。对于直接文件支持的 mmap,请将其设置为类似/tmp/apc.XXXXXX(正好 6Xs)。要使用 POSIX 样式的 shm_open/mmap,请将共享内存在你的面具某处。例如 /apc.shm.XXXXXX您还可以将其设置为/dev/零使用你的内核的 /dev/零匿名 mmap 内存的接口。不定义该接口将强制执行匿名 mmap。
如果使用文件支持,这肯定会增加您的 IO,具体取决于进入服务器的流量。
答案3
除非您有足够的内存来将每个 PHP 文件加载到内存中,否则这会降低任何共享主机的性能。当一大群用户试图缓存可能不常被访问的文件时,服务器将开始交换,这将降低该机器上所有设备的性能。
答案4
@tftd 说明了在共享主机中不启用 APC、Memcached 等的主要原因。但是,如果您的共享服务器实际上并非共享,而仅供您自己的项目使用(或 Web 设计/开发客户,并且如果您不向他们提供 FTP/面板访问权限),则可能会出现一种用例,那么该服务器仍然可以从 APC/Memcached/等中受益。
无论如何,我认为 I/O 问题取决于 APC 可用的 RAM,因为如果可用 RAM 较低或站点/PHP 文件数量非常多(共享主机中常见情况),它会不断尝试使某些条目无效并缓存新条目。如果有足够的 RAM 并且您密切关注 apc.php(APC 的信息页面),这应该不是问题。
除此之外,APC 的好处在中等/高流量站点中体现得最为明显,因为很少访问的 PHP 文件的缓存并不重要。