編寫自己的php擴充套件函式(一) (轉)
編寫自己的擴充套件
Yorgo Sun 2002/01/22
:NAMESPACE PREFIX = O />
php寫的時間長了,自然對他所提供的功能瞭如指掌,他所提供的一大堆功能,真是覺得很好用,但有時候會發現php也缺少一些功能,自己總是會產生為php新增一些自定義的功能的想法。久而久之,終於今天憋不住了,開始動手研究如何新增。
一個php的包,這裡使用的是php 4.0.5版,解壓後會看到php的根目錄下會有README.EXT_SKEL這樣一個,開啟詳細閱讀了一下,發現了一個非常好用的工具,這個工具可以幫你構建一個空的php擴充套件,然後你向裡面新增相應的程式碼就可以完成你自己的功能擴充套件了。下面我們就來介紹如何使用這個工具。
首先轉移你的目錄到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中這個功能可以在頁面中顯示hello world這個經典單詞。
在php目錄下的ext目錄中,執行下面的命令
./ext_skel --extname=my_module
得到反饋結果:
Creating directory my_module
Creating basic files: config.m4 Makefile.in .ignore 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 satiied 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)
{
_printf("hello worldn");
}
儲存檔案退出
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();
?>
儲存檔案為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, %sn", 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, %sn", Z_STRVAL_PP(yourname));
程式碼解釋如下:
zval **yourname;
初始化一個引數的指標
ZEND_NUM_ARGS()
得到傳遞過來得引數數量,並且判斷如果不為1的時候表示有問題,報錯。
zend_get_parameters_ex(1, &yourname)
將剛剛初始化的指標指向傳遞過來的引數,如果不成功則報錯。
Z_STRVAL_PP(yourname)
處理指標指向的引數並獲得實際的值。
(待續)
歡迎網上轉載,但請保留作者的版權宣告,如需線下刊登、發表請與作者聯絡to:yorgo@163">yorgo@163.net
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991881/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 編寫自己的php擴充套件函式 (轉)PHP套件函式
- PHP擴充套件開發就是一個自己的PHP擴充套件PHP套件
- 如何編寫一個獨立的 PHP 擴充套件PHP套件
- Linux下編寫一個PHP擴充套件LinuxPHP套件
- PHP擴充套件開發教程2 – 編寫第一個擴充套件 hello worldPHP套件
- PHP的Sodium加密擴充套件函式了解PHP加密套件函式
- PHP的SPL擴充套件庫(四)函式PHP套件函式
- PHP的Mhash擴充套件函式的學習PHP套件函式
- Ace Editor 擴充套件編寫初步(轉)套件
- 利用Delphi編寫IE擴充套件 (轉)套件
- 一步步入門編寫PHP擴充套件PHP套件
- 寫擴充套件性好的程式碼:函式套件函式
- 編寫基於PHP擴充套件庫的後門PHP套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- 編寫可擴充套件程式套件
- 學習PHP中統計擴充套件函式的使用PHP套件函式
- 利用Delphi編寫Windows外殼擴充套件 (轉)Windows套件
- 自己寫的和收藏的一寫php函式PHP函式
- 為PHP編譯imap擴充套件PHP編譯套件
- Kotlin擴充套件函式Kotlin套件函式
- Z 函式(擴充套件KMP)函式套件KMP
- 為Unity元件編寫擴充套件Unity元件套件
- 利用Delphi編寫IE擴充套件套件
- HIVE自定義函式的擴充套件Hive函式套件
- 使用Kotlin擴充套件函式擴充套件Spring Data案例Kotlin套件函式Spring
- es6-函式擴充套件函式套件
- 學習一個PHP中用於檢測危險函式的擴充套件TaintPHP函式套件AI
- ES6之函式的擴充套件函式套件
- Kotlin的幾個擴充套件函式Kotlin套件函式
- 分享一下自己寫的PHP函式PHP函式
- 編譯安裝php-amq擴充套件編譯PHPMQ套件
- 新增php擴充套件PHP套件
- php ubuntu 擴充套件PHPUbuntu套件
- Kotlin-常用擴充套件函式Kotlin套件函式
- Kotlin基礎 — 擴充套件函式Kotlin套件函式
- 奇技淫巧之Kotlin 擴充套件函式(一)Kotlin套件函式
- [轉貼][php擴充套件-amqp]安裝PHP套件MQ