PHP下C扩展开发

PHP下C扩展开发

  • 首先保证各位已经正确安装了PHP(笔者安装的PHP4.4.45版本)

  • 下载PHP源码(笔者下载的是5.4.45版本 :https://github.com/captaim/php-src/archive/PHP-5.4.45.zip

  • 解压

  • 进入解压后的源码的ext目录中(此目录存放的都是PHP的扩展,入openssl)/usr/local/src/php-5.4.45/ext

  • 在此目录下执行生成扩展目录的操作,笔者生成的扩展名为test,我们会发现ext目录下生成了test目录

    ./ext_skel —extname=test

    image

  • 进入test(/usr/local/src/php-5.4.45/ext/test)目录,修改test目录下下的config.m4文件,修改如下(删除部分代码,config.m4第十一行左右)

    dnl PHP_ARG_WITH(test, for test support,
    dnl Make sure that the comment is aligned:
    dnl [  --with-test             Include test support])
    

    将上面的代码修改为如下:

    PHP_ARG_WITH(test, for test support,
    [  --with-test             Include test support])
    
  • 在test(/usr/local/src/php-5.4.45/ext/test)目录下,执行phpize操作,生成configure文件:
    image

  • 在test(/usr/local/src/php-5.4.45/ext/test)目录下执行 ./confiure:
    image

  • 在test(/usr/local/src/php-5.4.45/ext/test)目录下执行 make之后再执行make install:
    image

  • php -i | grep php.ini查看php.ini的位置(非必要的步骤)

  • 修改php扩展,加入test.so(这个名字和扩展的文件夹名字相同 ./ext_skel —extname=test ,就是此extname的值):

    [test.so]
    extension=test.so
    
  • 重启php(service php-fpm)之后,我们发现,此时test的扩展已经载入了
    image

  • 在/sites/sites/demo目录下新建一个demo001.php ,(confirm_test_compiled函数为test扩展里面test.c文件里的函数,相当于我们需要自己实现的扩展函数)。到此步骤,一个php扩展步骤的演示已经完成,下面展示的是如何完成自定义的函数
    image
    此文件的执行结果如下:
    image

下面讲解的是php中自定义扩展函数的实现

  • 在/usr/local/src/php-5.4.45/ext/test目录下修php_test.h文件(这个文件为定义函数的文件,test.c为具体实现函数的文件)

     47 PHP_FUNCTION(confirm_test_compiled);    /* For testing, remove later. */
    

    将上面的部门修改为(加入PHP_FUNCTION(test_hello);)

     47 PHP_FUNCTION(confirm_test_compiled);    /* For testing, remove later. */
     48 PHP_FUNCTION(test_hello);
    
  • 在/usr/local/src/php-5.4.45/ext/test目录下的test.c(php_test.h中定义的函数的具体实现文件)中具体实现这个”test_hello”这个函数

    PHP_FUNCTION(test_hello)
    {
        long a;
        long b;
        char *c;
        int c_len;
    
        if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"lls", &a, &b, &c, &c_len) == FAILURE){
                return;
        }
        char *str;
        int len = spprintf(&str, 0, "%s: %d\n",c, a*b);
        RETURN_STRINGL(str, len, 0);
    }
    

    具体如图:
    image

  • 在/usr/local/src/php-5.4.45/ext/test目录下的test.c中将实现的函数注册到zend中
    image
    修改如下加入 『PHP_FE(test_hello,NULL)』,具体如图
    image

  • 在/usr/local/src/php-5.4.45/ext/test目录下make && make install

  • 任意目录下执行『php —rf “test_hello”』查看函数是否存在,如果存在,表示添加的函数已经完成,我们就可以在php程序中使用了
    image

  • 我们新建一个demo002.php文件,调用自定义的扩展函数
    image
    运行结果如下,表示成功
    image


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值