日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

PHP內(nèi)核探索 —— 嵌入式PHP:類似CLI

瀏覽:5日期:2022-09-16 13:04:22

從PHP源碼目錄結(jié)構(gòu)的介紹以及PHP生命周期可知:嵌入式PHP類似CLI,也是SAPI接口的另一種實(shí)現(xiàn)。 一般情況下,它的一個(gè)請(qǐng)求的生命周期也會(huì)和其它的SAPI一樣:模塊初始化=>請(qǐng)求初始化=>處理請(qǐng)求=>關(guān)閉請(qǐng)求=>關(guān)閉模塊。 當(dāng)然,這只是理想情況。因?yàn)樘囟ǖ膽?yīng)用由自己特殊的需求,只是在處理PHP腳本這個(gè)環(huán)節(jié)基本一致。

對(duì)于嵌入式PHP或許我們了解比較少,或者說根本用不到,甚至在網(wǎng)上相關(guān)的資料也不多, 例如很多游戲中使用Lua語言作為粘合語言,或者作為擴(kuò)展游戲的腳本語言,類似的, 瀏覽器中的Javascript語言就是嵌入在瀏覽器中的。只是目前很少有應(yīng)用將PHP作為嵌入語言來使用, PHP的強(qiáng)項(xiàng)目前還是在Web開發(fā)方面。

PHP對(duì)于嵌入式PHP的支持以及PHP為嵌入式提供了哪些接口或功能呢?首先我們看下所要用到的示例源碼:

#include <sapi/embed/php_embed.h>#ifdef ZTS void ***tsrm_ls;#endif/* Extension bits */zend_module_entry php_mymod_module_entry = { STANDARD_MODULE_HEADER, 'mymod', /* extension name */ NULL, /* function entries */ NULL, /* MINIT */ NULL, /* MSHUTDOWN */ NULL, /* RINIT */ NULL, /* RSHUTDOWN */ NULL, /* MINFO */ '1.0', /* version */ STANDARD_MODULE_PROPERTIES};/* Embedded bits */static void startup_php(void){ int argc = 1; char *argv[2] = { 'embed5', NULL }; php_embed_init(argc, argv PTSRMLS_CC); zend_startup_module(&php_mymod_module_entry);}static void execute_php(char *filename){ zend_first_try {char *include_script;spprintf(&include_script, 0, 'include ’%s’', filename);zend_eval_string(include_script, NULL, filename TSRMLS_CC);efree(include_script); } zend_end_try();}int main(int argc, char *argv[]){ if (argc <= 1) {printf('Usage: embed4 scriptfile';);return -1; } startup_php(); execute_php(argv[1]); php_embed_shutdown(TSRMLS_CC); return 0;}

以上的代碼可以在《Extending and Embedding PHP》在第20章找到(原始代碼有一個(gè)符號(hào)錯(cuò)誤,有興趣的童鞋可以去圍觀下)。 上面的代碼是一個(gè)嵌入式PHP運(yùn)行器(我們權(quán)當(dāng)其為運(yùn)行器吧),在這個(gè)運(yùn)行器上我們可以運(yùn)行PHP代碼。 這段代碼包括了對(duì)于PHP嵌入式支持的聲明,啟動(dòng)嵌入式PHP運(yùn)行環(huán)境,運(yùn)行PHP代碼,關(guān)閉嵌入式PHP運(yùn)行環(huán)境。 下面我們就這段代碼分析PHP對(duì)于嵌入式的支持做了哪些工作。 首先看下第一行:

#include <sapi/embed/php_embed.h>

在sapi目錄下的embed目錄是PHP對(duì)于嵌入式的抽象層所在。在這里有我們所要用到的函數(shù)或宏定義。 如示例中所使用的php_embed_init,php_embed_shutdown等函數(shù)。

第2到4行:

#ifdef ZTS void ***tsrm_ls;#endif

ZTS是Zend Thread Safety的簡寫,與這個(gè)相關(guān)的有一個(gè)TSRM(線程安全資源管理)的東東,這個(gè)后面的章節(jié)會(huì)有詳細(xì)介紹,這里就不再作闡述。

第6到17行:

zend_module_entry php_mymod_module_entry = { STANDARD_MODULE_HEADER, 'mymod', /* extension name */ NULL, /* function entries */ NULL, /* MINIT */ NULL, /* MSHUTDOWN */ NULL, /* RINIT */ NULL, /* RSHUTDOWN */ NULL, /* MINFO */ '1.0', /* version */ STANDARD_MODULE_PROPERTIES};

以上PHP內(nèi)部的模塊結(jié)構(gòu)聲明,此處對(duì)于模塊初始化,請(qǐng)求初始化等函數(shù)指針均為NULL, 也就是模塊在初始化及請(qǐng)求開始結(jié)束等事件發(fā)生的時(shí)候不執(zhí)行任何操作。 不過這些操作在sapi/embed/php_embed.c文件中的php_embed_shutdown等函數(shù)中有體現(xiàn)。 關(guān)于模塊結(jié)構(gòu)的定義在zend/zend_modules.h中。

startup_php函數(shù):

static void startup_php(void){ int argc = 1; char *argv[2] = { 'embed5', NULL }; php_embed_init(argc, argv PTSRMLS_CC); zend_startup_module(&php_mymod_module_entry);}

這個(gè)函數(shù)調(diào)用了兩個(gè)函數(shù)php_embed_init和zend_startup_module完成初始化工作。 php_embed_init函數(shù)定義在sapi/embed/php_embed.c文件中。它完成了PHP對(duì)于嵌入式的初始化支持。 zend_startup_module函數(shù)是PHP的內(nèi)部API函數(shù),它的作用是注冊(cè)定義的模塊,這里是注冊(cè)mymod模塊。 這個(gè)注冊(cè)過程僅僅是將所定義的zend_module_entry結(jié)構(gòu)添加到注冊(cè)模塊列表中。

execute_php函數(shù):

static void execute_php(char *filename){ zend_first_try {char *include_script;spprintf(&include_script, 0, 'include ’%s’', filename);zend_eval_string(include_script, NULL, filename TSRMLS_CC);efree(include_script); } zend_end_try();}

從函數(shù)的名稱來看,這個(gè)函數(shù)的功能是執(zhí)行PHP代碼的。 它通過調(diào)用sprrintf函數(shù)構(gòu)造一個(gè)include語句,然后再調(diào)用zend_eval_string函數(shù)執(zhí)行這個(gè)include語句。 zend_eval_string最終是調(diào)用zend_eval_stringl函數(shù),這個(gè)函數(shù)是流程是一個(gè)編譯PHP代碼, 生成zend_op_array類型數(shù)據(jù),并執(zhí)行opcode的過程。 這段程序相當(dāng)于下面的這段php程序,這段程序可以用php命令來執(zhí)行,雖然下面這段程序沒有實(shí)際意義, 而通過嵌入式PHP中,你可以在一個(gè)用C實(shí)現(xiàn)的系統(tǒng)中嵌入PHP,然后用PHP來實(shí)現(xiàn)功能。

<?phpif($argc < 2) die('Usage: embed4 scriptfile');include $argv[1];?>

main函數(shù):

int main(int argc, char *argv[]){ if (argc <= 1) {printf('Usage: embed4 scriptfile';);return -1; } startup_php(); execute_php(argv[1]); php_embed_shutdown(TSRMLS_CC); return 0;}

這個(gè)函數(shù)是主函數(shù),執(zhí)行初始化操作,根據(jù)輸入的參數(shù)執(zhí)行PHP的include語句,最后執(zhí)行關(guān)閉操作,返回。 其中php_embed_shutdown函數(shù)定義在sapi/embed/php_embed.c文件中。它完成了PHP對(duì)于嵌入式的關(guān)閉操作支持。 包括請(qǐng)求關(guān)閉操作,模塊關(guān)閉操作等。

以上是使用PHP的嵌入式方式開發(fā)的一個(gè)簡單的PHP代碼運(yùn)行器,它的這些調(diào)用的方式都基于PHP本身的一些實(shí)現(xiàn), 而針對(duì)嵌入式的SAPI定義是非常簡單的,沒有Apache和CGI模式的復(fù)雜,或者說是相當(dāng)簡陋,這也是由其所在環(huán)境決定。 在嵌入式的環(huán)境下,很多的網(wǎng)絡(luò)協(xié)議所需要的方法都不再需要。如下所示,為嵌入式的模塊定義。

sapi_module_struct php_embed_module = { 'embed', /* name */ 'PHP Embedded Library',/* pretty name */ php_embed_startup, /* startup */ php_module_shutdown_wrapper, /* shutdown */ NULL, /* activate */ php_embed_deactivate, /* deactivate */ php_embed_ub_write, /* unbuffered write */ php_embed_flush,/* flush */ NULL, /* get uid */ NULL, /* getenv */ php_error, /* error handler */ NULL, /* header handler */ NULL, /* send headers handler */ php_embed_send_header, /* send header handler */ NULL, /* read POST data */ php_embed_read_cookies, /* read Cookies */ php_embed_register_variables, /* register server variables */ php_embed_log_message, /* Log message */ NULL, /* Get request time */ NULL, /* Child terminate */ STANDARD_SAPI_MODULE_PROPERTIES};/* }}} */

在這個(gè)定義中我們看到了若干的NULl定義,在前面一小節(jié)中說到SAPI時(shí),我們是以cookie的讀取為例, 在這里也有讀取cookie的實(shí)現(xiàn)——php_embed_read_cookies函數(shù),但是這個(gè)函數(shù)的實(shí)現(xiàn)是一個(gè)空指針NULL。

標(biāo)簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品国产aⅴ| 99久精品视频在线观看视频| 99久久99久久精品国产片果冰| 久久国产视频网| 蜜桃视频第一区免费观看| 99久久夜色精品国产亚洲狼| 国产三级精品三级在线观看国产| 亚洲有吗中文字幕| 亚洲视频国产| 蜜臀va亚洲va欧美va天堂| 久久视频精品| 久久精品国产68国产精品亚洲| 日韩一区亚洲二区| 美女网站视频一区| 欧美日韩在线二区| 美女毛片一区二区三区四区| 亚洲成人三区| 国产精品人人爽人人做我的可爱| 久久精品青草| 亚洲成人免费| 亚洲欧洲日韩| 日本欧美一区| 国产精品视频一区二区三区| 国产精品一区二区av日韩在线| 国产日产高清欧美一区二区三区| 欧美日韩调教| 久久不见久久见国语| 韩国女主播一区二区三区| 高潮一区二区| 日韩午夜高潮| 日韩一区二区三区四区五区| 久久亚洲美女| 日本精品在线播放| 午夜久久美女| 亚洲黄色在线| 四虎在线精品| 国产精品三p一区二区| 国产中文欧美日韩在线| 波多野结衣久久精品| 久久一级电影| 蜜臀精品一区二区三区在线观看| 日韩av电影一区| 色婷婷综合网| 欧美搞黄网站| 欧美一区自拍| 色网在线免费观看| 六月丁香综合| 精品视频97| 婷婷亚洲五月色综合| 亚洲欧美日韩国产综合精品二区 | 国产精品日本欧美一区二区三区| 中文字幕一区二区精品区| 国产亚洲观看| 欧洲一级精品| 日本不卡高清| 亚洲成av在线| 亚洲精品综合| 国产精品久久观看| 91超碰国产精品| 国产精品久久久久久久久久齐齐| 久久中文字幕av一区二区不卡| 日本成人在线网站| 国产91精品对白在线播放| 日韩激情av在线| 久久天堂av| 日韩1区2区3区| 中文字幕成在线观看| 亚洲自啪免费| 国产+成+人+亚洲欧洲在线| 久久福利一区| 亚洲爱爱视频| 国产精品一国产精品k频道56| 欧美日韩精品在线一区| 国产欧美日韩精品高清二区综合区 | 欧美伊人久久| 香蕉久久精品| 麻豆精品一区二区综合av| 国产精品美女久久久| 国产成人精品福利| 日韩一区二区三区精品 | 日本高清不卡一区二区三区视频| 日韩一区中文| 亚洲精品在线观看91| 国产激情久久| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产精品亚洲欧美日韩一区在线| 一区在线视频观看| 在线看片国产福利你懂的| 日韩成人精品一区二区三区 | 在线视频精品| 欧美精品资源| 成人在线免费观看91| 日韩福利在线观看| 亚洲欧美视频一区二区三区| 国产v综合v| 精品视频黄色| 国产精品任我爽爆在线播放| 亚洲一区二区三区久久久| 婷婷成人综合| 亚洲国产福利| 精品视频一区二区三区在线观看| 亚洲精品一级| 婷婷综合亚洲| 电影亚洲精品噜噜在线观看| 国产精品宾馆| 在线日韩成人| 五月天激情综合网| 久久影院午夜精品| 精品久久国产一区| 久久激情五月激情| 综合国产精品| 亚洲视频二区| 蜜臀av亚洲一区中文字幕| 99视频在线精品国自产拍免费观看| 日韩精品永久网址| 欧美日韩国产观看视频| 成人在线视频区| 麻豆国产欧美日韩综合精品二区| 日本特黄久久久高潮| 日韩欧美2区| 日本午夜精品久久久| 91欧美极品| 国产欧美日韩精品一区二区免费| 欧美综合精品| 国产精品尤物| 国产一区二区三区久久 | 国产粉嫩在线观看| 日韩在线欧美| 日韩成人高清| 亚洲二区视频| 999国产精品| 亚洲夜间福利| 黑丝一区二区| 日韩精品一卡二卡三卡四卡无卡| 丝袜诱惑制服诱惑色一区在线观看 | 麻豆成人在线观看| 国产一区二区三区成人欧美日韩在线观看| 麻豆国产精品777777在线| 国产精品白丝一区二区三区| 国产福利一区二区精品秒拍| 精品国产亚洲一区二区三区大结局| 超碰在线99| 国产专区一区| 伊人久久亚洲热| 亚洲精品乱码久久久久久蜜桃麻豆| 日日夜夜免费精品视频| 国产欧美一区二区三区米奇| 国产精品xxxav免费视频| 久久久久免费| 91久久黄色| 日韩精品导航| 国产精品亲子伦av一区二区三区| 精品视频99| 日韩av免费大片| 91国语精品自产拍| 欧美有码在线| 樱桃视频成人在线观看| 欧美精品黄色| 国产日产精品一区二区三区四区的观看方式 | 蜜桃视频在线观看一区二区| 欧美一区在线观看视频| 精品伊人久久久| 韩日一区二区三区| 日韩一区二区三区精品| 久久久国产精品网站| 精品在线91| 日日摸夜夜添夜夜添国产精品| 国产精品麻豆成人av电影艾秋| 成人欧美一区二区三区的电影| 在线一区免费| 国产精品红桃| 久久精品国产99| 欧美高清一区| 日韩美女精品| 亚洲精品国产偷自在线观看| 日韩二区在线观看| 国产中文欧美日韩在线| 国产亚洲高清视频| 九九九精品视频| 夜夜嗨网站十八久久| 欧美激情日韩| 欧美福利专区| 国产欧美日韩免费观看| 国产专区一区| 国产精品日韩精品在线播放| 狠狠操综合网| 麻豆成人在线观看| 免费在线观看成人| 欧美男人天堂| 亚洲一区二区日韩| 一区二区三区午夜视频| 国产精品亲子伦av一区二区三区| 日本а中文在线天堂| 午夜视频一区二区在线观看| 欧美日韩中出| 天堂成人国产精品一区| 欧美一区免费| 中文字幕人成乱码在线观看| 日本视频一区二区| 亚洲女同中文字幕|