linux php調用c庫

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章