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

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

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

瀏覽:2日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲中午字幕| 久久国产精品色av免费看| 欧美91在线| 欧美日韩99| 国产精品一在线观看| 国产欧美亚洲精品a| 中文一区一区三区免费在线观 | 日本亚洲欧洲无免费码在线| 精品视频在线观看网站| 国产日产精品_国产精品毛片| 日本在线不卡视频一二三区| 免费视频一区二区| 日本 国产 欧美色综合| 亚洲资源网站| 日韩av字幕| 欧美成人精品一级| 成人国产精品| 久久国产中文字幕| 好吊日精品视频| 石原莉奈在线亚洲三区| 欧美专区18| 欧美黑人做爰爽爽爽| 国产精品久久国产愉拍| 免费在线播放第一区高清av| 久久天堂影院| 不卡一二三区| 亚洲天堂免费电影| 欧美aa国产视频| 老司机精品久久| 日韩1区2区3区| 久久av超碰| 深夜福利视频一区二区| 激情欧美日韩一区| 亚洲一区二区三区四区电影| 国产欧美88| 极品av在线| 香蕉久久夜色精品国产| 婷婷综合电影| 精品一区电影| 欧美性感美女一区二区| 综合亚洲视频| 精品国产午夜肉伦伦影院| 欧美~级网站不卡| 91午夜精品| 精品丝袜在线| 亚洲精品一区二区在线播放∴| 美腿丝袜亚洲三区| 久久久久国产精品一区三寸| 亚洲主播在线| 麻豆精品视频在线观看| 国产精品免费看| 亚洲电影有码| 国产精品久久777777毛茸茸| 91偷拍一区二区三区精品| 亚洲一区欧美二区| 久久av综合| 好看的av在线不卡观看| 国产欧美丝祙| 1024精品一区二区三区| 久久国内精品| 欧美日韩在线观看视频小说| 日韩精品久久久久久| 日韩伦理一区| 日韩和欧美一区二区三区| 香蕉成人av| 日韩av中文字幕一区| 美女少妇全过程你懂的久久| 日韩精彩视频在线观看| 99久久精品费精品国产| 国产精品久久久网站| 亚洲自拍另类| 桃色一区二区| 国产精品白浆| 国产精品视区| 日韩大片在线| 国产精品资源| 老鸭窝毛片一区二区三区| 超碰99在线| 欧美日韩一区二区三区在线电影| 国产综合色产| 精品视频网站| 亚洲欧美一级| 国产精品xxx在线观看| 久久国产精品久久久久久电车| 老司机免费视频一区二区| 妖精视频成人观看www| 韩国女主播一区二区三区| 亚洲精品乱码| 欧美日韩高清| 精品入口麻豆88视频| 日本综合精品一区| 99热免费精品| 日韩另类视频| 国产a亚洲精品| 国产精品一二| 97精品久久| 美国欧美日韩国产在线播放| 久久久久久自在自线| 国产欧美视频在线| 日韩三级一区| 视频一区欧美日韩| 九一精品国产| 999久久久免费精品国产| 另类综合日韩欧美亚洲| 国产精品一区2区3区| 亚洲精品在线二区| 老鸭窝毛片一区二区三区| 午夜久久福利| 久久视频精品| 91精品蜜臀一区二区三区在线| 风间由美中文字幕在线看视频国产欧美| 久久精品999| 亚洲香蕉视频| 久久亚洲国产精品一区二区| 亚洲少妇一区| 99re国产精品| 黄色亚洲在线| 午夜日韩福利| 午夜欧美精品久久久久久久| 国产99久久久国产精品成人免费| 国产一区调教| 色一区二区三区四区| 精品精品国产三级a∨在线| 国产精品伦一区二区| 国产欧美日韩在线观看视频| 日韩激情视频网站| 亚洲精品三级| 亚洲精品在线国产| 四虎精品一区二区免费| 中文一区一区三区免费在线观 | av日韩中文| 欧美日韩视频网站| 午夜久久中文| 久久久久久久久99精品大| 久久国产日本精品| 一本大道色婷婷在线| 久久麻豆精品| 一区二区亚洲精品| 手机精品视频在线观看| 色综合视频一区二区三区日韩 | 免费视频一区二区三区在线观看| 欧美经典一区| 成人在线观看免费视频| 综合日韩av| 久久精品91| 精品中文一区| 亚洲一区导航| 欧美色综合网| 成人在线视频免费看| 亚洲不卡系列| 黄色精品网站| 日本免费在线视频不卡一不卡二| 久久国产尿小便嘘嘘| 精品亚洲精品| 日韩精品欧美| 亚洲91视频| 久久最新视频| 国产九一精品| 欧美日韩视频免费观看| 亚洲精品一二三区区别| 亚洲精品欧美| 国产一区二区三区久久久久久久久| 精品三级久久| 天堂成人免费av电影一区| 国产精品伦一区二区| 久久婷婷一区| 日韩三级精品| 日韩av在线播放网址| 99国产精品久久久久久久| 欧美日韩亚洲三区| 美女视频黄久久| 亚洲福利专区| 日韩黄色在线观看| 国产专区精品| 午夜在线一区二区| 国产精品羞羞答答在线观看| 快播电影网址老女人久久| 一本综合精品| 日韩成人a**站| 亚洲精品国产嫩草在线观看| 日韩欧美中文字幕一区二区三区| 欧美激情国产在线| 欧美高清不卡| 国产伦精品一区二区三区在线播放 | 国产精选久久| 国产美女高潮在线观看| 国产视频一区在线观看一区免费| 国产亚洲精品美女久久| 99久久亚洲精品| 免费在线观看成人| 久久国产精品免费一区二区三区| 日韩大片免费观看| 亚洲婷婷丁香| 日韩福利一区| 欧美日韩一区二区三区不卡视频| 丝袜美腿诱惑一区二区三区| 婷婷综合福利| 99精品综合| 国产精品久久亚洲不卡| 午夜日韩av|