C 開發 PHP 7 擴充套件之模組入口定義

2021-09-16 12:11:07 字數 2179 閱讀 7118

zendapi專案不提供任何底層的功能,只是封裝了zend engine提供的功能,對上提供乙個易用的程式設計介面。這篇文章中,我們將介紹c++世界與c世界交匯的地方,在這裡也是zendapi的介面與zend engine進行整合的地方,非常重要。

每乙個php擴充套件必須有乙個描述物件,在zendapi中我們zapi::lang::extension類主要的作用主要完成這個功能。現在我們來看乙個最簡單的zendapi專案的入口檔案長什麼樣子:

#include "zapi/zendapi.h"

extern "c"

}

怎麼樣很簡單吧,乙個空的php擴充套件就完成了,現在我們就詳細解釋下每行的作用。

#include "zapi/zendapi.h"
在開發基於zendapi的專案時候,我們只需要包含這個標頭檔案就可以了,在這個標頭檔案中,我們會引入zendapi日常開發需要的必要的標頭檔案,您不用自己乙個乙個自己去引入。

extern "c"

{}

zapi_decl_export void *get_module();
zapi_decl_export表示我們擴充套件匯出符號get_module給其他庫使用。函式get_module這個函式非常重要,他是zendapizend engine進行整合的入口,我們必須在這個函式中設定好我們擴充套件的一切,然後將擴充套件描述物件的指標返回。

在這裡我先簡單描述下php載入擴充套件這部分的過程:

php初始化的過程中呼叫的函式有:(這裡我們以cli sapi為例進行說明)

php_cli_startup

php_module_startup

php_ini_register_extensions

php_load_extension

get_module = (zend_module_entry ()(void)) dl_fetch_symbol(handle, "_get_module");

呼叫 get_module,獲取zend_module_entry 物件指標

簡單來說我們可以這樣理解,在php模組初始化的時候,php會去讀取我們在php.ini檔案中註冊的擴充套件, 比如咱們的hellozapi就在php.ini註冊了一行extension=hellozapi.so。如果相關的擴充套件檔案存在,php使用dlopen平台介面進行動態載入,成功的話, 獲取_get_module符號,然後進行呼叫,最終獲取乙個zend_module_entry指標。

static zapi::lang::extension hellozapi("hellozapi", "1.0");

return hellozapi;
新手可能會有疑問,我們的get_module明明是返回乙個void *,而我們這裡返回zapi::lang::extension物件怎麼也可以啊 ?原理很簡單,因為我們的zapi::lang::extension定義了乙個轉換運算子,c++編譯器會自動進行型別轉換。

到這裡,我們這個空的php擴充套件就完成了,怎麼樣,簡單吧?休息一下我們繼續。

文章使用的程式設計文件的引用連線

zapi_decl_export 參考手冊

zapi::lang::extension 參考手冊

C 開發 PHP 7 擴充套件之定義常量

大家如果經常閱讀php官方手冊的話會發現,在擴充套件那一章裡面的每個擴充套件的介紹的時候,都有一節是predefined constants預定義常量,這些常量是不需要您在php裡面進行定義就可以使用的。比如mysqli擴充套件的 predefined constants 那麼我們必須也在我們hel...

PHP7擴充套件開發之hello word

原文出處 本文是以php7作為基礎,講解如何從零開始建立乙個php擴充套件。本文主要講解建立乙個擴充套件的基本步驟都有哪些。示例中,我們將實現如下功能 echo say 輸出內容 php test.php hello word 在擴充套件中實現乙個say方法,呼叫say方法後,輸出 hello wo...

PHP7擴充套件開發之hello word

echo say 輸出內容 php test.php hello word在擴充套件中實現乙個say方法,呼叫say方法後,輸出 hello word。php為我們提供了生成基本 的工具 ext skel。這個工具在php源 的.ext目錄下。cd php src ext ext skel extn...