php生命周期


<?php


/*
* 1.php概述
* php快速靈活的腳本語言,支持面向程序和面向對象,語法混合了c java perl和php自己的一些語法,相比來說更加靈活 簡潔 開發效率高 容易上手
* 開源免費 快捷靈活 效率高 類庫資源豐富 擴展c/c++豐富 跨平台(zend虛擬機)
* 2. SPAI 概述
php內核提供語言編譯和執行功能,標准輸入、輸出,SAPI就是php內核的接入層,是內核的入口。
SAPI 常用的有php-fpm cli cgi web模塊 ISAPI五大模式,cli處理模式比較簡單,php-fpm實現了網絡處理模塊的web交互部分
cli模式下,PHP提供的POSIX和Pcntl系列函數實現多進程的應用
子進程的優點:
1. 使用多進程, 子進程結束以后, 內核會負責回收資源
2. 使用多進程,子進程異常退出不會導致整個進程Thread退出. 父進程還有機會重建流程.
3. 一個常駐主進程, 只負責任務分發, 邏輯更清楚.
zend引擎
php語言的核心 編譯執行的部分 編譯器 + 執行器
擴展

* 3. php的執行流程
* 模塊初始化 (注冊常量EG(zend_constants) , 注冊ini配置EG(ini_directives) , 注冊全局變量CG(auto_globals) , 注冊靜態編譯的核心擴展、ini配置餓擴展 , 擴展的初始化 )
* 請求初始化 (gc_reset計數器重置, 初始化編譯器 , 初始化EG(function_table class_table auto_func symbol_table) , 初始化詞法分析器 )
* 腳本執行階段 (腳本加載,詞法分析,語法分析編譯成opcode,編譯成語法抽象樹op_array, zend_execute()調用zvm的指令去執行)
* 請求關閉 ( 依次調用注冊的shutdown函數,清理EG(symbol_table)符號表,調用變量的析構函數, 清理文件句柄 socket連接等, 數據所有flush, 關閉output,關閉編譯器執行器, 關閉內存管理)
* 模塊關閉 ( 清理持久化符號表,清理擴展, 銷毀EG ,釋放PG))
*
* 4.FPM php的fastCGI進程管理器,fastCGI是web服務器和處理程序的通信協議
* fpm 創建一個master和多個worker進程,master通過共享內存來獲取worker進程的信息,通過信號來發送控制信號去殺死一個worker
* fpm可以監聽多個端口,每個端口可以創建一個worker pool ,每個pool下擁有多個worker。
* fpm的 conf文件
* [web1]
listen = 127.0.0.1:9000
...

[web2]
listen = 127.0.0.1:9001
...

* 查看fpm的進程 ps -aux|grep fpm 可以看到master和worker的狀態
root 27155 0.0 0.1 144704 2720 ? Ss 15:16 0:00 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf)
nobody 27156 0.0 0.1 144676 2416 ? S 15:16 0:00 php-fpm: pool web1
nobody 27157 0.0 0.1 144676 2416 ? S 15:16 0:00 php-fpm: pool web1
nobody 27159 0.0 0.1 144680 2376 ? S 15:16 0:00 php-fpm: pool web2
nobody 27160 0.0 0.1 144680 2376 ? S 15:16 0:00 php-fpm: pool web2

* fpm的進程管理方式有三種:static (master按照要求fork出配置要求的數量的worker進程,保存worker進程數不變)
* dynamic (master初始化一定數量的worker,運行期間發現worker空閑率比較低,繼續fork進程去處理,不能超過配置最大進程數,空閑率比較高就殺死一些進程)
* ondemand 這種方式很少使用,不提前分配子進程,請求來了實時分配,處理完請求設置idle_timeout時間去退出worker
*

*
*/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM