欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

看看該服務(wù)器是怎樣啟動pHp,并運(yùn)行pHp中的方法

2023-11-16    分類: 網(wǎng)站建設(shè)

1.WEb服務(wù)器調(diào)用pHp接口

以服務(wù)端為例,看看服務(wù)端是如何啟動pHp并調(diào)用pHp中的方法的。服務(wù)器啟動運(yùn)行pHp時,一般以模塊的形式集成(如果是php5.*版本,則是模塊,模塊的后綴取決于php版本)。結(jié)構(gòu)如下(源碼路徑為php/sapi//.c):

Ap_MODULE_DECLARE_DATA module php7_module = {
    STANDARD20_MODULE_STUFF,/* 宏,包括版本,版本,模塊索引,模塊名,下個模塊指針等信息 */
    create_php_config,      /* create per-directory config structure */
    merge_php_config,       /* merge per-directory config structures */
    NULL,                   /* create per-server config structure */
    NULL,                   /* merge per-server config structures */
    php_dir_cmds,           /* 模塊定義的所有指令 */
    php_ap2_register_hook   /* register hooks */
};

當(dāng)你需要在 pHp 中調(diào)用一個方法時,你只需要通過模塊將請求傳達(dá)給 pHp。 pHp層處理完數(shù)據(jù)后,返回數(shù)據(jù),整個過程就結(jié)束了。 (另外:服務(wù)器啟動pHp的時候,其實(shí)有兩種加載方式,一種是靜態(tài)加載,一種是動態(tài)加載。剛才討論的模塊加載方式可以理解為靜態(tài)加載,即服務(wù)端需要重新啟動加載pHp;

動態(tài)加載不需要重啟服務(wù)器。只需通過發(fā)送信號將固定的pHp模塊加載到服務(wù)器即可達(dá)到pHp啟動的目的。但是在動態(tài)加載之前,需要將加載模塊編譯成動態(tài)鏈接庫。然后將其配置到服務(wù)器配置文件中)。上面已經(jīng)給出了pHp中的結(jié)構(gòu),下面給出了服務(wù)器端對應(yīng)的結(jié)構(gòu),如下(中間是源碼,下同):

struct module_struct {
    int version;
    int minor_version;
    int module_index;
    const char *name;
    void *dynamic_load_handle;
    struct module_struct *next;
    unsigned long magic;
    void (*rewrite_args) (process_rec *process);
    void *(*create_dir_config) (apr_pool_t *p, char *dir);
    void *(*merge_dir_config) (apr_pool_t *p, void *base_conf, void *new_conf);
    void *(*create_server_config) (apr_pool_t *p, server_rec *s);
    void *(*merge_server_config) (apr_pool_t *p, void *base_conf, void *new_conf);
    const command_rec *cmds;
    void (*register_hooks) (apr_pool_t *p);
}

可以看出and還是有很大區(qū)別的,但是如果你看到.UFF宏的定義,你可能會覺得這兩個結(jié)構(gòu)很相似。其實(shí)這個宏定義了前8個參數(shù),定義如下:

#define STANDARD20_MODULE_STUFF MODULE_MAGIC_NUMbER_MAJOR, 
    MODULE_MAGIC_NUMbER_MINOR, 
    -1, 
    __FILE__, 
    NULL, 
    NULL, 
    MODULE_MAGIC_COOKIE, 
    NULL /* rewrite args spot */

那么。定義了模塊的所有指令集php獲取apache版本,具體定義內(nèi)容如下(代碼路徑為php/sapi//.c):

const command_rec php_dir_cmds[] =
{
    Ap_INIT_TAKE2("php_value", php_apache_value_handler, NULL, OR_OpTIONS, "pHp Value Modifier"),
    Ap_INIT_TAKE2("php_flag", php_apache_flag_handler, NULL, OR_OpTIONS, "pHp Flag Modifier"),
    Ap_INIT_TAKE2("php_admin_value", php_apache_admin_value_handler, NULL, ACCESS_CONF|RSRC_CONF, "pHp Value Modifier (Admin)
    "),
    Ap_INIT_TAKE2("php_admin_flag", php_apache_admin_flag_handler, NULL, ACCESS_CONF|RSRC_CONF, "pHp Flag Modifier (Admin)"),
    Ap_INIT_TAKE1("pHpINIDir", php_apache_phpini_set, NULL, RSRC_CONF, "Directory containing the php.ini file"),
    {NULL}
};

也就是說pHp層只提供了以上5條指令,每條指令的源碼也在.c文件中。最后是.k,其定義如下(代碼路徑為php/sapi //.c):

void php_ap2_register_hook(apr_pool_t *p)
{
    ap_hook_pre_config(php_pre_config, NULL, NULL, ApR_HOOK_MIDDLE);
    ap_hook_post_config(php_apache_server_startup, NULL, NULL, ApR_HOOK_MIDDLE);
    ap_hook_handler(php_handler, NULL, NULL, ApR_HOOK_MIDDLE);
#ifdef ZEND_SIGNALS
    ap_hook_child_init(zend_signal_init, NULL, NULL, ApR_HOOK_MIDDLE);
#endif
    ap_hook_child_init(php_apache_child_init, NULL, NULL, ApR_HOOK_MIDDLE);
}

.k 函數(shù)包含 4 個鉤子和相應(yīng)的處理函數(shù),是啟動鉤子。它們在服務(wù)器啟動時被調(diào)用。鉤子是一個請求鉤子。在發(fā)出服務(wù)器請求時調(diào)用它。通過這些鉤子,你可以通過服務(wù)器啟動pHp。

我會來的。我想你已經(jīng)知道WEb服務(wù)器如何啟動pHp并調(diào)用pHp中的方法了。下面我就給大家講講pHp是如何調(diào)用WEb服務(wù)器接口的。

2.pHp 調(diào)用WEb服務(wù)器接口 在我們講這個問題之前,我們需要了解什么是SApI。 SApI 實(shí)際上是與服務(wù)器抽象層觀察到的通用協(xié)議。很容易理解,當(dāng)pHp需要調(diào)用服務(wù)端的某個方法時,比如清除緩存,清除緩存的實(shí)現(xiàn)方法是在服務(wù)端實(shí)現(xiàn)的,pHp層根本不知道。服務(wù)端的方法怎么調(diào)用,怎么做?

這時候需要雙方做一個約定,然后服務(wù)器向pHp提供一套約定好的接口。我們將這些與服務(wù)器抽象層的通用協(xié)議稱為 SApI 接口。

問題來了。對于服務(wù)器php獲取apache版本,我們可以提供一套SApI,但是如果下次有其他服務(wù)器或其他“第三方”來,我們是否還需要為它們提供單獨(dú)的SApI?毛布?

我們聰明的pHp開發(fā)者一定想到了這個,就是為所有“第三方”提供一套通用的SApI接口,但是你可能會問,如果新的“第三方”需要這些接口,你的通用SApI不支持,怎么辦?我的理解是,在 pHp 的通用 SApI 接口中添加新功能只是個人意見。一般的SApI結(jié)構(gòu)如下(源碼路徑:php/main/SApI.h):

struct _sapi_module_struct {
    char *name;         // 名字
    char *pretty_name;  // 更好理解的名字
    int (*startup)(struct _sapi_module_struct *sapi_module);    // 啟動函數(shù)
    int (*shutdown)(struct _sapi_module_struct *sapi_module);   // 關(guān)閉函數(shù)
    int (*activate)(TSRMLS_D);           // 激活
    int (*deactivate)(TSRMLS_D);         // 停用
    void (*flush)(void *server_context); // flush
    char *(*read_cookies)(TSRMLS_D);     //read Cookies
    //...
};

這個結(jié)構(gòu)的變量很多,就不一一列舉了。我簡單解釋一下里面的變量:SApI初始化時調(diào)用的函數(shù),該函數(shù)用于釋放SApI的數(shù)據(jù)結(jié)構(gòu)和內(nèi)存。它在 SApI 中激活。調(diào)用時,則將該函數(shù)得到的值賦給SG()。

那么對于pHp提供的通用SApI,服務(wù)端如何自定義自己的接口呢?具體結(jié)構(gòu)如下(源碼路徑為php/sapi//.c):

static sapi_module_struct apache2_sapi_module = {
    "apache2handler",
    "Apache 2.0 Handler",
    php_apache2_startup,            /* startup */
    php_module_shutdown_wrapper,    /* shutdown */
    NULL,                           /* activate */
    NULL,                           /* deactivate */
    php_apache_sapi_ub_write,       /* unbuffered write */
    php_apache_sapi_flush,          /* flush */
    php_apache_sapi_get_stat,       /* get uid */
    php_apache_sapi_getenv,         /* getenv */
    php_error,                      /* error handler */
    php_apache_sapi_header_handler, /* header handler */
    php_apache_sapi_send_headers,   /* send headers handler */
    NULL,                           /* send header handler */
    php_apache_sapi_read_post,      /* read pOST data */
    php_apache_sapi_read_cookies,   /* read Cookies */
    php_apache_sapi_register_variables,
    php_apache_sapi_log_message,        /* Log message */
    php_apache_sapi_get_request_time,   /* Request Time */
    NULL,                               /* Child Terminate */
    STANDARD_SApI_MODULE_pROpERTIES
};

在上述源碼目錄php/sapi//中,php/sapi目錄放在通過SApI調(diào)用的“第三方”下。目錄結(jié)構(gòu)如下圖所示,目錄php/sapi/都是與pHp交互的接口,.c是pHp與約定的SApI之間的接口文件。

看到這里,大家應(yīng)該對pHp層如何調(diào)用服務(wù)層接口有了基本的了解。為了鞏固以上知識,下面來個栗子,即在服務(wù)器環(huán)境下閱讀:

SG(request_info).cookie_data = sapi_module.read_cookies(TSRMLS_C);

對于任何一個在加載的時候,我們都會指定它的方法是一個函數(shù),這樣就實(shí)現(xiàn)了pHp層調(diào)用的接口。是不是很簡單?

進(jìn)階階段總會有一些問題和瓶頸。寫太多業(yè)務(wù)代碼沒有方向感。我不知道從哪里開始改進(jìn)。我整理了一些這方面的資料,包括但不限于:分布式架構(gòu)、高擴(kuò)展性、高性能、高并發(fā)、服務(wù)器性能調(diào)優(yōu)、Tp6、YII2、、、、、優(yōu)化、腳本、微服務(wù)等進(jìn)階知識點(diǎn)都可以與您免費(fèi)分享。需要點(diǎn)這里

最后,祝你在面試中一切順利,得到你最喜歡的。如果你想和一群3-8年的資深開發(fā)者交流學(xué)習(xí),你需要

請點(diǎn)擊這里 .im

本文名稱:看看該服務(wù)器是怎樣啟動pHp,并運(yùn)行pHp中的方法
文章出自:http://aaarwkj.com/news39/294689.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、服務(wù)器托管、企業(yè)網(wǎng)站制作、ChatGPT微信公眾號、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
蜜臀av首页在线观看| 精品一区二区在线欧美日韩| 国产精品高清国产三级av| 超碰国产精品一区二区| 国产三级三级三级三级| 欧美性色黄大片人与善| 久久久久久精品人妻网| 剧情av一区二区在线| 国产成人综合精品久久| 五月天男人的天堂精品| 一区二区三区在线观看精品| 日本一区二区三区伦理| 97精品国产高清在线| 亚洲毛片免费视频久久| 综合激情四射亚洲激情| 夜夜嗨av一区二区三区| 中文字幕乱码高清免费| 亚洲天堂av在线有码| 东京一区二区三区四区黄片 | 亚洲中文字幕乱码第一页| 91日韩人妻一区二区三区| 日本一二三四卡久久精品| 中文字幕熟女av一区二区| 日本免费熟女一区二区| 一本色桃子精品久久中文字幕| 日韩欧美亚洲福利在线| 九九久久亚洲av成人乱片| 亚洲一区二区三区无人区| 亚洲三区久久婷婷激情| 粗长挺进新婚人妻诗岚| 丰满人妻一区二区三区免费| 国产精品视频在线播放| 亚洲欧美综合精品二区| 精品欧美激情精品一区| 亚洲成在人线免费观看| 日本国内一区二区三区四区视频| 国产精品粉嫩在线播放| 亚洲中文字幕少妇熟女美妇| 国产午夜男人天堂手机| 欧美高清视频看片在线观看| 欧美中日韩一区二区三区 |