PHP 嵌入式 SAPI
php构建了一个层级系统. 最高层是提供用户空间函数和类库的所有扩 展. 同时, 其下是服务API(SAPI)层, 它扮演了webserver(比如apache, iis以及命令行接口 cli)的接口.在这许多sapi实现中有一个特殊的sapi就是嵌入式sapi.
当这个sapi实现被构建时, 将 会创建一个包含所有你已知的php和zend api函数以及变量的库对象, 这个库对象还包含一些额外的帮助函数和宏, 用以简化外部程序的调用.
嵌入式应用开发
1.编译嵌入式PHP动态链接库
./configure --enable-embed --with-config-file-scan-dir=/etc/php.d --with-mysql --with-config-file-path=/etc/
./make
./make install
然后链接库会复制到 /usr/local/lib/libphp5.so
2.编写宿主应用
c示例代码:php-embed.c
#include <sapi/embed/php_embed.h>
int main(int argc, char *argv[])
{
PHP_EMBED_START_BLOCK(argc,argv)
char* script = (char*)"var_dump(['a'=>'hello', 'b'=>',', 'c'=>'world']);";
zend_eval_string(script, NULL,(char*)"Simple Hello World App" TSRMLS_CC);
PHP_EMBED_END_BLOCK()
return 0;
}
更多ZEND_API
3.构建宿主应用
编写简单Makefile
文件(注意这里缩进用tab
而不是空格)
CC = gcc
PHP_INCLUDE_PATH = /root/php-sdk
CFLAGS = -c
-I $(PHP_INCLUDE_PATH)/
-I $(PHP_INCLUDE_PATH)/main/
-I $(PHP_INCLUDE_PATH)/Zend/
-I $(PHP_INCLUDE_PATH)/TSRM/
-Wall -g
LDFLAGS = -lstdc++ -L/usr/local/lib -lphp5
LDFLAGS += -Wl,--rpath /usr/local/lib
all: php-embed.c
$(CC) -o php-embed.o php-embed.c $(CFLAGS)
$(CC) -o php-embed php-embed.o $(LDFLAGS)
然后make
, 运行./php-embed
就可以看到
array(3) {
["a"]=>
string(5) "hello"
["b"]=>
string(1) ","
["c"]=>
string(5) "world"
}