PHP 擴展包含大量樣板代碼。官方提供 ext_skel 腳本生成基礎骨架;PECL_Gen (現 CodeGen_PECL) 提供 XML 定義驅動的完整擴展生成,含 package.xml 打包支援。本文詳細對比兩工具用法與適用場景。
cd php-src/ext
./ext_skel --extname=sample7
ext/sample7/
├── config.m4
├── php_sample7.h
├── sample7.c
├── sample7.php # 測試腳本
├── CREDITS
├── EXPERIMENTAL
└── tests/ # .phpt 測試樣本
cd ..
vi ext/sample7/config.m4 # 啟用擴展 (取消註釋)
./buildconf # 重新生成 configure
./configure --enable-sample7 # 配置
make # 編譯
php -f ext/sample7/sample7.php # 測試
vi ext/sample7/sample7.c # 編寫實際功能
make # 重新編譯
# 重複驗證直到滿意
./ext_skel --extname=sample8 --proto=/usr/local/include/zlib/zlib.h
PHP_FUNCTION() 骨架。pear install CodeGen_PECL
# 或
pecl install CodeGen_PECL
<?xml version="1.0" encoding="utf-8"?>
<extension name="sample9">
<functions>
<function name="sample9_hello_world" role="public">
<code>
<![CDATA[
php_printf("Hello World!");
]]>
</code>
</function>
</functions>
</extension>
pecl-gen specfile.xml
產生完整可編譯擴展目錄 sample9/,含 package.xml (PEAR 安裝元數據)。
<?xml version="1.0" encoding="UTF-8"?>
<extension name="sample9">
<summary>Extension 9 generated by PECL_Gen</summary>
<description>Another sample of PHP Extension Writing</description>
<maintainers>
<maintainer>
<name>John D. Bookreader</name>
<email>jdb@example.com</email>
<role>lead</role>
</maintainer>
</maintainers>
<release>
<version>0.1</version>
<date>2006-01-01</date>
<state>beta</state>
<notes>Initial Release</notes>
</release>
<functions>
<function name="sample9_hello_world" role="public">
<code><![CDATA[php_printf("Hello World!");]]></code>
</function>
<function name="sample9_add" role="public">
<proto>int sample9_add(int a, int b)</proto>
<code><![CDATA[
long a, b;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) return;
RETURN_LONG(a + b);
]]></code>
</function>
</functions>
</extension>
| 特性 | ext_skel | PECL_Gen / CodeGen_PECL |
|---|---|---|
| 安裝 | PHP 原始碼內建 | 需額外安裝 (PEAR/PECL) |
| 輸入 | 命令列參數 (--extname, --proto) | XML 定義檔 |
| 輸出完整度 | 基礎骨架 (需手動完善) | 完整可編譯擴展 + package.xml |
| 函式原型生成 | 支援 (--proto 掃描 C 頭文件) | 支援 (XML proto 節點) |
| 資源型別處理 | 產生警告,需手動修正 | 同樣需手動處理 |
| 套件打包支援 | 無 | 自動生成 package.xml (PEAR/PECL 發布就緒) |
| 適用場景 | 快速原型、學習、簡單擴展 | 正式發布、複雜擴展、團隊協作、CI/CD 整合 |
| 維護狀態 | PHP 核心維護 | CodeGen_PECL 為現代替代者 |
ext_skel --extname=myext 最快上手。ext_skel --extname=myext --proto=/path/to/lib.h 生成函式骨架,再手動填充資源管理代碼。CodeGen_PECL XML 定義,獲得標準化 package.xml、版本管理、釋出流程自動化。