首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

PHP 擴展開發入門:建立第一個擴展

     編輯:關於C語言

環境準備 (Ubuntu 12.04 + LAMP)

sudo apt-get update
sudo apt-get install git php5-dev build-essential

步驟 1:取得 PHP 原始碼

cd /
git clone https://github.com/php/php-src.git
cd php-src/ext

步驟 2:使用 ext_skel 產生骨架

./ext_skel --extname=rube
cd rube

產生目錄結構:

rube/
├── config.m4
├── php_rube.h
├── rube.c
├── tests/
└── ...

步驟 3:修改 config.m4 啟用擴展

編輯 config.m4,找到並**取消註釋**以下兩行(移除前面的 dnl):

PHP_ARG_ENABLE(rube, whether to enable rube support,
[  --enable-rube           Enable rube support])

步驟 4:宣告函數 (php_rube.h)

/* 在 PHP_FUNCTION 區塊新增 */
PHP_FUNCTION(confirm_rube_compiled);  // 原有測試函數
PHP_FUNCTION(hello);                  // 新增

步驟 5:註冊函數 (rube.c)

/* 修改 zend_function_entry 陣列 */
const zend_function_entry rube_functions[] = {
    PHP_FE(confirm_rube_compiled, NULL)
    PHP_FE(hello, NULL)        // 新增此行
    PHP_FE_END
};

步驟 6:實作 hello 函數 (rube.c 末尾)

PHP_FUNCTION(hello) {
    char *str = "Hello my first extension!";
    int len = spprintf(NULL, 0, "%s\n", str);
    RETURN_STRINGL(str, len, 0);  // 0 表示由引擎管理記憶體
}

步驟 7:編譯安裝

phpize
./configure --with-php-config=/usr/bin/php-config  # 路徑視環境調整
make
sudo make install

輸出提示安裝路徑,如 /usr/lib/php5/20090626+lfs/rube.so。

步驟 8:啟用擴展

編輯 php.ini (通常在 /etc/php5/apache2/php.ini),末尾新增:

extension=/usr/lib/php5/20090626+lfs/rube.so

重啟 Apache:sudo service apache2 restart

步驟 9:驗證

建立 test.php:

<?php
echo hello();
?>

瀏覽器訪問或 php test.php,應輸出:

Hello my first extension!

常見問題排查

現象原因解決
phpize 找不到未安裝 php5-devsudo 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 Internals Book
  • 原始碼參考: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 整合等進階主題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved