【PHP+nginx+php-fpm】探討它們的運行機制和原理


1、PHP+nginx+php-fpm的運行機制和原理

Nginx 是非阻塞IO & IO復用模型,通過操作系統提供的類似 epoll 的功能,可以在一個線程里處理多個客戶端的請求。(非阻塞,無需等待返回)
Nginx 的進程就是線程,即每個進程里只有一個線程,但這一個線程可以服務多個客戶端。

PHP-FPM 是阻塞的單線程模型,pm.max_children 指定的是最大的進程數量,pm.max_requests 指定的是每個進程處理多少個請求后重啟(因為 PHP 偶爾會有內存泄漏,所以需要重啟).
PHP-FPM 的每個進程也只有一個線程,但是一個進程同時只能服務一個客戶端。(阻塞,需等待PHP返回結果)
大多數的 Linux 程序都傾向於使用進程而不是線程,因為 Linux 下相對來說創建進程的開銷比較小,而 Linux 的線程功能又不是很強大。 0

 

總結:

1、nginx和php-fpm都是多進程,一個進程只有一個線程;

2、nginx一個線程是非阻塞/io多路復用/epoll模型,將請求分發后無需等待,僅監聽回調結果

3、php-fpm一個線程是阻塞模型,必須等待該客戶端請求php服務端返回數據,下一個nginx發過來的請求才能被受理

4、PHP本身是單進程單線程的,它只是腳本語言。

 

5、關於redis:redis是單進程單線程模型,它也是非阻塞、I/o多路復用、epoll模型。(面試請回答:單線程。)

                    其實嚴格來說,redis只是在處理網絡請求、數據處理及返回使用的是 單線程(I/O多路復用、epoll),它內部還有其他線程 用來處理數據持久化rdb或aof。如圖:

 


免責聲明!

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



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