当前位置: 移动技术网 > IT编程>数据库>Mysql > linux系统下,php调用c库的方法

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

2017年12月23日  | 移动技术网IT编程  | 我要评论
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调用:

这里写图片描述

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网