在傳統的LAMP架構中,PHP與Apache交互時,至少有兩種方式『運行PHP』:php
其中,『運行PHP』是指調用PHP解釋器解釋執行PHP腳本。 html
經過php的'php_sapi_name()’函數可知道,當前系統採用哪一種工做模式。如當值爲’apache2handler’時即表示:mod_php模式。git
Apache的模塊能夠以靜態方式編譯到可執行程序中,也能夠在Apache運行過程當中動態加載(以動態連接庫的方式)。這意味着:能夠對Apache服務器程序進行擴展而無需從新源碼編譯它,甚至無需重啓它。
所須要作的就是:向服務器發送HUP或者AP_SIG_GRACEFUL信號,通知服務器從新加載模塊。
關於向Apache發送HUP信號:github
'Sending the HUP or restart signal to the parent causes it to kill off its children like in TERM, but the parent doesn't exit. It re-reads its configuration files, and re-opens any log files. Then it spawns a new set of children and continues serving hits.
回到mod_php模塊,Apache動態加載模塊的過程:apache
其中PHP7源碼中,PHP模塊(php7_module)的數據結構爲:
‘api
AP_MODULE_DECLARE_DATA module php7_module = { STANDARD20_MODULE_STUFF, /*宏,包括了module結構的前8個字段:版本號、小版本號、模塊索引、模塊名、當前模塊指針、下一個動態加載的模塊指針、魔數、rewrite_args函數指針*/ 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, /* command apr_table_t */ php_ap2_register_hook /* register hooks */ };
其中,php_ap2_register_hook是一系列的hook調用:服務器
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); }
在Apache2.4中若是須要處理請求時,你只須要建立一個鉤子(Hook),掛於請求處理程序上。
一個鉤子,本質上是一條信息:告訴服務器它要麼服務用戶發起的請求要麼只是瞥一眼該請求。Apache全部的模塊(包括mod_rewrite, mod_authn_*, mod_proxy等)均是將鉤子掛於請求程序的各個部分來實現的 - are hooked into specific parts of the request process。php7
modules serve different purposes; Some are authentication/authorization handlers, others are file or script handlers while some third modules rewrite URIs or proxies content.
Apache服務器自己無需知道每一個模塊具體負責處理哪一個部分以及處理什麼,它只須要:在客戶端請求達到的時候詢問下哪一個模塊對這個請求『感興趣』便可,而每一個模塊只需選擇要仍是不要,若是要那按照鉤子定義的內容處理而後返回接口。數據結構
圖片來源於Apache官網。架構
Apache容許外部模塊能夠將自定義的函數注入到本身的請求處理循環中,從而參與Apache的請求處理過程。
經過Hook機制,PHP模塊能夠在Apache請求處理流程中負責處理那些關於php腳本的請求(即負責解釋、執行php腳本)。
具體實現方式能夠詳見在PHP源碼中實現Apahce的ap_hook_post_config鉤子:PHP以模塊方式註冊到Apache的掛鉤上去。這樣在Apache進程運行時一有php請求,就能夠加載動態連接庫(libphp7.so文件)形式的PHP模塊,用來處理php請求。
一、http://stackoverflow.com/ques...
二、http://www.phppan.com/2011/01...
三、https://github.com/php/php-sr...
四、https://github.com/php/php-sr...
五、https://httpd.apache.org/docs...