Skip to content

SAPI interface details

Yun Dou edited this page Feb 6, 2021 · 5 revisions

SAPI名称

micro的SAPI名称应该是"micro",如果PHP代码进行了SAPI名称检查,可以通过定义宏(TODO:用make参数来指定)来将micro返回的SAPI名称变为"cli"

SAPI函数

注意:在micro主版本号1之前,以下函数的名称,签名等可能发生变化。

micro_version() : array

返回micro的版本号

参数

返回值

返回micro的版本号,格式为数组,其中数组前三个元素分别为版本号的主版本号、次版本号、修订版本号;如果micro目前有后缀,则数组第四个元素为版本号后缀,否则数组只有三个元素。

micro_get_sfx_filesize() : int

返回自身的sfx大小。

参数

返回值

返回自身的sfx头大小,单位为字节(byte)

micro_get_self_filename() : string

返回自身的文件名

参数

返回值

返回自身的文件名字符串,使用绝对路径。

micro_open_self() : ?resource

获取自身的没有去掉sfx头的只读文件勾柄。

参数

返回值

当成功时,返回打开的带sfx头的自身的文件勾柄;失败时返回FALSE

INI设置

注意:在micro主版本号1之前,下面用到的magic可能发生变化。

micro通过特殊的magic来标识INI文件头,通过INI文件头可以实现micro带INI启动。

一个带INI的micro自执行文件的结构:


|--------------------------|---------------------------------------------------------------------------|----------------------|
| micro.sfx ELF/PE header  |                            ini part                                       |    php/phar code     |
|                          |                    |                                |                     |                      |
| micro_get_sfx_filesize() |    4 byte magic    |     4 byte sizeof(ini text)    |   n byte ini text   |                      |
| returns sizeof this part | "\xfd\xf6\x69\xe6" | "\0\0\0\x10"(16 in big endian) | "ini_key=\"value\"" | "<?php things();..." |
|--------------------------|---------------------------------------------------------------------------|----------------------|
^ micro_open_self() will return stream start at here                                                   |
                     fopen functions will create stream start reading at here, code will run from here ^

ini文件头为

struct MICRO_INI_HEADER{
    uint32_t magic; // "\xfd\xf6\x69\xe6"
    uint32_t size; // in big-endian
}

例如:使用以下php代码来生成ini头:

$myini = "
ffi.enable=1
micro.php_binary=cafebabe
"
$f=fopen("myiniheader.bin", "wb");
fwrite($f, "\xfd\xf6\x69\xe6");
fwrite($f, pack("N", strlen($myini)));
fwrite($f, $myini);
fclose($f);

然后执行

Windows:

COPY /B micro.sfx + myiniheader.bin + myawesomeapp.phar myawesomeapp.exe

Unix:

cat micro.sfx myiniheader.bin myawesomeapp.phar > myawesomeapp
chmod 0755 myawesomeapp

来生成带INI设置的micro自执行文件

Clone this wiki locally