您的位置 首页 php

开发一个简易的PHP扩展

本教程将实现一个阶乘扩展,编译环境为:CentOS7/PHP5.6.3,其PHP函数实现如下:

 function factorial($number){

  if($number < 1) return 0;

  $i = 1;

  $result = 1;

  while($i <= $number){

    $result *= $i;

    $i++;

  }

  return $result;

}  

注意:由于这个函数只用于演示,未考虑大数的阶乘,在使用大数进行阶乘时,有可能会发生整形溢出。

定义函数原型

我们首先在php源码的扩展目录定义一个文件名为”factorial.def”的文件,并在里面写上如下内容:

 long factorial(int number)  

生成扩展基本代码

这时候我们就可以使用php官方为我们提供的工具ext_skel,来生成扩展的基本代码,命令如下:

 ./ext_skel --extname=factorial --proto=factorial.def  

其中extname表示要生成的扩展名称,proto表示函数原型的文件路径

扩展配置修改

经过上一步的代码生成,现在当前目录下应该出现了一个factorial的目录,我们进入这个目录,并编辑目录下的“config.m4”文件,将以下两行代码前的dnl删除,如下:

 PHP_ARG_ENABLE(factorial, whether to enable factorial support,

Make sure that the comment is aligned:

[  --enable-factorial           Enable factorial support])  

功能实现

接下来就是我们今天的主菜了,我们修改一下factorial.c,找到函数主体,修改为如下代码:

 PHP_FUNCTION(factorial)

{

  int argc = ZEND_NUM_ARGS();

  long number;

  if (zend_parse_parameters(argc TSRMLS_CC, "l", &number) == FAILURE)

  	return;

  if(number < 1)  RETURN_LONG(0);

  long i = 1;

  long result = 1;

  while(i <= number){

    result *= i;

  	i++;

  }

  RETURN_LONG(result);

}  

代码中的zend_parse_parameters是用来检验输入参数的,它的第三个参数表示的是输入参数的类型,觉的类型表示如下表所示:

扩展函数的返回值,需要使用php预设的宏定义来返回,常见的宏定义如下表所示:

编译扩展

执行以下命令,执行扩展编译:

 /usr/local/php/bin/phpzie

./configure

make && make install  

添加扩展

编辑php.ini,加入如下代码:

 extension=factorial.so  

代码添加后,我们需要重启一下php-fpm.

至此,我们就将扩展添加进PHP了,这时我们可以编写一个php文件来做测试,如下:

 echo factorial(10);

// returns 3628800  

文章来源:智云一二三科技

文章标题:开发一个简易的PHP扩展

文章地址:https://www.zhihuclub.com/77718.shtml

关于作者: 智云科技

热门文章

网站地图