这篇文章将为大家详细讲解有关利用C语言怎么编写一个PHP扩展,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强> 1:预定义
强>在家里目录,也可以其他任意目录,写一个文件,例如caleng_module.def
内容是你希望定义的函数名以及参数:
int (int x, int y) b
字符串(string str, int n)
<强> 2:到PHP源码目录的ext目录
强> # cd/usr/local/php-5.4.0/ext/
执行命令,生成对应扩展目录
#。/ext_skel——extname=caleng_module——原型=/home/hm caleng_module.def
<强> 3:修改config.m4
强>去掉dnl的注释
PHP_ARG_ENABLE (caleng_module,是否启用caleng_module支持,
确保评论对齐:
(,——enable-caleng_module ,,,,,,,,,启用caleng_module支持])
<强> 4:修改caleng_module。c
强>
代码如下:
/*{{{原型int一(int x, int y)
,,,*/
PHP_FUNCTION (a)
{
, int命令行参数个数=ZEND_NUM_ARGS ();
, int x;
, int y;
,,,int z;
,如果(zend_parse_parameters(命令行参数个数TSRMLS_CC,“ll",, x,, y)==失败)
,,回报,z=x + y;
,, RETURN_LONG (z);
}
/*}}} */
/* {{{b原型字符串(string str, int n)
,,,*/
PHP_FUNCTION (b)
{
, char * str=零;
,,,int命令行参数个数=ZEND_NUM_ARGS ();
,,,int str_len;
,,,长n;
,,,char *结果;
,,,char * ptr;
,,,int result_length;
,,,“如果(zend_parse_parameters(命令行参数个数TSRMLS_CC; sl",, str,, str_len,, n)==失败)
,,,,,,,返回;
,,,result_length=str_len * n;
,,,结果=(char *) emalloc (result_length + 1);
,,,ptr=结果;
,,,而(n)) {
,,,,,,,memcpy(简称:str, str_len);
,,,,,,,ptr +=str_len;
,,,}
,,,* ptr=& # 39; \ 0 & # 39;;
,,,RETURN_STRINGL(结果result_length 0);
}
/*}}} */
<强> 5:生成扩展库
强> # cd。/caleng_module
#/usr/地方/php/bin/phpize
#。/configure——with-php-config=/usr/地方/php/bin/php-config
#让
#让安装
PHP_ARG_ENABLE (myfunction,是否启用myfunction支持,
确保评论对齐:
(,——enable-myfunctions ,,,,,,,,,启用myfunction支持])
4,完善函数a和b的功能:#比;vim/软件/php-5.2.13/ext/caleng_module caleng_module.c
PHP_FUNCTION (a)
{
,,,int x, y, z,
,,,int命令行参数个数=ZEND_NUM_ARGS ();
,,,“如果(zend_parse_parameters(命令行参数个数TSRMLS_CC; ll",, x,, y)==失败)
,,,,,,,返回;
,,,z=x + y;
,,,RETURN_LONG (z);
}
PHP_FUNCTION (b)
{
,,,char * str=零;
,,,int命令行参数个数=ZEND_NUM_ARGS ();
,,,int str_len;
,,,长n;
,,,char *结果;
,,,char * ptr;
,,,int result_length;
,,,“如果(zend_parse_parameters(命令行参数个数TSRMLS_CC; sl",, str,, str_len,, n)==失败)
,,,,,,,返回;
,,,result_length=str_len * n;
,,,结果=(char *) emalloc (result_length + 1);
,,,null