將現有 C/C++ 程式庫(如 WebService 客戶端)封裝為 PHP 擴充模組,能大幅提升效能並複用既有邏輯。本文記錄從原始碼改造、建置環境配置、模組骨架生成、函數實作到編譯測試的完整流程。
main() 改為 testPhpModule(),將輸出改為回傳字串libTest.so,複製至 /usr/lib/sbin/ldconfig 更新動態連結器快取cd php-src/ext
./ext_skel --extname=Test
cd Test
生成標準目錄結構,核心檔案:config.m4、Test.c、php_Test.h。
編輯 config.m4,啟用 --enable-Test 選項(動態載入建議用 enable):
# 修改前(被 dnl 註解)
dnl PHP_ARG_ENABLE(Test, whether to enable Test support,
dnl [ --enable-Test Enable Test support])
# 修改後(移除 dnl)
PHP_ARG_ENABLE(Test, whether to enable Test support,
[ --enable-Test Enable Test support])
編輯 Test.c,在 zend_function_entry Test_functions[] 陣列註冊函數:
zend_function_entry Test_functions[] = {
PHP_FE(confirm_Test_compiled, NULL) // 測試用,後續可移除
PHP_FE(test, NULL) // 新增:對應 PHP 呼叫的 test() 函數
{NULL, NULL, NULL}
};
檔案末尾實作 PHP_FUNCTION(test):
PHP_FUNCTION(test) {
RETURN_STRING(testPhpModule()); // 呼叫前置編譯好的 C 函數
}
# 配置(指定 php-config 路徑)
./configure --with-php-config=/usr/local/php/bin/php-config
# 編譯(鏈接 libTest.so)
make LDFLAGS=-lTest
# 測試
make test
modules/Test.so 至 Apache 擴充目錄(如 /usr/local/apache2/htdocs/)test.php:
<?php
dl("Test.so"); // 動態載入(PHP 7.2+ 已移除 dl(),建議改用 php.ini extension=Test.so)
echo test();
?>
test.php,應顯示原 main() 的輸出內容dl();PHP 7/8 建議修改 php.ini 永久載入RETURN_STRING 會複製字串,若 C 函數回傳動態分配記憶體,需自行釋放避免洩漏掌握 PHP 擴充開發,能讓你將高效能 C/C++ 演算法、既有商業邏輯庫無縫整合進 PHP 應用,是效能優化與技術棧整合的利器。