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调用: