首頁 後端開發 php教程 詳解PHP中PHP-FPM是什麼?有什麼用?

詳解PHP中PHP-FPM是什麼?有什麼用?

Jul 17, 2020 pm 03:26 PM
php php-fpm

詳解PHP中PHP-FPM是什麼?有什麼用?

PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 進程管理器,用於管理PHP 進程池的軟體,用於接受web伺服器的請求。

作用

PHP-FPM提供了更好的PHP進程管理方式,可以有效控制記憶體和進程、可以平滑重載PHP配置。  【相關推薦:PHP教學

(1). 為什麼會出現php-fpm

fpm的出現全部因為php-fastcgi出現。為了很好的管理php-fastcgi而實現的一個程式

(2). 什麼是php-fastcgi

php-fastcgi 只是一個cgi程式,只會解析php請求,並且傳回結果,不會管理(因此才出現的php-fpm)。

(3)為什麼不叫php-cgi

其實在php-fastcgi出現之前是有一個php-cgi存在的,只是它的執行效率低下,因此被php-fastcgi取代。

(4)那fastcgi和cgi有什麼差別呢?

親們,這區別就大了,當一個服務web-server(nginx)分發過來請求的時候,透過匹配後綴知道該請求是個動態的php請求,會把這個請求轉給php。

在cgi的年代,思想比較保守,總是一個請求過來後,去讀取php.ini裡的基礎配置信息,初始化執行環境,每次都要不停的去創建一個進程,讀取配置,初始化環境,返回數據,退出進程,久而久之,啟動進程的工作變的乏味無趣特別累。

當php來到了5的時代,大家對這種工作方式特別反感,想偷懶的人就拼命的想,我可不可以讓cgi一次啟動一個主進程(master),讓他只讀取一次配置,然後在啟動多個工作進程(worker),當一個請求來的時候,透過master傳遞給worker這樣就可以避免重複勞動了。於是就產生了fastcgi。

(5)fastcgi這麼好,啟動的worker用完怎麼辦?
當worker不夠的時候,master會透過配置裡的信息,動態啟動worker,等空閒的時候可以收回worker

(6)到現在還是沒明白php-fpm 是個什麼東西?
就是來管理啟動一個master進程和多個worker進程的程式.PHP-FPM 會建立一個主進程,控制何時以及如何將HTTP請求轉送給一個或多個子程序處理。

PHP-FPM主程序還控制著什麼時候創建(處理Web應用更多的流量)和銷毀(子進程運行時間太久或不再需要了)PHP子進程。 PHP-FPM行程池中的每個行程存在的時間都比單一HTTP請求長,可以處

#理10、50、100、500或更多的HTTP請求。

安裝

PHP在 5.3.3 之後已經把php-fpm併入到php的核心程式碼中了。所以php-fpm不需要單獨的下載安裝。

要想php支援php-fpm,只要在編譯php原始碼的時候帶 --enable-fpm 就可以了。

全域設定

在Centos中,PHP-FPM 的主設定檔是 /etc/php7/php-fpm.conf。

指定一段時間內有指定個子程序失效了,PHP-FPM重啟:

#在指定的一段时间内,如果失效的PHP-FPM子进程数超过这个值,PHP-FPM主进程将优雅重启。
emergency_restart_threshold = 10

#设定emergency_restart_interval 设置采用的时间跨度。
emergency_restart_interval = 1m
登入後複製

設定進程池

PHP-FPM設定檔其餘的內容是一個名為Pool Defintions的區域。這個區域裡的設定用戶設定每個PHP-FPM進程池。 PHP-FPM進程池中是一系列相關的PHP子進程。

通常一個PHP應用程式有自己一個進程池

Centos在PHP-FPM主設定檔的頂端引入進程池定義檔:

include=/etc/php7/php-fpm.d/*.conf
登入後複製

#www.conf 是PHP-FPM進程池的預設設定檔

user= nobody
#拥有这个 PHP-FPM进程池中子进程的系统用户。要把这个设置的值设用的非根用户的用户名。

group = nobody
#拥有这个 PHP-FPM进程池中子进程的系统用户组。要把这个设置的值设应用的非根用户所属的用户组名。

listen=[::]]:9000
#PHP-FPM进程池监听的IP地址和端口号,让 PHP-FPM 只接受 nginx从这里传入的请求。

listen. allowed clients =127.0.0.1
#可以向这个 PHP-FPM进程池发送请求的IP地址(一个或多个)。

pm.max children =51
#这个设置设定任何时间点 PHP-FPM进程池中最多能有多少个进程。这个设置没有绝对正确的值,你应该测试你的PHP应用,确定每个PHP进程需要使用多少内存,然后把这个设置设为设备可用内存能容纳的PHP进程总数。对大多数中小型PHP应用来说,每个PHP进程要使用5~15MB内存(具体用量可能有差异)。 假设我们使用设备为这个PHP-FPM进程池分配了512MB可用内存,那么可以把这个设置设为(512MB总内存)/(每个进程使用10MB) = 51个进程。

...
登入後複製

編輯保存,重新啟動PHP-FPM主程序:

sudo systemctl restart php-fpm.service
登入後複製

PHP-FPM進程池的設定詳情請參閱 http://php.net/manual/install.fpm.configuration.php

參考Company開發環境

測試環境的設定如下:

[www]
user = nobody               #进程的发起用户和用户组,用户user是必须设置,group不是  nobody 任意用户
group = nobody

listen = [::]:9000          #监听ip和端口,[::] 代表任意ip
chdir = /app                #在程序启动时将会改变到指定的位置(这个是相对路径,相对当前路径或chroot后的“/”目录) 

pm = dynamic                #选择进程池管理器如何控制子进程的数量  #static: 对于子进程的开启数路给定一个锁定的值(pm.max_children) #dynamic: 子进程的数目为动态的,它的数目基于下面的指令的值(以下为dynamic适用参数)
pm.max_children = 16        #同一时刻能够存货的最大子进程的数量
pm.start_servers = 4        #在启动时启动的子进程数量
pm.min_spare_servers = 2    #处于空闲"idle"状态的最小子进程,如果空闲进程数量小于这个值,那么相应的子进程会被创建
pm.max_spare_servers = 16   #最大空闲子进程数量,空闲子进程数量超过这个值,那么相应的子进程会被杀掉。
catch_workers_output = Yes  #将worker的标准输出和错误输出重定向到主要的错误日志记录中,如果没有设置,根据FastCGI的指定,将会被重定向到/dev/null上
登入後複製

生產環境設定:

轉送請求給PHP-FPM

nginx為例:

server {
       listen       83;
       server_name mobile.com;
       root /app/mobile/web/;

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        location / {
                index  index.html index.htm index.php;
                # Redirect everything that isn't a real file to index.php
                try_files $uri $uri/ /index.php$is_args$args;
        }

        #把HTTP请求转发给PHP-FPM进程池处理
        location ~ .*\.php                 include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass   192.168.33.30:9000;      #监听9000端口
                fastcgi_index  index.php;
                try_files $uri =404;
                #include fastcgi.conf;
        }
        location ~ /\.(ht|svn|git) {
                deny all;
        }
        access_log  /app/wwwlogs/access.log;
        error_log   /app/wwwlogs/error.log;
}
登入後複製

php-fpm啟動,重啟,終止操作

啟動php-fpm:

/usr/sbin/php-fpm
或
/usr/local/php/sbin/php-fpm
登入後複製

php 5.3.3 以後的php-fpm 不再支援 php-fpm 先前具有的/usr/local/php/ sbin/php-fpm (start|stop|reload)等指令,所以不要再看這種老掉牙的指令了,需要使用訊號控制:

master程序可以理解以下訊號

INT, TERM 立刻終止
QUIT 平滑終止
USR1 重新開啟日誌檔案
USR2 平滑重載所有worker進程並重新載入設定和二進位模組

#一個簡單直接的重啟方法:

先查看php-fpm的master行程編號

# ps aux|grep php-fpm
root     21891  0.0  0.0 112660   960 pts/3    R+   16:18   0:00 grep --color=auto php-fpm
root     42891  0.0  0.1 182796  1220 ?        Ss   4月18   0:19 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nobody   42892  0.0  0.6 183000  6516 ?        S    4月18   0:07 php-fpm: pool www
nobody   42893  0.0  0.6 183000  6508 ?        S    4月18   0:17 php-fpm: pool www
登入後複製

重啟php-fpm:

kill -USR2 42891
登入後複製

上面方案一般是沒有產生php-fpm.pid文件時使用,如果要產生php-fpm.pid,使用下面這個方案:

上面master进程可以看到,matster使用的是/usr/local/php/etc/php-fpm.conf这个配置文件,cat /usr/local/php/etc/php-fpm.conf 发现:

[global]
; Pid file
; Note: the default prefix is /usr/local/php/var
; Default Value: none
;pid = run/php-fpm.pid
登入後複製

pid文件路径应该位于/usr/local/php/var/run/php-fpm.pid,由于注释掉,所以没有生成,我们把注释去除,再kill -USR2 42891 重启php-fpm,便会生成pid文件,下次就可以使用以下命令重启,关闭php-fpm了:

php-fpm 关闭:
kill -INT 'cat /usr/local/php/var/run/php-fpm.pid'
php-fpm 重启:
kill -USR2 'cat /usr/local/php/var/run/php-fpm.pid'

相关学习推荐:PHP编程从入门到精通

以上是詳解PHP中PHP-FPM是什麼?有什麼用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1273
29
C# 教程
1252
24
PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

See all articles