PHP 內建功能雖多,但有時需要自訂 C 層擴展以提升效能或整合外部庫。本文示範使用 PHP 原始碼附帶的 ext_skel 工具建立擴展骨架,並實作第一個函數 say_hello()。
ext_skel 位於 ext/ 目錄cd php-4.0.5/ext
./ext_skel --extname=my_module
產生目錄 my_module/ 含設定檔、原始碼、測試腳本。
啟用 PHP_ARG_ENABLE 區塊 (移除 dnl 註解):
PHP_ARG_ENABLE(my_module, whether to enable my_module support,
[ --enable-my_module Enable my_module support])
my_module.c:
/* 函數表註冊 */
function_entry my_module_functions[] = {
PHP_FE(say_hello, NULL)
PHP_FE(confirm_my_module_compiled, NULL)
{NULL, NULL, NULL}
};
/* 函數實作 */
PHP_FUNCTION(say_hello) {
zend_printf("hello world ");
}
php_my_module.h:
PHP_FUNCTION(say_hello);
cd php-4.0.5
./buildconf
./configure --enable-my_module
make
# 測試
sapi/cli/php -r 'say_hello();' # 輸出: hello world
修改 say_hello 接受字串參數:
PHP_FUNCTION(say_hello) {
zval **name;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &name) == FAILURE) {
WRONG_PARAM_COUNT;
}
zend_printf("hello world, %s ", Z_STRVAL_PP(name));
}
重新 make,測試:
sapi/cli/php -r 'say_hello("Yorgo");' # 輸出: hello world, Yorgo
zval:PHP 內部變數結構ZEND_NUM_ARGS():取得實際傳入參數個數zend_get_parameters_ex():取得參數指標Z_STRVAL_PP():取得字串值WRONG_PARAM_COUNT:拋出參數錯誤(待續:下篇將介紹更複雜的擴展開發)