亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

基于PHP-FPM進程池探秘

2024-05-05 00:00:31
字體:
來源:轉載
供稿:網友

PHP 支持多進程而不支持多線程;PHP-FPM 在進程池中運行多個子進程并發處理所有連接請求。通過 ps 查看PHP-FPM進程池(pm.start_servers = 2)狀態如下:

root@d856fd02d2fe:~# ps aux -LUSER  PID LWP %CPU NLWP %MEM VSZ RSS TTY  STAT START TIME COMMANDroot   1  1 0.0 1 0.0 4504 692 ?  Ss 13:10 0:00 /bin/sh /usr/local/php/bin/php-fpm startroot   7  7 0.0 1 0.4 176076 19304 ?  Ss 13:10 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)www-data  8  8 0.0 1 0.2 176076 8132 ?  S 13:10 0:00 php-fpm: pool wwwwww-data  9  9 0.0 1 0.2 176076 8132 ?  S 13:10 0:00 php-fpm: pool wwwroot  10 10 0.0 1 0.0 18376 3476 ?  Ss 14:11 0:00 bashroot  66 66 0.0 1 0.0 34420 2920 ?  R+ 15:13 0:00 ps aux -L

從列表中可以看出,進程池www中有兩個尚處于空閑狀態的子進程PID 8和 PID 9。注:NLWP指輕量級進程數量,即線程數量。

PHP-FPM(FastCGI Process Manager)是什么?PHP-FPM為PHP-CGI提供進程管理方式,可以有效控制內存和進程,可以平滑重載PHP配置,其master process是常駐內存的。FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行為是將CGI解釋器進程保持在內存中更長時間,不是fork-and-execute,并因此獲得較高的性能。FastCGI支持分布式部署,可以部署在WEB服務器以外的多個主機上。

探秘手段:模擬多線程并發執行

1. 什么是線程:線程有時又稱輕量級進程(Lightweight Process,LWP),通常由線程ID、當前指令指針(PC)、寄存器集合和堆棧組成,是進程中的一個實體,是被系統獨立調度的基本單位;線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,與同屬一個進程的其它線程共享進程所擁有的全部資源。 由于線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。由于進程是資源擁有者,創建、撤消與切換開銷過大,在對稱多處理機(SMP)上同時運行多個線程(Threads)才是更合適的選擇。線程的實體包括程序、數據和線程控制塊(Thread Control Block,TCB),TCB包括以下信息:

(1)線程狀態;

(2)當線程不運行時,被保存的現場資源;

(3)一組執行堆棧;

(4)存放每個線程的局部變量主存;

(5)訪問同一個進程中的主存和其它資源。

但使用多個進程會使得應用程序在出現進程池內的進程崩潰或被攻擊的情況下變得更加健壯。

2. 模擬多線程:

<?php/** * PHP 只支持多進程不支持多線程。 * * PHP-FPM 在進程池中運行多個子進程并發處理所有連接, * 同一個子進程可先后處理多個連接請求,但同一時間 * 只能處理一個連接請求,未處理連接請求將進入隊列等待處理 * */class SimulatedThread{ //模擬線程 private $thread; //主機名 private $host = 'tcp://172.17.0.5'; //端口號 private $port = 80; public function __construct() {  //采用當前時間給線程編號  $this->thread = microtime(true); } /**  * 通過socket發送一個新的HTTP連接請求到本機,  * 此時當前模擬線程既是服務端又是模擬客戶端  *  * 當前(程序)子進程sleep(1)后會延遲1s才繼續執行,但其持有的連接是繼續有效的,  * 不能處理新的連接請求,故這種做法會降低進程池處理并發連接請求的能力,  * 類似延遲處理還有time_nanosleep()、time_sleep_until()、usleep()。  * 而且sleep(1)這種做法并不安全,nginx依然可能出現如下錯誤:  * “epoll_wait() reported that client prematurely closed connection,  * so upstream connection is closed too while connecting to upstream”  *  * @return void  */ public function simulate() {  $run = $_GET['run'] ?? 0;  if ($run++ < 9) {//最多模擬10個線程   $fp = fsockopen($this->host, $this->port);   fputs($fp, "GET {$_SERVER['PHP_SELF']}?run={$run}/r/n/r/n");   sleep(1);//usleep(500)   fclose($fp);  }  $this->log(); } /**  * 日志記錄當前模擬線程運行時間  *  * @return void  */ private function log() {  $fp = fopen('simulated.thread', 'a');  fputs($fp, "Log thread {$this->thread} at " . microtime(true) . "(s)/r/n");  fclose($fp); }}$thread = new SimulatedThread();$thread->simulate();echo "Started to simulate threads...";

探秘匯總:本人通過運行上述腳本后,發現一些可預料但卻不是我曾想到的結果

1. PHP-FPM配置項pm.max_children = 5,simulated.thread記錄如下:

Log thread 1508054181.4236 at 1508054182.4244(s)Log thread 1508054181.4248 at 1508054182.4254(s)Log thread 1508054181.426 at 1508054182.428(s)Log thread 1508054181.6095 at 1508054182.6104(s)Log thread 1508054182.4254 at 1508054183.4262(s)Log thread 1508054183.4272 at 1508054183.4272(s)Log thread 1508054182.4269 at 1508054183.4275(s)Log thread 1508054182.4289 at 1508054183.43(s)Log thread 1508054182.6085 at 1508054183.6091(s)Log thread 1508054182.611 at 1508054183.6118(s)

最新生成的(模擬)線程登記出現在紅色標示條目位置是因為進程池的并發連接處理能力上限為5,因此它只可能出現在第六條以后的位置。

Log thread 1508058075.042 at 1508058076.0428(s)Log thread 1508058075.0432 at 1508058076.0439(s)Log thread 1508058075.0443 at 1508058076.045(s)Log thread 1508058075.6623 at 1508058076.6634(s)Log thread 1508058076.0447 at 1508058077.0455(s)Log thread 1508058076.046 at 1508058077.0466(s)Log thread 1508058077.0465 at 1508058077.0466(s)Log thread 1508058076.0469 at 1508058077.0474(s)Log thread 1508058076.6647 at 1508058077.6659(s)Log thread 1508058076.6664 at 1508058077.6671(s)

有意思的是綠色條目代表的(模擬)線程和紅色條目代表的(模擬)線程的登記時間是一樣的,說明兩個(模擬)線程是并發執行的。

2. PHP-FPM配置項pm.max_children = 10,simulated.thread記錄如下:

Log thread 1508061169.7956 at 1508061170.7963(s)Log thread 1508061169.7966 at 1508061170.7976(s)Log thread 1508061169.7978 at 1508061170.7988(s)Log thread 1508061170.2896 at 1508061171.2901(s)Log thread 1508061170.7972 at 1508061171.7978(s)Log thread 1508061171.7984 at 1508061171.7985(s)Log thread 1508061170.7982 at 1508061171.7986(s)Log thread 1508061170.7994 at 1508061171.8(s)Log thread 1508061171.2907 at 1508061172.2912(s)Log thread 1508061171.2912 at 1508061172.2915(s)

由于服務端并發連接處理能力上限達到10,因此最新生成的(模擬)線程登記可出現在任何位置。

3. 執行usleep(500)延遲,simulated.thread記錄如下:

Log thread 1508059270.3195 at 1508059270.3206(s)Log thread 1508059270.3208 at 1508059270.3219(s)Log thread 1508059270.322 at 1508059270.323(s)Log thread 1508059270.323 at 1508059270.324(s)Log thread 1508059270.3244 at 1508059270.3261(s)Log thread 1508059270.3256 at 1508059270.3271(s)Log thread 1508059270.3275 at 1508059270.3286(s)Log thread 1508059270.3288 at 1508059270.3299(s)Log thread 1508059270.3299 at 1508059270.331(s)Log thread 1508059270.3313 at 1508059270.3314(s)

可見日志記錄順序與(模擬)線程生成的順序一致。usleep延遲的基本單位是微妙(us, 1 s = 1000000 us)。

從以上的記錄可以看出:

1)這些(模擬)線程是第一次請求執行腳本后就自動生成的,一個(模擬)線程緊接著創建了另一個(模擬)線程;

2)這些(模擬)線程中有的是在同一個子進程空間中產生并運行的;

3)前后相鄰(模擬)線程生成時間間隔很小,幾乎是同時產生,或后一個(模擬)線程在前一個(模擬)線程尚未執行結束并退出之前產生;

4)多個(模擬)線程之間可以并發執行。

所以,上述模擬多線程并發的實現是成功的。PHP-FPM進程池中同一個子進程可先后處理多個連接請求,但同一時間只能處理一個連接請求,未處理連接請求將進入隊列等待處理。換句話,同一個子進程不具有并發處理連接請求的能力。

PHP-FPM Pool配置:它允許定義多個池,每個池可定義不同的配置項。以下只是列舉了我在探秘過程中還關注過的其他部分配置項

1、 listen:The address on which to accept FastCGI requests.它支持TCP Socket和unix socket兩種通訊協議。可設置listen = [::]:9000。

2、listen.allowed_clients:List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. 該配置項為逗號分隔的列表,如listen.allowed_clients = 127.0.0.1,172.17.0.5。

3、pm:Choose how the process manager will control the number of child processes. 該配置項設置FPM管理進程池的方式,包括static、dynamic、ondemand三種。

4、pm.max_requests:The number of requests each child process should execute before respawning. This can be useful to work around memory leaks in 3rd party libraries.設置每個子進程處理請求數的上限,對于處理第三方庫中的內存泄漏很有用。

5、pm.status_path:The URI to view the FPM status page.

以上這篇基于PHP-FPM進程池探秘就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品亚洲一区二区| 日韩电影免费在线观看中文字幕| 91精品国产高清自在线| 精品国产精品三级精品av网址| 亚洲人成人99网站| 蜜臀久久99精品久久久久久宅男| 欧美激情网友自拍| 日韩精品有码在线观看| 久久久久在线观看| 亚洲va男人天堂| 欧美日韩视频在线| 国产欧美亚洲精品| 狠狠躁夜夜躁久久躁别揉| 日韩www在线| 国产精品扒开腿做爽爽爽的视频| 98精品在线视频| 91av在线视频观看| 亚洲天堂av在线播放| 欧美午夜性色大片在线观看| 77777少妇光屁股久久一区| 欧美国产日本在线| 国产三级精品网站| 亚洲黄一区二区| 亚洲欧美日本伦理| 欧美与黑人午夜性猛交久久久| 国产精品视频免费在线观看| 久久精品中文字幕免费mv| 久久久成人精品| 国产精品黄色av| 91精品久久久久久久久| 91亚洲精华国产精华| 欧美精品一区二区免费| 日韩精品免费在线视频| 久久精品久久精品亚洲人| 国产精品日韩一区| 精品美女久久久久久免费| 国产色婷婷国产综合在线理论片a| 日韩中文第一页| 97在线视频观看| 91探花福利精品国产自产在线| 日韩视频精品在线| 日韩电影免费观看中文字幕| 亚洲成人中文字幕| 色综合天天狠天天透天天伊人| 精品久久久久久久久久国产| 亚洲国产高潮在线观看| 欧美日韩国产黄| 亚洲人成77777在线观看网| www.久久色.com| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品视频在线观看| 欧美大片免费观看| www.亚洲人.com| 久久精品这里热有精品| 国产美女搞久久| 久久久久久久国产精品视频| 日韩欧美国产激情| 久久久亚洲欧洲日产国码aⅴ| 亚洲男人的天堂在线播放| 精品亚洲一区二区三区在线观看| 欧美www视频在线观看| 国产精品成人在线| 成人福利视频网| 国产欧美韩国高清| 日韩高清人体午夜| 欧美成人国产va精品日本一级| 97国产suv精品一区二区62| 热re99久久精品国产66热| 日韩欧美有码在线| 亚洲欧美视频在线| 国产在线观看不卡| 久久亚洲电影天堂| 国产视频亚洲视频| 亚洲视频在线免费看| 日韩电影免费观看中文字幕| 欧美视频一二三| 亚洲色图综合久久| 欧美成人精品在线视频| 久久99久久99精品免观看粉嫩| 欧日韩不卡在线视频| 国产91精品久久久久| 欧美在线一区二区三区四| 欧美精品在线第一页| 亚洲图片制服诱惑| 欧美激情一二区| 国产精品自产拍高潮在线观看| 日本中文字幕不卡免费| 亚洲激情电影中文字幕| 国产香蕉97碰碰久久人人| www.日本久久久久com.| 久久久久久免费精品| 亚洲国产成人久久| 亚洲精品欧美日韩| 91精品国产综合久久香蕉最新版| 亚洲精品99久久久久| 亚洲国产精品99久久| 中文字幕亚洲一区二区三区五十路| 国产91色在线|免| 国产成人激情小视频| 伦理中文字幕亚洲| 亚洲精品日韩欧美| 成人欧美一区二区三区黑人孕妇| 久久青草精品视频免费观看| 久久的精品视频| 亚洲最大成人在线| 欧美激情视频网站| 国产精品91一区| 亚洲精品乱码久久久久久按摩观| 91在线看www| 亚洲色图13p| 日韩在线激情视频| 欧美日韩国产中文精品字幕自在自线| 国产精品6699| 国产精品丝袜久久久久久高清| 欧美日本高清视频| 欧美大尺度在线观看| 日韩经典一区二区三区| 亚洲春色另类小说| 成人黄色中文字幕| 欧美激情欧美狂野欧美精品| 亚洲精品美女视频| 久久精品精品电影网| 久久久久久国产| 性欧美xxxx| 在线观看中文字幕亚洲| 国产一区二区三区丝袜| 奇米四色中文综合久久| 亚洲美女性生活视频| 欧美久久精品一级黑人c片| 97香蕉久久超级碰碰高清版| 国产精品电影观看| 成人免费福利在线| 成人性生交大片免费看小说| 久久国产天堂福利天堂| 91精品久久久久久久| 狠狠色狠色综合曰曰| 国内精品一区二区三区四区| 欧洲午夜精品久久久| 91情侣偷在线精品国产| 韩国福利视频一区| 国产美女久久精品| 亚洲午夜精品视频| 日韩精品中文字幕视频在线| 国产精品男女猛烈高潮激情| 欧美精品日韩www.p站| 中文字幕一区二区三区电影| 黑人巨大精品欧美一区免费视频| 欧美黑人性生活视频| 欧美精品久久久久久久久| 高清欧美性猛交xxxx黑人猛交| 亚洲第一中文字幕在线观看| 国产精品视频永久免费播放| 欧美激情在线狂野欧美精品| 久久综合电影一区| 亚洲aⅴ男人的天堂在线观看| 国产在线精品一区免费香蕉| 国产精品7m视频| 不卡av在线网站| 成人av电影天堂| 欧美精品激情blacked18| 亚洲男人天堂2024| 欧美电影免费观看| 国产一区二区三区三区在线观看| 2019中文字幕全在线观看|