sudo apt-get update
sudo apt-get install git php5-dev build-essential
cd /
git clone https://github.com/php/php-src.git
cd php-src/ext
./ext_skel --extname=rube
cd rube
產生目錄結構:
rube/
├── config.m4
├── php_rube.h
├── rube.c
├── tests/
└── ...
編輯 config.m4,找到並**取消註釋**以下兩行(移除前面的 dnl):
PHP_ARG_ENABLE(rube, whether to enable rube support,
[ --enable-rube Enable rube support])
/* 在 PHP_FUNCTION 區塊新增 */
PHP_FUNCTION(confirm_rube_compiled); // 原有測試函數
PHP_FUNCTION(hello); // 新增
/* 修改 zend_function_entry 陣列 */
const zend_function_entry rube_functions[] = {
PHP_FE(confirm_rube_compiled, NULL)
PHP_FE(hello, NULL) // 新增此行
PHP_FE_END
};
PHP_FUNCTION(hello) {
char *str = "Hello my first extension!";
int len = spprintf(NULL, 0, "%s\n", str);
RETURN_STRINGL(str, len, 0); // 0 表示由引擎管理記憶體
}
phpize
./configure --with-php-config=/usr/bin/php-config # 路徑視環境調整
make
sudo make install
輸出提示安裝路徑,如 /usr/lib/php5/20090626+lfs/rube.so。
編輯 php.ini (通常在 /etc/php5/apache2/php.ini),末尾新增:
extension=/usr/lib/php5/20090626+lfs/rube.so
重啟 Apache:sudo service apache2 restart
建立 test.php:
<?php
echo hello();
?>
瀏覽器訪問或 php test.php,應輸出:
Hello my first extension!
| 現象 | 原因 | 解決 |
|---|---|---|
phpize 找不到 | 未安裝 php5-dev | sudo apt-get install php5-dev |
configure 报错缺少头文件 | --with-php-config 路徑錯誤 | which php-config 確認路徑 |
make 編譯錯誤 | C 代碼語法錯誤 / API 不匹配 | 檢查 PHP 版本對應的 Zend API |
| 函數未定義 | 未在 zend_function_entry 註冊 | 補上 PHP_FE |
| 段錯誤 | 記憶體管理錯誤 (RETURN_STRINGL 第 3 參數) | 理解 0/1 含義:0=引擎釋放, 1=自行釋放 |
php-src/ext/standard/ 內建擴展實作gdb --args php test.php、valgrind --tool=memcheck php test.php恭喜!你已完成第一個 PHP 擴展。接著可嘗試:類別封裝 (zend_class_entry)、資源類型 (zend_register_list_destructors_ex)、INI 設定、非同步 I/O 整合等進階主題。