php目錄下的ext目錄中,執行的命令

來源:互聯網
上載者:User

標籤:調整   param   cto   inf   系統   code   編輯器   header   架構   

php的目錄下的ext目錄,如果你只需要一個基本的擴充架構的話,執行下面的命令:

./ext_skel --extname=module_name

module_name是你自己可以選擇的擴充模組的名字,例如我選擇的my_module。執行工具後會自動在ext目錄下建立你選擇的module_name名字的目錄,裡面已經產生了相關的代碼,這些代碼中只需要調整config.m4檔案中的三行注釋就可以正常的編譯帶這個自訂擴充模組的php了。在php的根目錄執行下列操作就可以得到。

./buildconf

./configure --enable-module_name

make

 

 

下面我來示範建立my_module擴充架構的全過程,為了更有效果,我們來完成一個php的擴充功能,在php中調用這個功能可以在web頁面中顯示hello world這個經典單詞。

在php目錄下的ext目錄中,執行下面的命令

./ext_skel --extname=my_module

得到反饋結果:

Creating directory my_module

Creating basic files: config.m4 Makefile.in .cvsignore my_module.c php_my_module.h tests/001.phpt my_module.php [done].

 

 

To use your new extension, you will have to execute the following steps:

1.  $ cd ..

2.  $ vi ext/my_module/config.m4

3.  $ ./buildconf

4.  $ ./configure --[with|enable]-my_module

5.  $ make

6.  $ ./php -f ext/my_module/my_module.php

7.  $ vi ext/my_module/my_module.c

8.  $ make

 

 

Repeat steps 3-6 until you are satisfied with ext/my_module/config.m4 and

step 6 confirms that your module is compiled into PHP. Then, start writing

code and repeat the last two steps as often as necessary.

 

 

如果你能看懂上面的東西,那就照著去做。如果不是太明白的話,按照我下面的提示來做也可以。

Cd my_module

首先進入my_module目錄

vi config.m4

使用文字編輯器開啟config.m4檔案,檔案內容大致如下:

dnl $Id$

dnl config.m4 for extension my_module

dnl don‘t forget to call PHP_EXTENSION(my_module)

 

 

dnl Comments in this file start with the string ‘dnl‘.

dnl Remove where necessary. This file will not work

dnl without editing.

 

 

dnl If your extension references something external, use with:

 

 

dnl PHP_ARG_WITH(my_module, for my_module support,

dnl Make sure that the comment is aligned:

dnl [  --with-my_module             Include my_module support])

 

 

dnl Otherwise use enable:

 

 

dnl PHP_ARG_ENABLE(my_module, whether to enable my_module support,

dnl Make sure that the comment is aligned:

dnl [  --enable-my_module           Enable my_module support])

 

 

if test "$PHP_MY_MODULE" != "no"; then

  dnl If you will not be testing anything external, like existence of

  dnl headers, libraries or functions in them, just uncomment the

  dnl following line and you are ready to go.

  dnl Write more examples of tests here...

  PHP_EXTENSION(my_module, $ext_shared)

Fi

 

 

根據你自己的選擇將

dnl PHP_ARG_WITH(my_module, for my_module support,

dnl Make sure that the comment is aligned:

dnl [  --with-my_module             Include my_module support])

修改成

PHP_ARG_WITH(my_module, for my_module support,

Make sure that the comment is aligned:

[  --with-my_module             Include my_module support])

或者將

dnl PHP_ARG_ENABLE(my_module, whether to enable my_module support,

dnl Make sure that the comment is aligned:

dnl [  --enable-my_module           Enable my_module support])

修改成

PHP_ARG_ENABLE(my_module, whether to enable my_module support,

Make sure that the comment is aligned:

[  --enable-my_module           Enable my_module support])

 

 

一般我會選擇後者,然後儲存退出。如果你對vi文字編輯器的操作有困難的話,請參考相應的說明文章,這裡就不再詳細描述了。

Vi my_module.c

將檔案其中的下列代碼進行修改

/* Every user visible function must have an entry in my_module_functions[].

*/

function_entry my_module_functions[] = {

        PHP_FE(say_hello,       NULL)  /* ?添加著一行代碼 */

        PHP_FE(confirm_my_module_compiled,      NULL) /* For testing, remove later. */

        {NULL, NULL, NULL}      /* Must be the last line in my_module_functions[] */

};

 

 

在檔案的最後添加下列代碼

PHP_FUNCTION(say_hello)

{

        zend_printf("hello world\n");

}

儲存檔案退出

 

 

vi php_my_module.h

在檔案中PHP_FUNCTION(confirm_my_module_compiled);一行前面添加下面的代碼

PHP_FUNCTION(say_hello);

儲存檔案退出

 

 

退回到php的根目錄下,執行下面的命令

./buildconf

./configure --enable-my_module

make

 

 

如果一切順利的話,我們現在已經將擴充模組my_module編譯到php裡面了。我們編寫下面的代碼進行測試

<?

       Say_hello(2881064151);

?>

儲存檔案為say_hello.php

在php的根目錄下運行

./php –q say_hello.php

正常情況下會顯示

hello world

表示我們的第一個擴充正常的運行了!

 

 

解釋一下上面做的操作,ext_skel產生一些框下檔案,我們需要修改以下檔案

my_module.c  擴充模組的主程式

php_my_module.h 擴充模組的標頭檔

config.m4  設定檔

 

 

主程式中描述了php擴充模組的聲明,模組中含有多少個函數,各個函數的作用,在phpinfo函數中顯示什麼內容,模組初始化做些什麼,結束做些什麼都會在這個檔案裡進行描述。我們在上面只是添加了一個函數say_hello,並且描述了say_hello函數的具體內容,調用zend_printf系統函數在php中列印字串。

 

 

在對應的標頭檔中聲明了say_hello這個函數,從而完成了我們預期的功能。下面我們會編寫一個更複雜的擴充,創造一個帶參數的php擴充函數,根據給入的參數,顯示hello world, xxxx。Xxxx代表輸入的字串內容,例如我的名字yorgo。

 

 

Vi my_module.c

修改最後的say_hello函數內容如下:

PHP_FUNCTION(say_hello)

{

        zval **yourname;

 

 

        if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &yourname) == FAILURE)

        {

                WRONG_PARAM_COUNT;

        }

 

 

        zend_printf("hello world, %s\n", Z_STRVAL_PP(yourname));

}

存檔退出。

退回php的根目錄,運行

make

修改say_hello.php為

<?

       Say_hello(“yorgo”);

?>

儲存退出後運行

./php –q say_hello.php

得出結果

hello world, yorgo

表示我們這次的修改也成功了,可以改變say_hello中的參數,看看動態效果。

這裡主要解釋上面修改的函數內容,由於say_hello函數需要有參數引入,所以在my_module.c中的say_hello函數主要在進行參數的處理,將php中引用say_hello時所填寫的參數內容正確的傳遞到my_module.c中的say_hello處理函數中。為此,程式中添加了這麼幾行。

zval **yourname;

if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &yourname) == FAILURE)

{

WRONG_PARAM_COUNT;

}

zend_printf("hello world, %s\n", Z_STRVAL_PP(yourname));

 

 

代碼解釋如下:

zval **yourname;

初始化一個參數的指標

ZEND_NUM_ARGS()

得到傳遞過來得參數數量,並且判斷如果不為1的時候表示有問題,報錯。

zend_get_parameters_ex(1, &yourname)

將剛剛初始化的指標指向傳遞過來的參數,如果不成功則報錯。

Z_STRVAL_PP(yourname)

處理指標指向的參數並獲得實際儲存的值。

php目錄下的ext目錄中,執行的命令

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.