Embed

C++程序中可以内嵌一个ZendVM,实现与PHP程序的交互。需要依赖PHP官方的embed模块。编译PHP时需要增加—enable-embed参数。

编写程序

  1. #include "phpx_embed.h"
  2. #include <iostream>
  3. using namespace php;
  4. using namespace std;
  5. int main(int argc, char * argv[])
  6. {
  7. VM vm(argc, argv);
  8. vm.eval("echo 'Hello World!';");
  9. vm.include("embed.php");
  10. auto a = constant("SWOOLE_BASE");
  11. cout << "SWOOLE_BASE = " << a.toInt() << endl;
  12. auto obj = newObject("Test");
  13. auto ret = obj.call("getName");
  14. cout << ret.toString() << endl;
  15. obj.set("name", "Tianfeng");
  16. auto ret2 = obj.call("getName");
  17. cout << ret2.toString() << endl;
  18. return 0;
  19. }
  • VM类就是ZendVM虚拟机环境,构造方法中自动初始化VM。由于ZendVM使用了大量全局变量,一个进程内只能创建一个VM
  • VM对象析构时自动销毁ZendVM
  • vm对象有2个APIeval方法可以执行任意的PHP代码,include方法用于加载一个PHP脚本并执行
  • VM初始化后,可以在C++程序中调用PHP-X中提供的接口与PHP进行交互

编译程序

  1. PHP_INCLUDE = `php-config --includes`
  2. PHP_LIBS = `php-config --libs`
  3. PHP_LDFLAGS = `php-config --ldflags`
  4. all: embed.cpp
  5. c++ -DHAVE_CONFIG_H -g -o embed -O0 embed.cpp -std=c++11 ${PHP_INCLUDE} ${PHP_LDFLAGS} -lphp7 -lphpx ${PHP_LIBS}
  • -lphp7载入PHP7的动态连接库
  • -lphpx载入PHP-X动态连接库