本文案例的编译环境为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 一起讨论。