PHP扩展开发与实践

原创
2015/07/20 09:40
阅读数 150

PHP扩展开发与实践

  • C扩展原生开发
  • Zephir语言开发扩展

Hello World!示例

C 扩展原生开发

优点:性能,操作底层接口(内存),修改内核行为 缺点:对于不熟c语言,难上手,同时还需要阅读ZEND_API

参考文档:

PHP扩展开发及内核应用

深入理解PHP内核

实现过程:

  1. 下载php-src源码

  2. 编译工具

    • gcc c语言编译器
    • make c/c++自动构建工具
    • autoconf 检查系统环境与编译参数
  3. 进入php-src

    目录结构
    bulid
    ext(php自带扩展)
    	ext_skel(创建扩展工程脚本)
    	....
    main
    netware
    ....	
    
  4. 执行./ext_skel --extname=test 创建一个test扩展工程

    juzhag@juzhag-virtual-machine:/mnt/hgfs/ubuntu/php/php-5.5.27/ext$ ./ext_skel --extname=test
    Creating directory test
    Creating basic files: config.m4 config.w32 .svnignore test.c php_test.h CREDITS EXPERIMENTAL tests/001.phpt test.php [done].
    
    To use your new extension, you will have to execute the following steps:
    
    1.  $ cd ..
    2.  $ vi ext/test/config.m4
    3.  $ ./buildconf
    4.  $ ./configure --[with|enable]-test
    5.  $ make
    6.  $ ./sapi/cli/php -f ext/test/test.php
    7.  $ vi ext/test/test.c
    8.  $ make
    
    Repeat steps 3-6 until you are satisfied with ext/test/config.m4 and
    step 6 confirms that your module is compiled into PHP. Then, start writing
    code and repeat the last two steps as often as necessary.
    
    juzhag@juzhag-virtual-machine:/mnt/hgfs/ubuntu/php/php-5.5.27/ext$ cd test/
    juzhag@juzhag-virtual-machine:/mnt/hgfs/ubuntu/php/php-5.5.27/ext/test$ ll
    total 24
    drwxrwxrwx 1 root root 4096  7月 19 13:39 ./
    drwxrwxrwx 1 root root 8192  7月 19 13:39 ../
    -rwxrwxrwx 1 root root 1986  7月 19 13:39 config.m4*
    -rwxrwxrwx 1 root root  282  7月 19 13:39 config.w32*
    -rwxrwxrwx 1 root root    4  7月 19 13:39 CREDITS*
    -rwxrwxrwx 1 root root    0  7月 19 13:39 EXPERIMENTAL*
    -rwxrwxrwx 1 root root 2812  7月 19 13:39 php_test.h*
    -rwxrwxrwx 1 root root   16  7月 19 13:39 .svnignore*
    -rwxrwxrwx 1 root root 5044  7月 19 13:39 test.c*
    -rwxrwxrwx 1 root root  496  7月 19 13:39 test.php*
    drwxrwxrwx 1 root root    0  7月 19 13:39 tests/
    
  5. 注意到config.m4,autoconf的配置文件,编写test扩展配置dnl 注释去除

     PHP_ARG_WITH(test, for test support,
     [  --with-test             Include test support])
    
  6. 执行phpize命令,根据php的版本信息,生成configure文件

  7. 执行./configure shell脚本检查编译环境

  8. 产生Makefile编译的配置文件

  9. make && make install

  10. 在php.ini添加 test.so

  11. 测试test目录下的test.php文件即可证明是否生效confirm_test_compiled函数

接下来进行hello world 示例编写

注意刚才test目录下有php_test.h头文件,test.c源文件

  1. php_test.h 声明一个函数

     PHP_FUNCTION(test_hello);
    
  2. test.c 编写源码

     PHP_FUNCTION(test_hello)
     {
     	int len;
     	char *strg;
     	len = spprintf(&strg, 0, "Hello World");
     	RETURN_STRINGL(strg, len, 0);
     }
    
  3. test.c 编写源码,注册函数

     const zend_function_entry test_functions[] = {
     	PHP_FE(test_hello, NULL)
     }
    
  4. 重新make && make install

  5. 编写php脚本,执行 echo test_hello();

上述RETURN_STRINGL,PHP_FE...具体代码使用api,请参考zend API,在php源码根目录下的zend目录zend_API.h文件

Zephir语言开发扩展

优点:类似php语言书写,易上手,快速生成c扩展

缺点:还是得看文档

文档:http://zephir-lang.com/

安装需求(http://zephir-lang.com/install.html):

  • gcc >= 4.x/clang >= 3.x
  • re2c 0.13 or later
  • gnu make 3.81 or later
  • autoconf 2.31 or later
  • automake 1.14 or later
  • libpcre3
  • php development headers and tools

安装成功:

编写hello world 案例

实现过程(http://zephir-lang.com/tutorial.html#checking-installation):

  1. zephir init utils 初始化工程,命名为utils

  2. cd utils

  3. vi utils/greeting.zep

     namespace Utils;
    
     class Greeting
     {
    
         public static function say()
         {
             echo "hello world!";
         }
    
     }
    
  4. zephir build

  5. vi php.ini

     extension=utils.so
    
  6. php test.php

     <?php
    
     echo Utils\Greeting::say(), "\n";
    

Hello World就是这么简单易用,具体开发细节请查看手册


@author 詹巨章 zhanjuzhang@gmail.com

@date 2015/7/19 16:27:25

展开阅读全文
打赏
0
10 收藏
分享
加载中
更多评论
打赏
0 评论
10 收藏
0
分享
返回顶部
顶部