用C 擴充套件PHP

2021-04-16 07:42:10 字數 2111 閱讀 2983

前端時間寫過乙個repl的php extension, 記得當時在國內的中文**上,相關的資料真的很少, 今天就拋磚引玉寫一些,希望對後來者有所幫助, 那些基本的東西我就不贅述了, 主要談談, php exitension和 php 之間的引數傳遞問題;

先說說我寫的那個php extension, 因為repl(yahoo的乙個用於資料同步的工具)提供了c++ api,所以我的實現方式是, 先用c++對原有的api進行包裝,以適合擴充套件使用, 生成乙個c++的動態庫.so, 然後在php extension中,簡單的獲取php傳來的引數,呼叫有前面提及的動態庫提供的api, 而問題就在於, php 和 php extension之間的引數傳遞方法.

(生成動態庫,你只要使用 g++ -fpic -shared 編譯即可.)

1, 取得php傳遞來的引數的數量

這個問題,zend api定義了乙個巨集zend_num_args(),

if(zend_num_args() != 2) wrong_param_count;

wrong_param_count也是乙個巨集.主要負責丟擲乙個預設的錯誤資訊,並返**用者.

在zend_api.h中的定義如下,很直觀了

zend_api void wrong_param_count(void);

#define wrong_param_count

2, 取得引數

這個用到了zend api中的乙個函式:

int zend_parse_parameters(int num_args tsrmls_dc, char *type_spec, …);

int num_args : 要接受的引數個數;並總是應該後面跟著 tsrmls_dc;

char * type_spec : 類似與printf的格式控制字元,表明了要接受的引數的型別;

後面就緊跟著要獲得引數的變數的指標;

控制字元主要的型別有:

下面的一些字元在型別說明字串(就是那個char *type_spec)中具有特別的含義:

在我的擴充套件中,我使用了zend_get_parameters_ex() , 它將所有取回的引數都放在乙個zval**(後面會講)的結構中;

zval ** z_array;

if(failure = zend_get_parameters_ex(1, &z_array)

而後,你就可以很控制函式對引數進行解析進行控制; 這也是我為什麼選用這個的原因之一  :)

3,核心的核心,zval; 

先來看看 zval的定義:

typedef pval zval;

typedef struct _zval_struct zval;

typedef union _zvalue_value str;

hashtable *ht; /* hash table value */

struct obj;

} zvalue_value;

struct _zval_struct ;

可以看出, zval中的 value是個聯合體,顯然它是用來容納各種型別的值的, 相應的有個type來指明值的型別,is_ref 和 refcount是用來指明是否是引用和,引用計數的;

好到這一步,我們已經將引數的"值"取來了,現在的問題就是讓它變成c++中的值(有型別);

我寫的一段陣列解析**:

std::mapphoto;

convert_to_array_ex(z_array);

count = zend_hash_num_elements(z_arrval_pp(z_array));

zend_hash_internal_pointer_reset(z_arrval_pp(z_array));

for (i = 0; i < count; i ++)

zend_hash_move_forward(z_arrval_pp(z_array));

} 今天就寫這麼多,改天有時間,再補。

做個廣告,呵呵,也可以參看由我們牛x的戰友ranix翻譯的programming php的extending php一章

用C語言寫PHP擴充套件

1 預定義 在home目錄,也可以其他任意目錄,寫乙個檔案,例如caleng module.def 內容是你希望定義的函式名以及引數 int a int x,int y string b string str,int n 2 到php原始碼目錄的ext目錄 cd usr local php 5.4....

用C開發PHP擴充套件初探

函式功能 php裡面的整數是有符號數,其內部實現其實就是long,不是unsigned long。對於32位機器來說,php最大能表示的整數就是2 31 1了,一般在應用中碰到大於2 31 1而小於2 32的數就只能用字串來表示了。對於mixed int ext string in 來說,如果字串i...

用C語言寫PHP擴充套件

用c語言寫php擴充套件 1 預定義 在home目錄,也可以其他任意目錄,寫乙個檔案,例如caleng module.def 內容是你希望定義的函式名以及引數 int a int x,int y string b string str,int n 2 到php原始碼目錄的ext目錄 cd usr l...