• Linux下用C++开发PHP扩展


    GOOGLE了很久,才发现一篇合适的... ◑﹏◐ 是C++写的PHP扩展!!!还是要记住:源代码版本一定要和你的开发环境一样!!! 步骤如下:
    1. 修改配置文件config.m4
    2. 先去掉PHP_ARG_ENABLE的三行注释,再在最后面 if结束前(FI)加上下面的代码
      PHP_REQUIRE_CXX()
      PHP_ADD_LIBRARY(stdc++, "", EXTRA_LDFLAGS)
      CPPFILE="extname.cpp"
      PHP_NEW_EXTENSION(cpptest,$CPPFILE, $ext_shared)
    3. 将源文件(extname.c文件)后缀改.cpp,再对头文件和源文件加 extern "C"{}
    4. 头文件:
      extern "C" {
      #ifdef ZTS
      #include "TSRM.h"
      #endif
      }
      源文件:
      extern "C" {
      #ifdef HAVE_CONFIG_H
      #include "config.h"
      #endif
      
      #include "php.h"
      #include "php_ini.h"
      #include "ext/standard/info.h"
      }
    5. OK!搞定,运行:phpize -> ./configure -> make -> make install
    ——关于代码的编写 之前以为需要转换为Zend API的调用,还傻傻地看了《PHP扩展开发及内核应用》(Extending and Embedding PHP),虽然看了肯定有好处。 如果你已经写好了cpp代码,直接给出个接口就可以了!这个是无意中加了个非PHP_FUNCTION(foo),发现能直接用,所以就只需要接收php传入的参数即可... 接收参数方法: 用zend_parse_parameters()函数 其中,接收字符串一定要同时把字符串的长度也接收了,如接收2个字符串参数
        char *argv1= NULL ;
        char *argv2= NULL ; 
        int arg1_len, arg2_len; 
            
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &argv1, &arg1_len,&argv2,&arg2_len) == FAILURE) 
        {
    		return;
         }
    
    解释一下参数的意思:
    1. 第一个参数: ZEND_NUM_ARGS()表示自动获取参数个数(有多少拿多少), 后面跟着的 TSRMLS_CC是为了线程安全
    2. 第二介参数:"ss":表示接收两个字符串参数,如果3个就"sss",其他的int-- "l",double-- "d" 等 。对字符串,接收的同学一定要把字符串的长度也接收了!
    3. 后面的n个参数就是存放的变量,和scanf("%d",a)很像,但字符串就是还是把字符串长度放在字符串变量后面。
    返回值: RETURN_XXX : XXX表示LONG,DOUBLE
  • 相关阅读:
    miniprogramer--ajax
    miniprogram 获取两点之间的距离(经纬度)
    express node-schedule
    express generate xls
    protected default
    Java UUID
    关于轮播图兼容的问题
    关于git上的一些错误信息
    cookie
    关于ajax原理介绍
  • 原文地址:https://www.cnblogs.com/trying/p/2863728.html
Copyright © 2020-2023  润新知