Fork me on GitHub

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"
}

标签: php, sapi

添加新评论