__halt_compiler之后的代码执行

Aby*_*yss 5 php symfony

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

Álv*_*lez 6

我想你的意思是https://symfony.com/installer,这是一个像这样开始的PHAR档案:

#!/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(); ?>
Run Code Online (Sandbox Code Playgroud)

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

  • 一个存根,这是短期的PHP脚本就可以看到.

  • 带有存档争用描述的清单

  • 包含内容本身的存档

  • 可选的签名

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

php foo.phar
Run Code Online (Sandbox Code Playgroud)

此脚本块以__HALT_COMPILER()结尾; 至::

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

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

这个脚本做了三件事:

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