2023-10-31 分類(lèi): 網(wǎng)站建設(shè)
原站地址:%E6%89%A9%E5%b1%95%E5%bC%80%E5%8F%91%E5%8F%8A%E5%85%A5%E9%97%A8%E8%A7 %A3%E6%83%91/
說(shuō)在最前線(xiàn)
作為一個(gè)pHp程序員,如果不了解pHp內(nèi)核和pHp擴(kuò)展開(kāi)發(fā),那似乎是一件很“丟人”的事情,嗯,真的很“丟人”!雖然接觸pHp已經(jīng)三年多了,但一直沒(méi)有機(jī)會(huì),也沒(méi)有主動(dòng)學(xué)習(xí)過(guò),所以更覺(jué)得“丟臉”。這種情況下,如果面試官問(wèn)你有沒(méi)有因?yàn)殚L(zhǎng)期接觸pHp而學(xué)習(xí)了pHp的底層知識(shí),如果你理解了php 擴(kuò)展開(kāi)發(fā),你會(huì)更“丟臉”。所以,廢話(huà)不多說(shuō),是時(shí)候進(jìn)行 pHp 擴(kuò)展了。
什么是 pHp 擴(kuò)展?
大家在日常的開(kāi)發(fā)過(guò)程中或多或少都接觸過(guò)pHp擴(kuò)展,比如可以查看的vld擴(kuò)展,比如性能分析工具,而我們經(jīng)常使用的pDO其實(shí)就是作為擴(kuò)展運(yùn)行在pHp中的(只是pDO已經(jīng)默認(rèn)編譯進(jìn)了pHp源代碼中,所以我們不需要單獨(dú)安裝),所以pHp擴(kuò)展離我們不遠(yuǎn)了。
為什么要開(kāi)發(fā) pHp 擴(kuò)展?
基礎(chǔ)知識(shí)
準(zhǔn)備好工作了
操作系統(tǒng):.5(只要是)
pHp版本:pHp5.6.9(最好在pHp5.3之后,pHp7之前,畢竟pHp7對(duì)內(nèi)核做了很多改動(dòng))
注:我這里的php環(huán)境是lnmp一鍵安裝包搭建的,lnmp一鍵安裝的入口在這里
第一個(gè)擴(kuò)展名為
不要擔(dān)心這里的概念,讓我們快速瀏覽一下,了解擴(kuò)展通常是如何播放的。
1. 通過(guò)pHp提供的工具生成擴(kuò)展的骨架,--擴(kuò)展名在右邊
~/software/lnmp1.2-full/src/php-5.6.9/ext ? pwd
/root/software/lnmp1.2-full/src/php-5.6.9/ext
~/software/lnmp1.2-full/src/php-5.6.9/ext ? ./ext_skel --extname=myfirstext
Creating directory myfirstext
Creating basic files: config.m4 config.w32 .gitignore myfirstext.c php_myfirstext.h CREDITS EXpERIMENTAL tests/001.phpt myfirstext.php [done].
To use your new extension, you will have to execute the following steps:
1. $ cd ..
2. $ vi ext/myfirstext/config.m4
3. $ ./buildconf
4. $ ./configure --[with|enable]-myfirstext
5. $ make
6. $ ./sapi/cli/php -f ext/myfirstext/myfirstext.php
7. $ vi ext/myfirstext/myfirstext.c
8. $ make
Repeat steps 3-6 until you are satisfied with ext/myfirstext/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.
2. 進(jìn)入目錄,修改.m4文件,刪除下面代碼前面的dnl,我知道你不想知道這個(gè)dnl是干什么的,但是我還是想說(shuō)這個(gè)dnl是只是一個(gè)評(píng)論,編輯它,退出!
dnl pHp_ARG_ENAbLE(myfirstext, whether to enable myfirstext support,
dnl Make sure that the comment is aligned:
dnl [ --enable-myfirstext Enable myfirstext support])
這時(shí)候可以執(zhí)行l(wèi)s看看一般都有哪些文件。讓我先告訴你。比較重要的是.c、.h和.php,最重要的是.c,文件夾也是,以后我們的測(cè)試腳本都會(huì)寫(xiě)在這里。
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext ? ls
config.m4 CREDITS myfirstext.c php_myfirstext.h
config.w32 EXpERIMENTAL myfirstext.php tests
3.登場(chǎng),會(huì)根據(jù)我們的.m4配置生成一些編譯好的文件(比如etc)。
注:由于我這里是為php5.6.9開(kāi)發(fā)擴(kuò)展,所以盡量使用php5.6.9源碼,如果你用我的pHp版本是不同,那么你可以在你的pHp源碼包中找到該命令并執(zhí)行它。
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext ? ../../scripts/phpize
Configuring for:
pHp Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext ? ls
acinclude.m4 config.guess configure EXpERIMENTAL missing php_myfirstext.h
aclocal.m4 config.h.in configure.in install-sh mkinstalldirs run-tests.php
autom4te.cache config.m4 config.w32 ltmain.sh myfirstext.c tests
build config.sub CREDITS Makefile.global myfirstext.php
執(zhí)行后,發(fā)現(xiàn)了很多文件。
4.編譯安裝三連發(fā)
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext ? ./configure
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext ? make
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext ? make install
Installing shared extensions: /usr/lib64/php/modules/
注意:如果編譯安裝順利,則忽略這個(gè)
./報(bào)告re2c錯(cuò)誤:執(zhí)行yum -y re2c
使錯(cuò)誤(/root//.2-full/src/php-5.6.9/ext//.c:146:錯(cuò)誤:``未聲明(不在功能中)):打開(kāi)。 c、刪除第146行,替換為{NULL, NULL, NULL}。
5.恭喜你,你的第一個(gè)擴(kuò)展開(kāi)發(fā)成功了,就是名字不太好聽(tīng),現(xiàn)在我們驗(yàn)證一下我們的擴(kuò)展是否可用
在 CLI 模式下找到你的 php.ini(執(zhí)行命令 php -i | grep php.ini 找到它,添加一行
extension=myfirstext.so
重啟php,我這里重啟php-fpm。執(zhí)行命令看到如下,證明你的第一個(gè)擴(kuò)展可以正常工作了!可以看出我們通過(guò)擴(kuò)展創(chuàng)建了一個(gè)新的pHp函數(shù)()。
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext ? php -r 'echo confirm_myfirstext_compiled("Hello World!");'
Congratulations! You have successfully modified ext/myfirstext/config.m4. Module Hello World! is now compiled into pHp.
問(wèn)題來(lái)了?
好了,既然來(lái)到了這里,我想你的第一個(gè) pHp 擴(kuò)展也已經(jīng)開(kāi)發(fā)出來(lái)了。在上面的例子中,我們新建了一個(gè)pHp內(nèi)置函數(shù)(),并通過(guò)它實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的函數(shù)。是不是有點(diǎn)不上癮?不知道你是不是太沉迷了,我相當(dāng)沉迷,但是我對(duì)我剛剛開(kāi)發(fā)的第一個(gè)擴(kuò)展仍然有很多疑問(wèn)。下面我們將逐步解讀這些我們都有的疑問(wèn)。
擴(kuò)展文件夾中的文件是做什么用的?
在這里,我們將只關(guān)注少數(shù)文件,因?yàn)榇蠖鄶?shù)文件都是由該工具自動(dòng)生成的。在這里,我將對(duì)這些文件進(jìn)行分類(lèi)。
代碼文件:
。H
。C
至于為什么會(huì)有.h文件,我想你知道。
擴(kuò)展配置文件:
.m4: *在 nix 下使用
.w32:用于
我現(xiàn)在將跳過(guò)其他文件,因?yàn)槲也恢馈?/p>
最重要的 .c 文件在哪里重要?
首先我們把.c文件分塊,這樣更直觀(因?yàn)槔锩鏉M(mǎn)是注釋?zhuān)@里沒(méi)有列出注釋部分)
/**
* 頭文件部分
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_myfirstext.h"
static int le_myfirstext;
/**
* 自定義函數(shù)部分,看到該函數(shù)的參數(shù)還熟嗎?這里就是我們上面自定義函數(shù)的實(shí)現(xiàn)部分!
*/
pHp_FUNCTION(confirm_myfirstext_compiled)
{
char *arg = NULL;
int arg_len, len;
char *strg;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
return;
}
len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into pHp.", "myfirstext", arg);
RETURN_STRINGL(strg, len, 0);
}
/**
* Module初始化和Shutdown部分
*/
pHp_MINIT_FUNCTION(myfirstext)
{
return SUCCESS;
}
pHp_MSHUTDOWN_FUNCTION(myfirstext)
{
return SUCCESS;
}
/**
* Request初始化和shutdown部分
*/
pHp_RINIT_FUNCTION(myfirstext)
{
return SUCCESS;
}
pHp_RSHUTDOWN_FUNCTION(myfirstext)
{
return SUCCESS;
}
/**
* Module Info部分,這里主要控制將擴(kuò)展信息打印到phpinfo()中
*/
pHp_MINFO_FUNCTION(myfirstext)
{
php_info_print_table_start();
php_info_print_table_header(2, "myfirstext support", "enabled");
php_info_print_table_end();
/* Remove comments if you have entries in php.ini
DISpLAY_INI_ENTRIES();
*/
}
/**
* function_entry部分,這里主要對(duì)我們前面自定義的confirm_myfirstext_compiled函數(shù)做一個(gè)封裝
*/
const zend_function_entry myfirstext_functions[] = {
pHp_FE(confirm_myfirstext_compiled, NULL) /* For testing, remove later. */
{NULL, NULL, NULL}
/* Must be the last line in myfirstext_functions[] */
};
/**
* module_entry部分,這里應(yīng)該算是整個(gè)文件最重要的部分了吧,屬于我們擴(kuò)展的CpU,這里將會(huì)告訴pHp如何初始化我們的擴(kuò)展。
*/
zend_module_entry myfirstext_module_entry = {
STANDARD_MODULE_HEADER,
"myfirstext",
myfirstext_functions,
pHp_MINIT(myfirstext),
pHp_MSHUTDOWN(myfirstext),
pHp_RINIT(myfirstext), /* Replace with NULL if there's nothing to do at request start */
pHp_RSHUTDOWN(myfirstext), /* Replace with NULL if there's nothing to do at request end */
pHp_MINFO(myfirstext),
pHp_MYFIRSTEXT_VERSION,
STANDARD_MODULE_pROpERTIES
};
#ifdef COMpILE_DL_MYFIRSTEXT
ZEND_GET_MODULE(myfirstext)
#endif
所以,.c中最重要、最基本的代碼段是這樣的。
讓我們創(chuàng)建一個(gè)新函數(shù),稱(chēng)為 ()
只需要兩步就可以實(shí)現(xiàn)我們想要的功能。
1.添加函數(shù)定義
......
pHp_FUNCTION(confirm_myfirstext_compiled)
{
char *arg = NULL;
int arg_len, len;
char *strg;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
return;
}
len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into pHp.", "myfirstext", arg);
RETURN_STRINGL(strg, len, 0);
}
pHp_FUNCTION(hello_world)
{
php_printf("hello world!");
}
......
2.添加功能
const zend_function_entry myfirstext_functions[] = {
pHp_FE(confirm_myfirstext_compiled, NULL) /* For testing, remove later. */
pHp_FE(hello_world, NULL)
{NULL, NULL, NULL}
/* Must be the last line in myfirstext_functions[] */
};
c
好,再一次編譯安裝三連發(fā),重啟pHp
```bash
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext ? make install
Installing shared extensions: /usr/lib64/php/modules/
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext ? service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
~/software/lnmp1.2-full/src/php-5.6.9/ext/myfirstext ? php -r "hello_world();"
hello world!
當(dāng)然,我們直接通過(guò)上面pHp官方提供的工具創(chuàng)建了擴(kuò)展骨架,其實(shí)我們也可以手動(dòng)創(chuàng)建。
手工制作這里就不贅述了,大家可以直接跳到學(xué)習(xí)walu大神的開(kāi)源項(xiàng)目walu/,在這里系統(tǒng)學(xué)習(xí)。這幾天一直在研究這個(gè)教程,也有幸得到了瓦魯大神的幫助。
那么php 擴(kuò)展開(kāi)發(fā),我該如何閱讀本教程?我會(huì)在這里做一個(gè)小分享
首先,請(qǐng)打開(kāi)目錄。您會(huì)發(fā)現(xiàn)目前總共有 20 章。這些天我已經(jīng)學(xué)習(xí)了前13章和18章。保證的是所有的例子都可以驗(yàn)證。不僅有利于開(kāi)發(fā)方法的擴(kuò)展和pHp內(nèi)核知識(shí)的增長(zhǎng),所以推薦墻!
如果覺(jué)得看walu大神的教程有點(diǎn)難,可以看我的博客pHp擴(kuò)展開(kāi)發(fā)相關(guān)內(nèi)核
這個(gè)其實(shí)是我在學(xué)習(xí)過(guò)程中整理出來(lái)的,不保證對(duì)你有用。
如果你想得到原版,你可以點(diǎn)擊這里/
網(wǎng)頁(yè)標(biāo)題:如何開(kāi)發(fā)pHp擴(kuò)展離我們并不遠(yuǎn)?|?
分享URL:http://jinyejixie.com/news33/291783.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站排名、做網(wǎng)站、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容