Php APC、磁盘命中率和需要/包括

Php APC、磁盘命中率和需要/包括,php,apc,Php,Apc,这个问题很简单,但我不能确定。PHP如何处理APC已经缓存的文件的requires/includes?我的理解是,这个缓存主要节省了编译已经缓存的文件的PHP,但我不清楚它是否也节省了查找/获取文件所需的磁盘开销;那么,是吗?或者PHP会攻击磁盘,即使操作码已经被缓存,唯一的区别是它不会再次执行编译过程 我想requires/includes神奇地知道一个文件是缓存的,因此直接从内存中获取它,这要归功于APC,但我刚刚意识到我没有理由假设这是事实,因此我问你为什么。我想你关于这个主题的问题在AP

这个问题很简单,但我不能确定。PHP如何处理APC已经缓存的文件的requires/includes?我的理解是,这个缓存主要节省了编译已经缓存的文件的PHP,但我不清楚它是否也节省了查找/获取文件所需的磁盘开销;那么,是吗?或者PHP会攻击磁盘,即使操作码已经被缓存,唯一的区别是它不会再次执行编译过程


我想requires/includes神奇地知道一个文件是缓存的,因此直接从内存中获取它,这要归功于APC,但我刚刚意识到我没有理由假设这是事实,因此我问你为什么。

我想你关于这个主题的问题在APC手册中已经解释过了,但它是隐藏的。你必须读这个部分才能找到它。特别是查看说明以下内容的配置选项:

。。。这默认为on,强制APC在on上统计(检查)脚本 每个请求都要确定它是否已被修改。如果是 修改后将重新编译并缓存新版本。如果此设置 关闭时,APC将不检查

对于包含/必需的文件,此选项也适用,但请注意 对于相对路径包括(任何不以/on开头的路径 Unix)APC必须进行检查才能唯一标识文件。如果你 使用绝对路径包括APC可以跳过状态并使用该绝对路径 路径作为文件的唯一标识符


因此,看起来APC缓存所需/包含的文件的方式与原始脚本大致相同,如果您按文件的绝对路径包含/需要文件。如果您使用的是相对路径(许多人都这样做),则需要点击磁盘才能找到完整的文件名。

APC覆盖zend引擎中的zend_compile_file函数,该函数负责定位和打开实际文件;由于这一点,如果文件已经被缓存,它能够在磁盘命中发生之前“劫持”磁盘命中

因此,是的,如果缓存,则从内存提供文件


来源:Zend引擎源代码,特别是

事实上,APC确实为*once变体(包括_once,需要_once)打开系统调用。 您可以使用strace轻松检查这一点

这是因为*once的代码稍有不同,称zend_stream_为open 调用compile_filename(由apc覆盖)之前:

bug追踪器中也存在一个未解决的问题:

我所能读到的这个设置告诉APC是否在文件中查找更改以重建操作码缓存,但操作码缓存是一回事,include/require进行的初始文件查找是另一回事;这不一定要有关联,也不说明是否有关联。也就是说,如果APC.stat设置为off,APC可能不会检查磁盘上的更改,但是否需要/包括跳过文件查找过程并从内存中提取?我还不清楚。@Mahn:只要它们被缓存,它就会从内存中提取它们