歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux/Ubuntu下C語言開發PHP的.so擴展模塊過程[圖文]

Linux/Ubuntu下C語言開發PHP的.so擴展模塊過程[圖文]

日期:2017/2/28 16:28:42   编辑:Linux教程

環境: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);

  1. PHP_FUNCTION(confirm_roger_compiled); /* For testing, remove later. */
  2. PHP_FUNCTION(roger_test); /* For testing, remove later. */

保存退出。

vim roger.c
數組裡增加我們的函數,找到 const zend_function_entry roger_functions[] ,增加:
PHP_FE(roger_test, NULL)

  1. const zend_function_entry roger_functions[] = {
  2. PHP_FE(confirm_roger_compiled, NULL) /* For testing, remove later. */
  3. PHP_FE(roger_test, NULL) /* For testing, remove later. */
  4. {NULL, NULL, NULL} /* Must be the last line in roger_functions[] */
  5. };

保存退出。

再到 roger.c 文件最後面增加如下代碼:

  1. PHP_FUNCTION(roger_test)
  2. {
  3. char *arg = NULL;
  4. int arg_len, len;
  5. char *strg;
  6. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
  7. return;
  8. }
  9. len = spprintf(&strg, 0, "your input string: %s\n", arg);
  10. RETURN_STRINGL(strg, len, 0);
  11. }

在PHP腳本裡面直接調用roger_test(”hello kitty! “),結果:

Copyright © Linux教程網 All Rights Reserved