欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

linux系统下,php调用c库的方法

程序员文章站 2022-04-01 20:13:30
python中可以调用c代码,php也是可以的。 c语言写的代码,不能直接在php中使用,不过可以用php扩展的方式调用。 首先在php源码ext/下新建一个子目录exampl...

python中可以调用c代码,php也是可以的。

c语言写的代码,不能直接在php中使用,不过可以用php扩展的方式调用。

首先在php源码ext/下新建一个子目录example,然后创建config.m4

config.m4:

PHP_ARG_ENABLE(risk,
  [Whether to enable the "risk" extension],
  [  enable-risk        Enable "risk" extension support])
if test $PHP_RISK != "no"; then
  PHP_SUBST(RISK_SHARED_LIBADD)
  #risk.c risk1.c...如果存在多个c文件可以以空格隔开
  PHP_NEW_EXTENSION(risk,risk.c , $ext_shared)
fi

创建example.h和example.c

example.h:

#ifndef PHP_SRC_RISK_H
#define PHP_SRC_RISK_H
#define PHP_RISK_EXTNAME    "risk"
#define PHP_RISK_EXTVER    "1.0"
/* 在php源码树外面构建时引入配置选项 */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
/* 包含php的标准头文件 */
#include "php.h"
extern zend_module_entry risk_module_entry;
#define phpext_risk_ptr &risk_module_entry

#endif 

example.c:

#include "risk.h"

PHP_FUNCTION(risk_ios) {

        double birthday;

        double zmxy_score;

        double whitename_score;

        double app_quantity;

        int social_identity;

        char *race;
        int raceLen;

        char *bank_name;
        int bankNameLen;
        char *gender;
        char *genderLen;

        char *salary;
        char *salaryLen;
        char *company_type;
        char *company_typeLen;

        char *work_time;
        char *work_timeLen;
        char *education_level;
        char *education_levelLen;
        char *area;
        char *areaLen;

// 解析php传过来的参数,zend_parse_parameters(ZEND_NUM_ARGS() 是固定写法,d是双精度浮点型(在php中,浮点和整形对应的是c语言中的double和long int),l是整形,s是代表php中的字符串
        if (SUCCESS !=  zend_parse_parameters(ZEND_NUM_ARGS(), "ddddlssssssss", &birthday, &zmxy_score, &whitename_score, &app_quantity, &social_identity, &race
        , &raceLen, &bank_name, &bankNameLen, &gender, &genderLen, &salary, &salaryLen, &company_type, &company_typeLen, &work_time, &work_timeLen
        , &education_level, &education_levelLen, &area, &areaLen)) {
            return;
        }


       //TODO 具体的业务处理

        //返回最后的结果,php定义的宏,有很多个
        RETURN_DOUBLE(result);

}

//函数列表  PHP_FE(risk_ios, NULL) 对应 PHP_FUNCTION(risk_ios)
//可以加多个函数,必须以{ NULL, NULL, NULL }结尾
static zend_function_entry php_risk3_sc_functions[] = {
        PHP_FE(risk_ios, NULL)
        { NULL, NULL, NULL }
};

zend_module_entry risk_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
        STANDARD_MODULE_HEADER,
#endif
        PHP_RISK_EXTNAME,
        php_risk3_sc_functions,
        NULL, 
        NULL, 
        NULL,
        NULL, 
        NULL, 
#if ZEND_MODULE_API_NO >= 20010901
        PHP_RISK_EXTVER,
#endif
        STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_RISK
ZEND_GET_MODULE(risk)
#endif

进入example目录里依次运行命令:

phpize
./configure
make
make install

将生成的.so配置到php,ini里面就可以使用刚刚写好的扩展了!

php调用:

linux系统下,php调用c库的方法