環境:Linux Ubuntu 2.6.27-7 + PHP Version 5.3.2 + Apache/2.2.9
============================== php擴展是什麼==============================
如果你用過PHP,那麼你已經使用過擴展了。除了少數的幾個例外,每一個用戶空間的PHP函數都被歸類到一個個的擴展中。這其中很大一部分(總共超過400個)的函數是“標准擴展”的一部分。PHP的源碼包附帶了大約86個擴展,每一個擴展包含平均30個左右的函數。不難算出,這足有2500個函數。如果這還不夠的話,PECL倉庫中還提供了超過100個擴展,在因特網上還散布著更多。
“所有的函數都包含在了擴展中,那麼剩下的還有什麼?”你肯定會這麼問,”擴展到底用來擴展什麼?PHP的核心又是什麼?“
PHP的核心由兩部分組成。處在最底層的是Zend引擎(ZE)。ZE負責解析人類可讀的PHP腳本,生成機器可讀的符號,然後在一個進程空間裡執行這些符號。ZE還負責內存管理、變量的作用域和執行函數調用。核心的另外一部分是PHP層。PHP綁定到SAPI(Server Application Porgramming Interface, 通常用來指代宿主環境—Apache, IIS, CLI, CGI等)層上,並且負責與它之間的通信。另外,PHP層還為 safe_mode 和 open_basedir 檢查提供了一致的控制層,另外還有通過中類似 fopen(), fread() 和 fwrite() 等用戶空間函數關聯到文件和網絡I/O上的流接口。
============================== 創建過程==============================
1> 下載php源碼並解壓到:/home/roger/soft/php-5.3.2/,並進入ext目錄;
2> 在ext目錄看到有ext_skel這個可執行程序,ext_skel是創建擴展的shell
3> 使用extname參數指定擴展名稱創建一個擴展模塊目錄:
4> 進入roger目錄,這裡主要編輯的文件有兩個:config.m4和roger.c,config.m4可以配置擴展編譯進php的方法,roger.c是編碼模塊的主要文件。使用vim編輯config.m4文件,找到以下幾行:
改變為:
退出保存(roger.c暫時不做修改);
5> 執行命令phpize,phpize是用來擴展php模塊的,完成後可以看到產生了./configure程序:
6> 安裝./configure -> make -> make install:
7> 查看生成的roger.so:
8> 修改php.ini加載roger.so,重啟apache;
9>查看phpinfo(),可以看到roger.so已經加載:
10> 創建一個php文件,寫入:
運行結果:
============================== 自定義函數==============================
如果roger.c不做任何修改,會有一個自帶的函數confirm_roger_compiled,輸出的結果就是上面看到的,下面自定義一個函數。
函數名:roger_test($str)
功能:返回 “your input string:”.$str;
到上面第4步的時候,修改完config.m4,接著修改php_roger.h和roger.c;
vim php_roger.h
找到:PHP_FUNCTION(confirm_roger_compiled); ,新增一行:
PHP_FUNCTION(roger_test);
保存退出。
vim roger.c
數組裡增加我們的函數,找到 const zend_function_entry roger_functions[] ,增加:
PHP_FE(roger_test, NULL)
保存退出。
再到 roger.c 文件最後面增加如下代碼:
在PHP腳本裡面直接調用roger_test(”hello kitty! “),結果: