在一些必要的場景我們必須自己發展出自己的本地PHP函數滿足一些特定的需求,而新的函數必須存在於PHP模組中。以下將介紹最簡單的PHP模組開發:建立自己的say_hello($arg)函式來輸出hello world : $arg。
本文檔介紹的PHP模組開發只是動手做做hello world的程度,關於為什麼這麼做暫時不會介紹太多,更加詳細的介紹後續解剖。
下面透過簡單的幾個步驟可以完成模組hello world層級的模組:
產生模組基礎結構
修改模組程式碼,加入say_hello 函數
修改編譯設定檔
生成模組共用程式庫
設定模組,讓模組生效
測試模組
進入php原始碼目錄下的ext目錄。
執行./ext_skel ––extname=sayhello (我這裡的「–」編碼有問題請不要直接拷貝)
輸出:
[root@myhost ext]# ./ext_skel –– extname=sayhello
Creating directory sayhello
Creating basic files: config.m4 config.w32 .cvsignore sayhello.c php_sayhello.h CREDITS EXPERIMENTAL tests/001.php .
To use your new extension, you will have to execute the following steps:
1. $ cd ..
2. $ vi ext/sayhello/config.m4
3. $ ./buildconf
4. $ ./configure ––[with|enable]-sayhello
5. $ make
#6 . $ ./php -f ext/sayhello/sayhello.php
7. $ vi ext/sayhello/sayhello.c
8. $ make
Repeat steps 3- 6 until you are satisfied with ext/sayhello/config.m4 and
#step 6 confirms that your module is compiled into PHP. Then, start writing
code andrepeat compiled into PHP. Then, start writing
code andrepeat compiled the last two steps as often as necessary.
看到顯示輸出表示模組基礎結構已經生成,我們來看下生成的模組包含哪些檔案:
-rw-r–r– 1 root root 2103 Apr 9 05:05 config.m4 //編譯配置文件
-rw-r–r– 1 root root 310 Apr 9 05:05 config.w32 //w32編譯配置文件
-rw-r–r– 1 root root 8 Apr 9 05:05 CREDITS //作家 //測試版資訊識別
-rw-r–r– 1 root root 2755 Apr 9 05:05 php_sayhello.h //模組定義頭檔
-rw-r–r– 1 rootrootroot root 5294 Apr 9 05:05 sayhello.c //模組實作檔案
##-rw-r–r– 1 root root 508 Apr 9 05:r–r– 1 root root 508 Apr 9 05:05 sayhello root root 508 Apr 9 05:05 sayhello.php drwxr-xr-x 2 root root 4096 Apr 9 05:05 tests //測試檔案目錄這個時候的骨架已經出來了,我們下一步可以將目標模組的骨架已經出來了,我們下一步可以將目標模組的骨架已經出來了()函數加入。 2、實作say_hello()函數開啟模組的php_sayhello.h 文件,增加為php say_hello()準備的c函式定義:PHP_FUNCTION(say_hello); //php原始碼為模組開放定義了許多宏,習慣了使用還蠻方便的
增加完以後我們再對PHP_FUNCTION(say_hello)在say_hello.c中增加具體的實作:
PHP_FUNCTION(say_hello){ char *arg = NULL; int arg_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) ==FAILURE) { //获取php代码的输入参数,方式与scanf差不多 return; } zend_printf("hello world : %s",arg); RETURN_STRINGL(arg, arg_len, 1); }現在實作程式碼也寫了,我們還需要將這個函數註冊到php本地函數中,需要修改sayhello.c中的sayhello_functions:
zend_function_entry sayhello_functions[] = { PHP_FE(confirm_sayhello_compiled, NULL) /* For testing, remove later. */ PHP_FE(say_hello, NULL) //好,现在say_hello函数也注册了 {NULL, NULL, NULL} /* Must be the last line in sayhello_functions[] */ };3、修改編譯設定檔#開啟config.m4,將以下內容前的dnl PHP_ARG_ENABLE(sayhello, whether to enable sayhello support,dnl Make sure that the comment is aligned: dnl [ --enable-sayhello Enable sayhello Enable sayhello support])dnl PHP_SUBST(SAYHELLO_SHARED_LIBADD)4、編譯這裡採用的是動態函式庫的模組產生方式,比靜態編譯進php速度快多了,方便
#[root@myhost sayhello]# /opt/php_server/php/ bin/phpize
Configuring for:##PHP Api Version: 20041225
Zend Module Api No: 200
##Zend Module Api No:此时为模块编译的configure文件已经生成。继续生成Makefile文件:
[root@myhost sayhello]# ./configure –with-php-config=/opt/php_server/php/bin/php-config
……没问题的话是没有错误的
现在可以编译了:
make
代码没有问题的话不会有错的。
编译完,进行模块安装:
[root@myhost sayhello]# make install
Installing shared extensions: /opt/php_server/php/lib/php/extensions/no-debug-non-zts-20060613/
显示模块已经安装至/php安装路径/extensions/no-debug-non-zts-20060613/ 路径下了。
打开你的php.ini文件开始修改吧:
扩展路径设置:
修改extension_dir = “/php安装路径/lib/php/extensions/no-debug-non-zts-20060613″ //看看上述的模块安装路径就知道了
增加模块设置:
[sayhello]
extension=sayhello.so
ok 大功告成,重新启动你的php模块把。
写以下php测试代码执行:
<?php $a = say_hello("frank"); echo "<br>"; echo $a; ?>;
打开这个网页后显示:
hello world : frank
frank
成功运行,模块测试通过。
以上是什麼是php模組開發?簡單php模組開發介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!