国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

深入了解SAPI

CoderBear / 3631人閱讀

摘要:將環境變量和標準輸入發送到子進程子進程完成處理后將標準輸出和錯誤信息從同一連接返回。當子進程關閉連接時,請求便告知處理完成。定義一個子進程最多處理的請求數,達到這個值,進程自動退出。

一、SAPI比較 1. SAPI

服務器應用程序編程接口,就是服務器與編程語言之間交互的接口。比如Linux命令行執行一段PHP代碼,其實是Linux shell通過PHP SAPI傳入一組參數,zend引擎執行后返回給shell。在PHP生命周期的各個階段,一些與服務相關的操作都是通過SAPI接口實現。

php_sapi_name()可以查看當前SAPI接口的類型。  
如 cli(php -r "echo php_sapi_name();")、fpm-fcgi等
2. PHP運行和加載的4個階段

①Minit 模塊初始化階段,可以初始化php擴展、類庫的內部變量、注冊常量,定義模塊使用的類等。

②Rinit 請求初始化階段,在模塊初始化并激活后,會創建PHP運行環境,初始化本次請求所需的環境變量,比如 $_SERVER,$_SESSION

③Rshutdown 請求關閉階段,執行最后的清理工作,釋放所有處理本次請求的資源(申請的變量)。請求完成可能是執行到腳本完成,也可能是調用die()或exit()函數完成

④Mshutdown 模塊回收階段,用于關閉自己的內核子系統,釋放沒存。

3. SAPI 5種運行模式

①單進程模式(CLI,CGI),每次執行PHP腳本,都會執行第二部分講的四個INT和Shutdown事件。當用戶請求數量非常多時,會大量擠占系統的資源如內存,CPU時間等,造成系統開銷很大

②多進程模式(Apache下的prefork MPM模式),會fork很多子進程,每個子進程擁有自己獨立的進程地址空間,在一個子進程中,PHP的生命周期是調用MINT啟動后,執行多次請求(RINT/RSHUTDOWN),在Apache關閉或進程結束后,才會調用MSHUTDOWN進行回收階段。
多進程模型中,每個子進程都是獨立運行,沒有代碼和數據共享,因此一個子進程終止退出和重新生成,不會影響其他子進程的穩定。

③多線程模式(Apache2的Worker MPM),在一個進程下創建多個線程,在同一個進程地址空間執行

④fastCGI模式,nginx+php-fpm就是這個模式,fast-cgi是CGI的升級版本,FastCGI可以看成是一個常駐型的CGI,它可以一直執行著,運行后可以fork多個進程,不用花費時間動態Fork子進程。也不需要每次請求都調用MINT/MSHUTDOWN。
⑤內嵌模式,允許在C/C++語言中調用PHP提供的函數,運行模式和CGI一樣,執行4個階段

二、php-fpm運行原理

CGI:是個協議,服務器發起請求,傳給PHP解析器,傳遞哪些數據,以什么格式,由CGI決定

fastcgi:是個協議,提高CGI性能的,不用每次都去初始化,進程不夠用,會預先啟動幾個進程,進程空閑太多了也會停掉一些,fastCGI對進程的管理,提高性能,節約了資源

php-fpm:實現fastCGI協議的程序,被PHP官方收了,也提供了進程管理功能,進程包含 master 進程和 worker 進程兩種進程。 master 進程只有一個,負責監聽端口分發請求,接收來自 Web Server 的請求,而 worker 進程則一般有多個(具體數量根據實際需要配置),每個進程內部都嵌入了一個 PHP 解釋器,是 PHP 代碼真正執行的地方。

php-cgi:cgi解釋器進程

FastCGI的工作原理:

Web Server啟動時載入FastCGI進程管理器

FastCGI進程管理器自身初始化,啟動多個CGI解釋器(可見多個php-cgi)并等待來自Web Server的連接

當客戶端請求到達Web Server時,FastCGI進程管理器選擇并連接到一個CGI解釋器。Web Server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi

FastCGI子進程完成處理后將標準輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關閉連接時,請求便告知處理完成。FastCGI子進程接著等待并處理來自FastCGI繼承管理器的下一個連接

使用FastCGI,系統開銷小。另外,對于數據庫和Memcache的持續連接可以工作。

數據庫短連接connect:請求關閉階段,釋放請求所用的資源,數據庫連接句柄也會被釋放 

數據庫長連接pconnect:請求關閉后,PHP會收留此次連接,即使主動關閉也不會關閉而是收留,下次有打開相同連接的請求時,PHP直接把收留的句柄拿出來,省去建立連接的過程。

php-fpm實現長連接也需要配合數據庫一些配置,一個進程收留一個連接,數據庫連接的數量就是子進程數量,所以數據庫允許連接數就要大于子進程數。

三、php-fpm進程管理的三種模式

php-fpm支持三種運行模式,分別為static、ondemand、dynamic,默認為dynamic 。

static : 靜態模式,啟動時分配固定的worker進程。只需要考慮max_children的數量,數量取決于cpu的個數和應用的響應時間。

ondemand: 按需分配,啟動時不分配任何進程,當收到用戶請求時才啟動進程。 master進程檢查work進程的數量是否受限,是否有空閑的work進程,沒有就新建work進程。在大流量的系統上master進程會變得繁忙,占用系統cpu資源,不適合大流量環境的部署。

dynamic: 動態模式,啟動時分配固定的進程。伴隨著請求數增加,在設定的浮動范圍調整worker進程。

 pm = dynamic  //動態進程管理,對于專用服務器,可以設置為static,靜態一次性啟動最大子進程數,不會變化。
 
 pm.max_children = 50 //最大子進程數,ps aux可以查看
 
 pm.start_servers = 20 //啟動服務時會啟動的進程數
 
 pm.min_spare_servers = 5 //保證空閑子進程數的最小值,如果空閑進程小于這個值,php-fpm服務會創建新的子進程。
 
 pm.max_spare_servers = 35 //保證空閑子進程數的最大值,如果空閑進程高于這個值,就進行清理。
 
 pm.max_requests = 500  //定義一個子進程最多處理的請求數,達到這個值,進程自動退出。目的是為了控制內存溢出,使內存在一個可控范圍內。但是如果設置的很小,有可能多個進程同時達到這個值,同時重啟,就會導致PHP停止響應直到重啟完畢。設置為0表示一直接受請求。
 
四、php-fpm慢日志

如果一個php網站可以訪問,就是訪問速度變慢了,可以通過php-fpm的慢執行日志,清晰的了解到php的腳本哪里執行時間長,它可以定位到具體的代碼行

 vim /usr/local/php/etc/php-fpm.d/www.conf
 request_slowlog_timeout = 1 //超時時間
 slowlog = /usr/local/php/var/log/www-slow.log
 重啟php-fpm /etc/init.d/php-fpm reload

我在php文件中加了一行sleep(3);,運行之后返回結果

參考文獻

1、https://www.jianshu.com/p/c9a... php-fpm進程管理的三種模式
2、https://www.jb51.net/article/... SAPI的5種運行模式
3、http://blog.51cto.com/1260661... php-fpm慢日志
4、https://www.cnblogs.com/wpjam... php-fpm與mysql長連接

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30052.html

相關文章

  • PHP回顧之執行流程及相關概念

    摘要:通過,腳本層無需過多考慮執行的具體環境,而本身則可以讓針對自己的特點給出特有實現。模式下,也只執行一次。這幾個概念的關系如下網關協議,與語言無關,所以與關系也不大。總結本文簡要回顧了程序的架構和執行流程,并對幾個容易混淆概念做了介紹。 轉載請注明文章出處:https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie we...

    jsdt 評論0 收藏0
  • PHP的生命周期

    摘要:的啟動和終止請求之前的開始階段模塊初始化階段。的生命周期單進程生命周期多進程生命周期多線程的生命周期是一種比較特殊的,容許你在語言中調用提供的函數。不太了解,明天看一下綜述理一下的生命周期,以及整個執行過程。 PHP的架構圖 showImg(https://segmentfault.com/img/remote/1460000013321599?w=514&h=525); SAPI S...

    sf190404 評論0 收藏0
  • 【PHP7源碼分析】PHP中$_POST揭秘

    摘要:和進程的啟動過程類似,啟動過程有種進程角色啟動進程進程和進程。直到請求到來,將連接賦值給對象的字段。注當進程執行完后會再次調用函數,準備監聽新的請求。當讀取到的時,會調用函數對進行解析,將中的以及存儲到結構體中。 運營研發團隊 季偉濱 一、前言 前幾天的工作中,需要通過curl做一次接口測試。讓我意外的是,通過$_POST竟然無法獲取到Content-Type是application...

    sf190404 評論0 收藏0
  • PHP源碼研究

    摘要:最近閑來無事,所以對這門語言進行更深一層的了解,對源碼進行一番研究,是如何執行我們寫的腳本的。引擎是語言實現的最為重要的部分,是最基礎最核心的部分,它的源碼在目錄下,代碼從編譯到執行都是由完成的,后面章節絕大部分的源碼分析都是針對的。 最近閑來無事,所以對PHP這門語言進行更深一層的了解,對源碼進行一番研究,是如何執行我們寫的PHP腳本的。 1.1.3 PHP的相關組成 1.1.3.1...

    Developer 評論0 收藏0
  • SAPI 基于Spring極度簡單的Restful API工具

    摘要:是一個及其精簡的輸出工具,誕生的背景是基于目前微服務開發接口,很多中小型項目開發人員在對接口測試時不僅需要使用等進行業務接口測試,還需要對進行自測。目前只需要開發人員引入后再啟動類加入一行文件即可。中的路徑不要忽略。 SAPI是一個及其精簡的Restful API輸出工具,誕生的背景是基于目前微服務開發接口,很多中小型項目開發人員在對接口測試時不僅需要使用JUnit等進行業務接口測試,...

    Keven 評論0 收藏0

發表評論

0條評論

CoderBear

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<