本文案例的编译环境为linux (ubuntu),php5.5.5,netbeans7.4。win系列系统由于作者不熟悉,还请读者百度,谷歌。
下载PHP源码,cd 你的目录/php5.5.5/ext,这个目录之下会有PHP的大部分扩展,可以做为参考。ext目录会有一个扩展生的一个名为ext_skel的shell脚本,执行命令./ext_skel --extname=xcz将为你生成一个xcz的PHP扩展的目录。进入这个目录,"PHP安装目录"/bin/phpize 将为你生成一个configure的文件,./configure --with-php-config 使用这个命令将为你生成make等文件,这个时候就可以使用netbeans打开这个扩展了。为什么netbeans呢?使用这个ide可以帮你找到相应的ZEND API
找开xcz.c找到const zend_function_entry xcz_functions[] 这行修改成:
const zend_function_entry xcz_functions[] = {/* For testing, remove later. */ PHP_FE_END/* Must be the last line in xcz_functions[] */ };
删除掉了默认生成那个乱78糟的方法,打开php_xcz.h
删除
PHP_FUNCTION(confirm_xcz_compiled);
其实不删除也没关系,只是作者有强迫症,不想让这个C做太多的事情,只是做一些简单的版本声明,初始化等。
新建cz.c,cz.h 打开cz.h加入如下代码:
/* * File: cz.h * Author: luxixi * * Created on December 31, 2013, 2:20 PM */ /** ZEND_BEGIN_MODULE_GLOBALS(xcz) long global_value; char *global_string; ZEND_END_MODULE_GLOBALS(xcz) */ PHP_METHOD(Cz, __construct); PHP_METHOD(Cz, createApp);
打开cz.c
/* * File: one.h * Author: luxixi * * Created on December 31, 2013, 4:00 PM */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "php_xcz.h" #include "cz.h" zend_class_entry *cz_cz_ce; const zend_function_entry cz_class_functions[]={ PHP_ME(Cz, __construct,NULL,ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) PHP_ME(Cz,createApp,NULL,ZEND_ACC_PUBLIC) PHP_FE_END }; PHP_MINIT_FUNCTION(cz) { zend_class_entry ce; memset(&ce, 0, sizeof(zend_class_entry)); INIT_CLASS_ENTRY(ce,"Cz",cz_class_functions); cz_cz_ce = zend_register_internal_class_ex(&ce,NULL,NULL TSRMLS_CC); /* cz_cz_ce->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; * */ zend_declare_property_null(cz_cz_ce,ZEND_STRL("_cz"),ZEND_ACC_PUBLIC TSRMLS_CC); } PHP_METHOD(Cz,__construct) { zend_printf("The is Cz class __construct!!</br>"); } PHP_METHOD(Cz,createApp) { zend_printf("The is Cz lcass createApp !</br>"); }
打开xcz.c找到PHP_MINIT_FUNCTION方法,加入以下代码:
ZEND_MODULE_STARTUP_N(cz) (INIT_FUNC_ARGS_PASSTHRU); /**ZEND_MODULE_STARTUP_N(cz) cz和cz.c PHP_MINIT_FUNCTION(cz)中的cz,如果没加入这代码,cz.c中的方法将不可以使用,如果参数不对应,编译时不会报错,但在启动PHP时会提示 undefined symbol: zm_startup_cz */
现在修改config.m4 找到PHP_NEW_EXTENSION方法,在xcz.c加面加空格cz.c。
/php安装目录/bin/phpize
./configure --with-php-config=/php安装目录/bin/php-config
make
make install
修改php.ini 加入extension=xcz.so
使用php代码:
$cz = new \Cz(); $cz->createApp();
将会输出The is Cz class __construct!! The is Cz lcass createApp !
使用cz一个方法创建别一个类。每创建一个记得到xcz.c中PHP_MINIT_FUNCTION加入一行
ZEND_MODULE_STARTUP_N(cz) (INIT_FUNC_ARGS_PASSTHRU);
如创建一个one.c并且PHP_MINIT_FUNCTION(one)就在xcz.c的PHP_MINIT_FUNCTION中入
ZEND_MODULE_STARTUP_N(one) (INIT_FUNC_ARGS_PASSTHRU);
第一次写博文,写得不好还请见谅。有兴趣的朋友可以加入QQ群:239505116 一起讨论。