很简单的问题,但我不能告诉实际上肯定。 如何PHP的行为与要求/包括已通过APC已经被缓存的文件? 我的理解是,这主要缓存保存在编译已被缓存的文件的PHP,但它不是很清楚,我是否也节省了磁盘命中必须找到/读取该文件藏汉; 所以,不是吗? 或将PHP打盘,即使操作码已经被缓存,唯一的区别是,它不会再这样做编译过程?
我想认为需要/包括神奇地知道一个文件被缓存,从而直接从内存得益于APC取水的时候,但我意识到我没有理由认为这是情况,因此为什么我问。
很简单的问题,但我不能告诉实际上肯定。 如何PHP的行为与要求/包括已通过APC已经被缓存的文件? 我的理解是,这主要缓存保存在编译已被缓存的文件的PHP,但它不是很清楚,我是否也节省了磁盘命中必须找到/读取该文件藏汉; 所以,不是吗? 或将PHP打盘,即使操作码已经被缓存,唯一的区别是,它不会再这样做编译过程?
我想认为需要/包括神奇地知道一个文件被缓存,从而直接从内存得益于APC取水的时候,但我意识到我没有理由认为这是情况,因此为什么我问。
我认为,如果你对这个话题的APC手册解释,但它是那种隐藏。 你必须阅读的配置部分找到它。 特别是检查出apc.stat其中指出该配置选项:
...默认为上,迫使APC以STAT(检查)的剧本上的每个请求,以确定它是否已被修改。 如果已经修改了它会重新编译和缓存的新版本。 如果此设置是关闭的,APC将不检查
...
对于随附/必需的文件此选项也适用,但请注意,相对路径包括(不带启动/ Unix上的任何路径),APC是为了唯一标识要检查的文件。 如果使用绝对路径,包括APC可以跳过STAT和使用绝对路径作为文件的唯一标识。
因此,它看起来很像是缓存需要APC /包括文件的方式为原始的剧本一样, 如果包括通过对文件的绝对路径/需要 。 如果您使用的是相对路径(其中有许多这样做),它会需要磁盘命中,找出完整的文件名。
事实上,APC 确实 OPEN系统调用的*一旦变种(include_once,require_once)。 您可以检查此轻松使用strace的。
这是因为该代码*曾经是略低不同,调用compile_filename(这是由APC覆盖)之前调用zend_stream_open:
https://github.com/php/php-src/blob/master/Zend/zend_execute.h
有在bug跟踪一个开放的问题太: https://bugs.php.net/bug.php?id=59372
APC覆盖在Zend引擎,其中除其他事项外,负责定位和开放的实际文件的功能zend_compile_file; 由于这一点,能够防患于未然,如果该文件已经被缓存到“劫持”磁盘命中。
所以,是的,文件从存储服务,如果缓存。
来源: APC技术说明和Zend引擎源代码,具体地zend_language_scanner.c