同时扩展和嵌入

在你的应用中运行php代码固然不错, 但是此刻, php执行环境仍然和你的主应用是隔离的, 它们并没有在真正意义上的一个层级进行交互.

现在你应该对php扩展的开发以及构建启用方面比较熟悉了. 你也已经有完成了嵌入 工作的例程, 这样就省去了这份工作. 将扩展代码植入到嵌入式应用中的工作量要比标准扩展小. 下面是⼀个新的嵌入式项目:

  1. #include <sapi/embed/php_embed.h>
  2. #ifdef ZTS
  3. void ***tsrm_ls;
  4. #endif
  5. /* Extension bits */
  6. zend_module_entry php_mymod_module_entry = {
  7. STANDARD_MODULE_HEADER,
  8. "mymod", /* extension name */
  9. NULL, /* function entries */
  10. NULL, /* MINIT */
  11. NULL, /* MSHUTDOWN */
  12. NULL, /* RINIT */
  13. NULL, /* RSHUTDOWN */
  14. NULL, /* MINFO */
  15. "1.0", /* version */
  16. STANDARD_MODULE_PROPERTIES
  17. };
  18. /* Embedded bits */
  19. static void startup_php(void)
  20. {
  21. int argc = 1;
  22. char *argv[2] = { "embed5", NULL };
  23. php_embed_init(argc, argv PTSRMLS_CC);
  24. zend_startup_module(&php_mymod_module_entry);
  25. }
  26. static void execute_php(char *filename)
  27. {
  28. zend_first_try {
  29. char *include_script;
  30. spprintf(&include_script, 0, "include '%s'", filename);
  31. zend_eval_string(include_script, NULL, filename TSRMLS_CC);
  32. efree(include_script);
  33. } zend_end_try();
  34. ]
  35. int main(int argc, char *argv[])
  36. {
  37. if (argc <= 1) {
  38. printf("Usage: embed4 scriptfile";);
  39. return -1;
  40. }
  41. startup_php();
  42. execute_php(argv[1]);
  43. php_embed_shutdown(TSRMLS_CC);
  44.  return 0;
  45. }

现在, 你可以定义function_entry向量, 启动/终止函数, 定义类, 以及所有你想增加的东 西. 现在, 它和你使用用户空间的dl()命令加载这个扩展库一样, 在这⼀个命令中Zend将自 动的处理所有的钩子并对你的模块进行注册, 就绪等待使用.(译注: startup_php()中调用 zend_startup_module(&php_mymod_module_entry)进行了模块注册)