首頁 > 後端開發 > php教程 > 什麼是php模組開發?簡單php模組開發介紹

什麼是php模組開發?簡單php模組開發介紹

伊谢尔伦
發布: 2023-03-11 06:44:01
原創
4689 人瀏覽過

在一些必要的場景我們必須自己發展出自己的本地PHP函數滿足一些特定的需求,而新的函數必須存在於PHP模組中。以下將介紹最簡單的PHP模組開發:建立自己的say_hello($arg)函式來輸出hello world : $arg。

本文檔介紹的PHP模組開發只是動手做做hello world的程度,關於為什麼這麼做暫時不會介紹太多,更加詳細的介紹後續解剖。

下面透過簡單的幾個步驟可以完成模組hello world層級的模組:

產生模組基礎結構

修改模組程式碼,加入say_hello 函數

修改編譯設定檔

生成模組共用程式庫

設定模組,讓模組生效

測試模組

1、生成模組基礎

進入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」去掉:

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速度快多了,方便

調試

(使用上並非用php的dl()函式載入動態函式庫,後續可以看到)。

進入(cd) sayhello模組資料夾,執行php安裝

路徑bin下的phpize:

#[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/ 路径下了。

5、配置模块,使其被加载

打开你的php.ini文件开始修改吧:

扩展路径设置:

修改extension_dir = “/php安装路径/lib/php/extensions/no-debug-non-zts-20060613″ //看看上述的模块安装路径就知道了

增加模块设置:

[sayhello]
extension=sayhello.so

ok 大功告成,重新启动你的php模块把。

6、测试模块

写以下php测试代码执行:

<?php
$a = say_hello("frank");
echo "<br>";
echo $a;
?>;
登入後複製

打开这个网页后显示:

hello world : frank
frank

成功运行,模块测试通过。

以上是什麼是php模組開發?簡單php模組開發介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板