============================== 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);
- PHP_FUNCTION(confirm_roger_compiled); /* For testing, remove later. */
- PHP_FUNCTION(roger_test); /* For testing, remove later. */
儲存退出。
vim roger.c
數組裡增加我們的函數,找到 const zend_function_entry roger_functions[] ,增加:
PHP_FE(roger_test, NULL)
- const zend_function_entry roger_functions[] = {
- PHP_FE(confirm_roger_compiled, NULL) /* For testing, remove later. */
- PHP_FE(roger_test, NULL) /* For testing, remove later. */
- {NULL, NULL, NULL} /* Must be the last line in roger_functions[] */
- };
儲存退出。
再到 roger.c 檔案最後面增加如下代碼:
- PHP_FUNCTION(roger_test)
- {
- char *arg = NULL;
- int arg_len, len;
- char *strg;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) ==FAILURE) {
- return;
- }
-
- len = spprintf(&strg, 0, "your input string: %s\n", arg);
- RETURN_STRINGL(strg, len, 0);
- }
在PHP指令碼裡面直接調用roger_test(”hello kitty! “),結果: