__halt_compiler之后的代码执行

时间:2017-06-02 17:08:49

标签: php symfony

下一次在我的生活中,我会在函数__halt_compiler之后看到一些字节码。在这种情况下,它是symfony安装程序。怎么做 ?如何生成在__halt_compiler之后可执行的代码?

1 个答案:

答案 0 :(得分:6)

我想你的意思是https://symfony.com/installerPHAR存档就像这样开始:

#!/usr/bin/env php
<?php
/**
 * Generated by Box.
 *
 * @link https://github.com/herrera-io/php-box/
 */
if (class_exists('Phar')) {
Phar::mapPhar('default.phar');
require 'phar://' . __FILE__ . '/symfony';
}
__HALT_COMPILER(); ?>

从概念上讲,PHAR档案与自解压ZIP文件没有太大差别(实际上ZIP是支持的内部格式之一)。档案contains

  • A stub,这是您可以看到的简短PHP脚本。

  • 包含档案协定说明的清单

  • 包含内容的档案

  • 可选签名

顶部的存根是一个常规的PHP脚本,因此PHAR存档可以使用常规的PHP解释器运行,而不需要专用的可执行文件:

php foo.phar

此脚本块以__HALT_COMPILER();到::

结尾
  1. 防止文件的其余部分被解析并可能作为PHP代码执行(主脚本完成了初始阶段所需的所有操作)。

  2. 填充__COMPILER_HALT_OFFSET__常量,以便PHAR库可以轻松检测归档数据的开始位置。

  3. 这个脚本做了三件事:

    1. 检测计算机中是否有Phar库。
    2. 将当前文件加载为Phar存档,并使用内容说明注册清单。
    3. 执行存档中的symfony script,这是实际的安装程序代码。