Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在读取过程中,PHP解释器是否会将每个命令编译成字节码?_Php_Php Internals - Fatal编程技术网

在读取过程中,PHP解释器是否会将每个命令编译成字节码?

在读取过程中,PHP解释器是否会将每个命令编译成字节码?,php,php-internals,Php,Php Internals,请您澄清一下,PHP解释器将每个命令编译成字节码,然后执行,或者它首先读取所有命令,然后编译并执行它们 简单的回答是,PHP需要解析整个文件,以便干净地执行它,而不会出现语法错误 操作码缓存(如果作为Zend扩展名安装)可以通过替换原始函数来缓存操作码,从而编译文件并仅在必要时执行 如果您想了解整个故事,请从第675行开始探索 这是因为如果一个脚本有语法错误,并且已经执行了一半,那么就不可能撤销它可能造成的任何损害(例如,不可能撤销网络通信) 尽管它是基于每个文件(不是全部或没有)的原因是为了优

请您澄清一下,PHP解释器将每个命令编译成字节码,然后执行,或者它首先读取所有命令,然后编译并执行它们

简单的回答是,PHP需要解析整个文件,以便干净地执行它,而不会出现语法错误

操作码缓存(如果作为Zend扩展名安装)可以通过替换原始函数来缓存操作码,从而编译文件并仅在必要时执行

如果您想了解整个故事,请从第675行开始探索

这是因为如果一个脚本有语法错误,并且已经执行了一半,那么就不可能撤销它可能造成的任何损害(例如,不可能撤销网络通信)


尽管它是基于每个文件(不是全部或没有)的原因是为了优化,因为include和requires可以是有条件的,更不用说自动加载了。

第二种情况是这样的,但是基于每个文件。字节码不能用直观的方法编译(如声明和理解的变量等)。编译代码的唯一方法是以编写代码的方式,然后尝试在编写代码时使用输入和进程执行代码,从头到尾都是以编写逻辑流的方式执行。如果使用操作码缓存,则每个文件只执行一次(除非您实际更改该文件并强制刷新操作码缓存)-请参阅