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(example,example.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 "example.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調用:
php擴展開發書籍推薦:Extending and Embedding PHP