成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

PHP內核探索 —— 嵌入式PHP:類似CLI

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

從PHP源碼目錄結構的介紹以及PHP生命周期可知:嵌入式PHP類似CLI,也是SAPI接口的另一種實現。 一般情況下,它的一個請求的生命周期也會和其它的SAPI一樣:模塊初始化=>請求初始化=>處理請求=>關閉請求=>關閉模塊。 當然,這只是理想情況。因為特定的應用由自己特殊的需求,只是在處理PHP腳本這個環節基本一致。

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

PHP對于嵌入式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章找到(原始代碼有一個符號錯誤,有興趣的童鞋可以去圍觀下)。 上面的代碼是一個嵌入式PHP運行器(我們權當其為運行器吧),在這個運行器上我們可以運行PHP代碼。 這段代碼包括了對于PHP嵌入式支持的聲明,啟動嵌入式PHP運行環境,運行PHP代碼,關閉嵌入式PHP運行環境。 下面我們就這段代碼分析PHP對于嵌入式的支持做了哪些工作。 首先看下第一行:

#include <sapi/embed/php_embed.h>

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

第2到4行:

#ifdef ZTS void ***tsrm_ls;#endif

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

第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內部的模塊結構聲明,此處對于模塊初始化,請求初始化等函數指針均為NULL, 也就是模塊在初始化及請求開始結束等事件發生的時候不執行任何操作。 不過這些操作在sapi/embed/php_embed.c文件中的php_embed_shutdown等函數中有體現。 關于模塊結構的定義在zend/zend_modules.h中。

startup_php函數:

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);}

這個函數調用了兩個函數php_embed_init和zend_startup_module完成初始化工作。 php_embed_init函數定義在sapi/embed/php_embed.c文件中。它完成了PHP對于嵌入式的初始化支持。 zend_startup_module函數是PHP的內部API函數,它的作用是注冊定義的模塊,這里是注冊mymod模塊。 這個注冊過程僅僅是將所定義的zend_module_entry結構添加到注冊模塊列表中。

execute_php函數:

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();}

從函數的名稱來看,這個函數的功能是執行PHP代碼的。 它通過調用sprrintf函數構造一個include語句,然后再調用zend_eval_string函數執行這個include語句。 zend_eval_string最終是調用zend_eval_stringl函數,這個函數是流程是一個編譯PHP代碼, 生成zend_op_array類型數據,并執行opcode的過程。 這段程序相當于下面的這段php程序,這段程序可以用php命令來執行,雖然下面這段程序沒有實際意義, 而通過嵌入式PHP中,你可以在一個用C實現的系統中嵌入PHP,然后用PHP來實現功能。

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

main函數:

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;}

這個函數是主函數,執行初始化操作,根據輸入的參數執行PHP的include語句,最后執行關閉操作,返回。 其中php_embed_shutdown函數定義在sapi/embed/php_embed.c文件中。它完成了PHP對于嵌入式的關閉操作支持。 包括請求關閉操作,模塊關閉操作等。

以上是使用PHP的嵌入式方式開發的一個簡單的PHP代碼運行器,它的這些調用的方式都基于PHP本身的一些實現, 而針對嵌入式的SAPI定義是非常簡單的,沒有Apache和CGI模式的復雜,或者說是相當簡陋,這也是由其所在環境決定。 在嵌入式的環境下,很多的網絡協議所需要的方法都不再需要。如下所示,為嵌入式的模塊定義。

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};/* }}} */

在這個定義中我們看到了若干的NULl定義,在前面一小節中說到SAPI時,我們是以cookie的讀取為例, 在這里也有讀取cookie的實現——php_embed_read_cookies函數,但是這個函數的實現是一個空指針NULL。

標簽: PHP
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日韩激情一二三区| 成人禁用看黄a在线| 成人小视频免费观看| 在线这里只有精品| 亚洲综合一区二区精品导航| 亚洲视频免费| 国产精品美女一区二区在线观看| 国产iv一区二区三区| 91精品久久久久久蜜臀| 久久不见久久见免费视频7 | 好看的日韩av电影| 国产嫩草影院久久久久| 欧美黄色大片网站| 久久人人97超碰com| 成人午夜av影视| 精品国产百合女同互慰| 成人蜜臀av电影| 欧美精品一区在线观看| 99久久久无码国产精品| 久久久蜜臀国产一区二区| 成人精品国产一区二区4080| 日韩写真欧美这视频| 国产大片一区二区| 日韩情涩欧美日韩视频| 成人av网址在线| 337p粉嫩大胆噜噜噜噜噜91av| eeuss鲁一区二区三区| 久久久五月婷婷| 欧美一区免费视频| 国产日韩精品视频一区| 欧美日本国产| 综合久久给合久久狠狠狠97色| 亚洲人成人一区二区三区| 亚洲激情图片qvod| 午夜宅男欧美| 亚洲第一福利视频在线| 日本丶国产丶欧美色综合| 韩国三级电影一区二区| 欧美va日韩va| 欧美午夜在线视频| 一区二区三区中文在线| 久久野战av| 久久成人羞羞网站| 精品免费国产二区三区| 91女厕偷拍女厕偷拍高清| 中文字幕一区二区三区色视频 | 亚洲一区二区精品视频| 久久中文精品| 极品尤物av久久免费看| 日韩欧美在线网站| 99久久精品免费| 国产精品乱码一区二区三区软件| 精品电影一区| 亚洲成人精品一区二区| 欧美区一区二区三区| jvid福利写真一区二区三区| 中文文精品字幕一区二区| 一区二区精品国产| 日本中文字幕一区二区有限公司| 在线欧美日韩精品| 成人久久18免费网站麻豆| 国产精品午夜在线| 校园激情久久| 久久99精品久久久| 精品欧美黑人一区二区三区| 精品av久久久久电影| 蜜桃av噜噜一区二区三区小说| 欧美电影精品一区二区| 亚洲网址在线| 琪琪久久久久日韩精品| 精品国产污网站| 亚洲高清网站| 免费国产亚洲视频| 久久久久久亚洲综合| 日韩午夜av| 国产尤物一区二区在线| 欧美激情一区二区三区在线| 国产伦精品一区二区三区高清版| 国产一区二区三区综合| 久久精品人人做人人综合| 在线视频日韩| 国产一区二区三区免费观看| 国产精品日日摸夜夜摸av| 色婷婷亚洲综合| 成人av资源站| 亚洲一区二区三区四区不卡| 精品视频在线视频| 欧美日韩岛国| 日韩国产欧美视频| 久久综合九色综合97_久久久| 亚洲综合99| 成人av在线资源网站| 亚洲一级二级在线| 欧美成人艳星乳罩| 国产视频不卡| a在线播放不卡| 午夜在线成人av| 久久久久久9999| 色婷婷国产精品综合在线观看| 91视频在线看| 麻豆一区二区99久久久久| 国产午夜精品在线观看| 在线免费观看日本欧美| 欧美精品观看| 韩日精品视频一区| 亚洲免费观看在线视频| 日韩欧美自拍偷拍| 亚洲欧美清纯在线制服| 成年人国产精品| 日韩精品亚洲专区| 中文字幕第一区第二区| 色综合久久精品| 亚洲欧美在线网| 久久精品国产成人一区二区三区| 国产精品久久三| 日韩欧美一区二区视频| 国产精品夜夜夜| proumb性欧美在线观看| 久久精品国产一区二区三区免费看| 国产精品久久久久久户外露出| 欧美日韩一区二区三区在线看| 欧美午夜精品| 国产精品456| 亚洲国产成人精品视频| 中文字幕不卡在线观看| 69p69国产精品| 一本到不卡精品视频在线观看| 国产一在线精品一区在线观看| 国产成人av影院| 日本欧美大码aⅴ在线播放| 亚洲天堂免费在线观看视频| 日韩三级免费观看| 老鸭窝91久久精品色噜噜导演| 欧美午夜不卡| 成人三级在线视频| 麻豆91免费观看| 一卡二卡三卡日韩欧美| 国产精品国产自产拍在线| 欧美精品一区二区三区久久久 | 91精品国产色综合久久不卡蜜臀 | 91国在线观看| 在线一区欧美| 精久久久久久| 丁香五精品蜜臀久久久久99网站| 免费在线看成人av| 亚洲国产毛片aaaaa无费看| 国产精品夫妻自拍| 久久久久久久一区| 日韩欧美在线影院| 欧美色视频在线观看| 国产模特精品视频久久久久| 欧美视频四区| av资源站一区| 国产成人午夜高潮毛片| 日本vs亚洲vs韩国一区三区二区| 亚洲在线免费播放| 欧美一区二区三区免费在线看| 美女视频一区免费观看| 亚洲高清自拍| 欧美精品亚洲| 91亚洲精品乱码久久久久久蜜桃 | aa级大片欧美| 成人做爰69片免费看网站| 国模娜娜一区二区三区| 麻豆成人在线观看| 免费观看成人av| 日韩国产在线观看一区| 亚洲成人av电影| 亚洲成人在线网站| 亚洲主播在线播放| 亚洲视频 欧洲视频| 国产精品欧美极品| 国产精品美女一区二区在线观看| 欧美激情中文字幕一区二区| 国产欧美精品一区二区色综合| 国产亚洲成年网址在线观看| 国产日韩高清在线| 久久久国产精华| 日本一区二区三区久久久久久久久不 | 樱花草国产18久久久久| 亚洲美女少妇撒尿| 亚洲色图另类专区| 亚洲欧美国产77777| 亚洲精品日日夜夜| 色天天综合久久久久综合片| 免费久久99精品国产自| 老鸭窝91久久精品色噜噜导演| 亚洲一区三区在线观看| 香蕉免费一区二区三区在线观看| 久久久国产精品一区二区中文| 精品一区二区三区视频| 精品一区精品二区高清| 在线视频精品一区| 色综合天天视频在线观看| 风间由美一区二区av101| 激情小说亚洲一区| 最新成人av在线| 视频一区欧美精品| 亚洲成人福利片| 亚洲综合偷拍欧美一区色|