Linux/Ubuntu下C語言開發PHP的.so擴充模組過程

來源:互聯網
上載者:User

============================== 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.  
  7.     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) ==FAILURE) {
  8.             return;
  9.     }
  10.  
  11.     len = spprintf(&strg, 0, "your input string: %s\n", arg);
  12.     RETURN_STRINGL(strg, len, 0);
  13. }

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.