PHP 在处理新请求时是否每次都读取所需的脚本?
你能解释一下 PHP 执行哪些磁盘 IO 操作来处理单个请求吗
如果 PHP 是 Apache 模块或 PHP-fpm,会发生什么变化
PHP 在处理新请求时是否每次都读取所需的脚本?
你能解释一下 PHP 执行哪些磁盘 IO 操作来处理单个请求吗
如果 PHP 是 Apache 模块或 PHP-fpm,会发生什么变化
是的。
想象一下:
script_a.php
<?php
$foo = 'bar';
$bar = 'foo';
?>
script_b.php
<?php
require_once 'script_a.php';
echo $foo . ' ' . $bar;
?>
在运行时,script_b.php实际上将包含:
<?php
$foo = 'bar';
$bar = 'foo';
echo $foo . ' ' . $bar;
?>
因此,每次处理新请求时,它都会读取脚本(或多个脚本)。这就是中高负载服务器使用APC或eAccelerator等操作码缓存的原因。
它们所做的是将整个脚本(处理了需要/包含)缓存在内存中,因此不必处理它以对下一个请求进行字节码,而只需执行即可。这可以转化为显着的性能提升,因为没有磁盘 I/O 并且 Zend 引擎不必再次将脚本转换为字节码。
编辑:
如果 PHP 是 Apache 模块或 PHP-fpm,会发生什么变化
不,至少不是 PHP 处理包含/要求的方式。
希望这可以帮助。
执行 PHP 脚本时,将从硬盘驱动器中读取该脚本。最初执行的脚本包含的任何脚本也是如此。但是,如果您担心性能,可以使用某些缓存技术。
见这里: http: //php.net/manual/en/book.apc.php
PHP 会根据每个请求读取文件。您可以使用诸如 XCache 之类的操作码缓存器将操作码保存在内存中,因此不需要 PHP 实际读取文件(只需检查其修改时间)。FPM 和 apache 模块不影响任何东西