當前位置:首頁 » 編程語言 » phpfpm啟動

phpfpm啟動

發布時間: 2022-12-11 13:28:37

linux php-fpm開機自動啟動腳本怎麼用

Linux中crontab是實現定時執行的指令,利用這個指令我們就可以定時執行某一個php文件,從而實現用PHP做Linux自動執行腳本。如何用PHP作Linux自動執行腳本?
在安裝PHP的時候,會產生一個可執行文件,文件名為php.將它 到 /usr/local/bin 下.在終端方式執行php程序:
php -q onlinnum.php
PHP 原本是應用在網頁應用的﹐因此它會送出 HTML 的HEADER﹐但是在此我們是要將 PHP 用作 Shell Script﹐"-q" 就是表示不要送 出 HEADER 的意思.你可以試試看不加上 -q 的顯示結果。此時你已經可以在終端方式下執行PHP 代碼了。 linux命令:cron daemon
這是一個系統中常駐的服務,功能在於執行例行性的工作,如每天一次或每月一 次檢查磁碟。cron daemon 會在每分鍾檢查一次排定的工作表(crontab),看看是否有要執行的指令,所有的輸出會以mail寄給用戶。
設置 crontab
命令:crontab -e
該命令呼叫vi編輯器來編輯執行的清單。例如

Ⅱ 了解PHP-FPM

在伺服器上,當我們查看php進程時,全都是php-fpm進程,大家都知道這個就是php的運行環境,那麼,它到底是個什麼東西呢?

PHP-FPM,就是PHP的FastCGI管理器,用於替換PHP FastCGI的大部分附加功能,在PHP5.3.3後已經成為了PHP的標配。

有小夥伴要問了,FastCGI又是什麼鬼?CGI程序又叫做「通用網關介面」,就是讓Web伺服器和你的應用程序進行交互的一個介面。就像nginx中需要配置的fastcgi_pass,一般我們會使用127.0.0.1:9000或者unix:/tmp/php-cgi.sock來配置這個參數。它的意思就是告訴nginx,過來的請求使用tcp:9000埠的監聽程序來處理或者使用unix/socket來處理。它們都是指向的PHP運行程序。

再說得通俗一點,我們運行php腳本用的是

php-fpm就相當於是這個php命令。nginx通過fastcgi_pass來運行php $nginx_root(nginx配置文件中網站根目錄root配置)下的index.php。所以,如果你用的是python或者其他什麼語言,都可以用它們的cgi程序來讓nginx調用。

FastCGI和CGI又有什麼不同呢?FastCGI是啟動一個socket介面,伺服器應用不需要自己去運行php,只需要向這個socket介面提交請求就可以了。

php-fpm在編譯php時需要添加--enable-fpm。一些通用的集成安裝包如lnmp、phpStudy等都會默認編譯並使用php-fpm,畢竟是標配。

上文中說過nginx可以使用127.0.0.1:9000和unix:/tmp/php-cgi.sock這兩種方式來調用php-fpm。它們有什麼區別呢?

前者,一般帶9000埠號的,是tcp形式的調用。也就是php-fpm啟動了一個監聽進程對9000埠進行監聽。它會調起一個tcp/ip服務,nginx在調用的時候會走一次tcp請求流程,也就是3次握手4次揮手,會走到網路七層中的第四層傳輸層。相對來說這種方式性能會稍差一點,啟動php-fpm後使用nestat查看埠中會出現9000埠的佔用。

後者,使用的是unix套接字socket服務,通過sock文件來交換信息,性能相對好一些,因為它沒有tcp連接過程,也不會有9000埠的佔用。

對於高負載大訪問量的網站還是推薦使用unix方式,對於普通小網站來說,無所謂使用哪個都可以,tcp方式反而更容易配置和理解,也是php-fpm.conf中默認的監聽方式。

php-fpm.conf配置中的listen屬性用來配置監聽,這里的配置要和nginx中的一致,使用tcp的就監聽127.0.0.1:9000,使用unix的就設置成/tmp/php-cgi-56.sock。

以下內容摘自官方文檔:

===========

各自媒體平台均可搜索【硬核項目經理】

Ⅲ docker-compose啟動php-fpm報錯問題

當你的機子關閉了ipv6啟動php-fpm會出現:
address family not supported by protocol
魯莽解決方法用命令 find / -name zz-docker.conf 找到配置文件位置
直接修改listen = [::]:9000 為 listen = 0.0.0.0:9000
官方DockerFIle:
https://github.com/docker-library/php/blob//7.0/fpm/alpine/Dockerfile
一般正確做法是修改建立新的dockerfile,
sed "s/[::]:/0.0.0.0:/g" zz-docker.conf

(/var/lib/docker/aufs/diff//usr/local/etc/php-fpm.d/zz-docker.conf)

另外解決方法就是不用compose,而是建立Dockerfile文件,裡面跑ubuntu,nginx等,然後順便安裝phpfpm,相當於一個鏡像,這樣和外部本機ipv6環境無關啦。

Ⅳ php5.4.6怎樣重啟php-fpm

php5.4中php-fpm怎麼重啟?
php 5.3.3以後 源碼中已經內嵌了 php-fpm,不用象以前的php版本一樣專門打補丁了,只需要在configure的時候添加編譯參數即可。
關於php-fpm的編譯參數有 –enable-fpm –with-fpm-user=www –with-fpm-group=www –with-libevent-dir=libevent位置。
但是,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進程重啟就方便多了。
例子:
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`
說明:
cat部分是php-fpm的進程號,可能是我用的5.4的問題。沒有用php-fpm.pid ,就沒有這個文件。
可以用 ps aux | grep php-fpm,使用第一個進程的進程號,測試可行。

Ⅳ mac配置php-fpm,nginx運行多版本php

1、brew 安裝 php5.6 php5.7 nginx

2、配置php-conf

3、配置虛擬主機

安裝好brew

用brew 命令安裝,如果速度太慢或訪問不了,自行goole brew 換源

brew search php  查看可用的php版本

brew install [email protected]  安裝php5.6

brew install [email protected] 安裝php5.6

brew install nginx       安裝nginx

1、修改php5.6 php-fpm的埠為9056

    cd usr/local/etc/php/5.6 # 到php5.6的目錄下

    vi    php-fpm.conf # 修改文件

        listen = 127.0.0.1:9056  # 修改此埠

        daemonize = yes # 修改為允許後台啟動php-fpm

2、修改php5.6 php-fpm的埠為9070

    cd /usr/local/etc/php/7.1/php-fpm.d # 到php7.1的目錄下

    vi www.conf # 修改埠

        listen = 127.0.0.1:9056  # 修改此埠    

    vi    php-fpm.conf  # 修改文件

         daemonize = yes # 修改為允許後台啟動php-fpm

3、啟動php-fpm

    cd /usr/local/sbin # 到此目錄,建立兩個軟鏈接指向不同版本的php

切換到root用戶

./php-fpm56 

./php-fpm71

啟動後可看到php-fpm的進程,則成功

ps-ef | grep php-fpm

cd /usr/local/etc/nginx/  # 到nginx的目錄下

復制默認的配置文件到server下(此目錄用來存虛擬主機文件)

這里我在server創建了這兩個

vi local.phpinfo56.com.conf # 修改本地域名和nginx代理到php-fpm埠,按照這種方法修改另一個

nginx # 啟動nginx

nginx -s reload # 修改配置文件,重新載入nginx

vi /etc /hosts  # 修改host 加上映射關系

cd  /usr /local/var/www # 在此目錄下建立一個index.php

echo "<?php phpinfo();" > index.php

在瀏覽器訪問可看到

Ⅵ PHP進程管理三種模式

ondemand:按請示創建進程數;

dynamic:初始化啟動number進程數;

static:固定啟動進程數;

php-fpm進程管理一共有三種模式: ondemand、static、dynamic ,我們可以在同一個fpm的master配置三種模式,看下圖1。php-fpm的工作模式和nginx類似,都是一個master,多個worker模型。每個worker都在accept本pool內的監聽套接字(linux已不存在驚群現象)。

ondemand

在php-fpm啟動的時候,不會給這個pool啟動任何一個worker,是按需啟動,當有連接過來才會啟動。

配置文件(我的配置文件地址為:/usr/local/php/etc/php-fpm.conf)

當前pool的名字為test

原理

 ondemand原理圖

1. 從上圖可以看出,新建worker的觸發條件是連接的到來,而不是實際的請求(例如,只進行連接比如telnet,不發請求數據也會新建worker)

2. worker的數量受限於pm.max_children配置,同時受限全局配置process.max(准確的說,三種模式都受限於全局配置)

3.1秒定時器作用

找到空閑worker,如果空閑時間超過pm.process_idle_timeout大小,關閉。這個機制可能會關閉所有的worker。

配置項要求

1. pm.max_children> 0

2. pm.process_idle_timeout> 0,如果不設置,默認10s

優缺點

優點:按流量需求創建,不浪費系統資源(在硬體如此便宜的時代,這個優點略顯雞肋)

缺點:由於php-fpm是短連接的,所以每次請求都會先建立連接,建立連接的過程必然會觸發上圖的執行步驟,所以,在大流量的系統上master進程會變得繁忙,佔用系統cpu資源,不適合大流量環境的部署

dynamic

在php-fpm啟動時,會初始啟動一些worker,在運行過程中動態調整worker數量,worker的數量受限於pm.max_children配置,同時受限全局配置process.max

當前pool的名字為test

原理

dynamic原理圖

1. 1秒定時器作用

檢查空閑worker數量,按照一定策略動態調整worker數量,增加或減少。增加時,worker最大數量<=max_children· <=全局process.max;減少時,只有idle >pm.max_spare_servers時才會關閉一個空閑worker。

idle > pm.max_spare_servers,關閉啟動時間最長的一個worker,結束本次處理

idle >= pm.max_children,列印WARNING日誌,結束本次處理

idle < pm.max_children,計算一個num值,然後啟動num個worker,結束本次處理

配置項要求

1. pm.min_spare_servers/pm.max_spare_servers有效范圍(0,pm.max_children]

2. pm.max_children> 0

3. pm.min_spare_servers<=pm.max_spare_servers

4. pm.start_servers有效范圍[pm.min_spare_servers,pm.max_spare_servers]如果沒有配置,默認pm.min_spare_servers + (pm.max_spare_servers - pm.min_spare_servers) / 2

優缺點

優點:動態擴容,不浪費系統資源,master進程設置的1秒定時器對系統的影響忽略不計;

缺點:如果所有worker都在工作,新的請求到來只能等待master在1秒定時器內再新建一個worker,這時可能最長等待1s;

static

php-fpm啟動採用固定大小數量的worker, 在運行期間也不會擴容,雖然也有1秒的定時器,僅限於統計一些狀態信息,例如空閑worker個數,活動worker個數,網路連接隊列長度等信息。

當前pool的名字為test

原理

配置項要求

1、pm.max_children> 0 必須配置,且只有這一個參數生效

優缺點

如果配置成static,只需要考慮max_children的數量,數量取決於cpu的個數和應用的響應時間,我司配置的是50。

我司不考慮動態的增加減少那麼十幾個或者幾十個worker,我們的內存沒有緊張到這個程度,所以,我們一步到位,把worker數配置到支持最大流量,(哈哈,50也是隨便定的,足矣足矣呢)

最後我們再介紹下worker的工作流程

fastcgi與php-fpm的關系一句話解讀:fastcgi只是通信應用協議,php-fpm就是實現了fastcig協議,並嵌入了一個 PHP 解釋器。

Ⅶ 啟動php-fpm為什麼有啟動了多個進程

php-fpm的兩種進程管理模式 php-fpm的進程數也是可以根據設置分為動態和靜態的。 一種是直接開啟指定數量的php-fpm進程,不再增加或者減少; 另一種則是開始的時候開啟一定數量的php-fpm進程,當請求量變大的時候,動態的增加php-fpm進程數到上限,當空閑的時候自動釋放空閑的進程數到一個下限。 這兩種不同的執行方式,可以根據伺服器的實際需求來進行調整。 這里先說一下涉及到這個的幾個參數吧,他們分別是pm、pm.max_children、pm.start_servers、pm.min_spare_servers和pm.max_spare_servers。 pm表示使用那種方式,有兩個值可以選擇,就是static(靜態)或者dynamic(動態)。 在更老一些的版本中,dynamic被稱作apache-like。這個要注意看配置文件給出的說明了。PHP5.3 php-fpm的默認靜態處理方式會使得php-cgi的進程長期佔用內存而無法釋放,這也是導致nginx出錯的原因之 一,因此可以將php-fpm的處理方式改成apache模式。 下面4個參數的意思分別為: pm.max_children:靜態方式下開啟的php-fpm進程數量。 pm.start_servers:動態方式下的起始php-fpm進程數量。 pm.min_spare_servers:動態方式下的最小php-fpm進程數量。 pm.max_spare_servers:動態方式下的最大php-fpm進程數量。 如果dm設置為static,那麼其實只有pm.max_children這個參數生效。系統會開啟設置的數量個php-fpm進程。 如果dm設置為dynamic,那麼pm.max_children參數失效,後面3個參數生效。系統會在php-fpm運行開始的時候啟動 pm.start_servers個php-fpm進程,然後根據系統的需求動態在pm.min_spare_servers和 pm.max_spare_servers之間調整php-fpm進程數。 那麼,對於我們的伺服器,選擇哪種執行方式比較好呢?事實上,跟Apache一樣,我們運行的PHP程序在執行完成後,或多或少會有內存泄露的問題。 這也是為什麼開始的時候一個php-fpm進程只佔用3M左右內存,運行一段時間後就會上升到20-30M的原因了。所以,動態方式因為會結束掉多餘的進程,可以回收釋放一些內存,所以推薦在內存較少的伺服器或者VPS上使用。具體最大數量根據 內存/20M 得到。比如說512M的VPS,建議pm.max_spare_servers設置為20。至於pm.min_spare_servers,則建議根據伺服器的負載情況來設置,比較合適的值在5~10之間。 然後對於比較大內存的伺服器來說,設置為靜態的話會提高效率。因為頻繁開關php-fpm進程也會有時滯,所以內存夠大的情況下開靜態效果會更好。數量也可以根據內存/30M 得到。比如說2GB內存的伺服器,可以設置為50;4GB內存可以設置為100等。

Ⅷ docker php-fpm 一直重啟問題處理

使用 docker-compose up -d 啟動 php-fpm 容器後會發現容器成功啟動之後會馬上關閉。由於設置了 restart: always 會導致容器再次啟動然後關閉

官方 php-fpm : 7.1 鏡像,使用自定義的 php-fpm 配置。
php-fpm 配置是從現有生產伺服器上復制過來的。配置沒有問題。

看log,發現fpm正常啟動了,然後馬上就退出

跟鏡像中自帶的 php-fpm.conf 比較發現鏡像中使用 daemonize = no ,而我自定義配置中 daemonize = yes 是後台運行的。
那麼很明顯官方鏡像是故意使用 daemonize = no 不讓 fpm 在後台中運行,進而阻止容器退出

修改 php-fpm.conf 中如下
daemonize = no

Ⅸ php-fpm的工作機制

概括來說,fpm 的實現就是創建一個 master 進程,在 master 進程中創建並監聽 socket,然後 fork 出多個子進程,這些子進程各自 accept 請求,子進程的處理非常簡單,它在啟動後阻塞在 accept 上,有請求到達後開始讀取請求數據,讀取完成後開始處理然後再返回,在這期間是不會接收其它請求的,也就是說 fpm 的子進程同時只能響應一個請求,只有把這個請求處理完成後才會 accept 下一個請求,這一點與 nginx 的事件驅動有很大的區別,nginx 的子進程通過 epoll 管理套接字,如果一個請求數據還未發送完成則會處理下一個請求,即一個進程會同時連接多個請求,它是非阻塞的模型,只處理活躍的套接字。

fpm 的 master 進程與 worker 進程之間不會直接進行通信,master 通過共享內存獲取 worker 進程的信息,比如 worker 進程當前狀態、已處理請求數等,當 master 進程要殺掉一個 worker 進程時則通過發送信號的方式通知 worker 進程。

fpm 可以同時監聽多個埠,每個埠對應一個 worker pool,而每個 pool 下對應多個 worker 進程,類似 nginx 中 server 概念。

在 php-fpm.conf 中通過[pool name]聲明一個 worker pool:

啟動 fpm 後查看進程:

具體實現上 worker pool 通過fpm_worker_pool_s這個結構表示,多個 worker pool 組成一個單鏈表

接下來看下 fpm 的啟動流程,從main()函數開始:

fpm_init()主要有以下幾個關鍵操作:

(1) fpm_conf_init_main():

解析 php-fpm.conf 配置文件,分配 worker pool 內存結構並保存到全局變數中:fpm_worker_all_pools,各 worker pool 配置解析到fpm_worker_pool_s->config中。

(2)fpm_scoreboard_init_main():

分配用於記錄 worker 進程運行信息的共享內存,按照 worker pool 的最大 worker 進程數分配,每個 worker pool 分配一個fpm_scoreboard_s結構,pool 下對應的每個 worker 進程分配一個fpm_scoreboard_proc_s結構。
(3)fpm_signals_init_main():

這里會通過socketpair()創建一個管道,這個管道並不是用於 master 與 worker 進程通信的,它只在 master 進程中使用,具體用途在稍後介紹 event 事件處理時再作說明。另外設置 master 的信號處理 handler,當 master 收到 SIGTERM、SIGINT、SIGUSR1、SIGUSR2、SIGCHLD、SIGQUIT 這些信號時將調用sig_handler()處理:

(4)fpm_sockets_init_main()

創建每個 worker pool 的 socket 套接字。
(5)fpm_event_init_main():

啟動 master 的事件管理,fpm 實現了一個事件管理器用於管理 IO、定時事件,其中 IO 事件通過 kqueue、epoll、poll、select 等管理,定時事件就是定時器,一定時間後觸發某個事件。

在fpm_init()初始化完成後接下來就是最關鍵的fpm_run()操作了,此環節將 fork 子進程,啟動進程管理器,另外 master 進程將不會再返回,只有各 worker 進程會返回,也就是說fpm_run()之後的操作均是 worker 進程的。

在 fork 後 worker 進程返回了監聽的套接字繼續 main() 後面的處理,而 master 將永遠阻塞在fpm_event_loop(),接下來分別介紹 master、worker 進程的後續操作。

fpm_run()執行後將 fork 出 worker 進程,worker 進程返回main()中繼續向下執行,後面的流程就是 worker 進程不斷 accept 請求,然後執行 PHP 腳本並返回。整體流程如下:

worker 進程一次請求的處理被劃分為 5 個階段:

worker 處理到各個階段時將會把當前階段更新到fpm_scoreboard_proc_s->request_stage,master 進程正是通過這個標識判斷 worker 進程是否空閑的。

接下來我們來看下 master 是如何管理 worker 進程的,首先介紹下三種不同的進程管理方式:

前面介紹到在fpm_run()中 master 進程將進入fpm_event_loop():

這就是 master 整體的處理,其進程管理主要依賴注冊的幾個事件,接下來我們詳細分析下這幾個事件的功能。

(1)sp[1]管道可讀事件:

在 fpm_init() 階段 master 曾創建了一個全雙工的管道:sp,然後在這里創建了一個 sp[0] 可讀的事件,當 sp[0] 可讀時將交由 fpm_got_signal() 處理,向 sp[1] 寫數據時 sp[0] 才會可讀,那麼什麼時機會向 sp[1] 寫數據呢?前面已經提到了:當 master 收到注冊的那幾種信號時會寫入 sp[1] 端,這個時候將觸發 sp[0] 可讀事件。

這個事件是 master 用於處理信號的,我們根據 master 注冊的信號逐個看下不同用途:

具體處理邏輯在 fpm_got_signal() 函數中,這里不再羅列。

(2)fpm_pctl_perform_idle_server_maintenance_heartbeat():

這是進程管理實現的主要事件,master 啟動了一個定時器,每隔 1s 觸發一次,主要用於 dynamic、ondemand 模式下的 worker 管理,master 會定時檢查各 worker pool 的 worker 進程數,通過此定時器實現 worker 數量的控制,處理邏輯如下:

(3)fpm_pctl_heartbeat():

這個事件是用於限制 worker 處理單個請求最大耗時的,php-fpm.conf 中有一個request_terminate_timeout的配置項,如果 worker 處理一個請求的總時長超過了這個值那麼 master 將會向此 worker 進程發送kill -TERM信號殺掉 worker 進程,此配置單位為秒,默認值為 0 表示關閉此機制,另外 fpm 列印的 slow log 也是在這里完成的。

除了上面這幾個事件外還有一個沒有提到,那就是 ondemand 模式下 master 監聽的新請求到達的事件,因為 ondemand 模式下 fpm 啟動時是不會預創建 worker 的,有請求時才會生成子進程,所以請求到達時需要通知 master 進程,這個事件是在fpm_children_create_initial()時注冊的,事件處理函數為fpm_pctl_on_socket_accept(),具體邏輯這里不再展開,比較容易理解。

原文出處: https://www.fanhao.com/2017/10/internal-php-fpm.html

Ⅹ 啟動php-fpm時是怎麼載入php.ini

php.ini:決定php語言運行的環境,支持擴展的模塊,開發環境的配置

php-fpm.conf:進程式控制制管理器配置文件,控制php-cgi的進程數,常駐內存,提高web服務的響應速率,php-cgi運行時會載入這兩個配置文件。

熱點內容
網路訪問升級 發布:2025-01-22 09:18:30 瀏覽:190
櫻花動漫盾之勇者成名錄緩存 發布:2025-01-22 09:14:11 瀏覽:564
圖色模擬腳本是什麼 發布:2025-01-22 09:09:04 瀏覽:164
怎麼重置銀行卡密碼 發布:2025-01-22 09:07:18 瀏覽:334
哪個平台雲伺服器好用 發布:2025-01-22 09:07:16 瀏覽:476
編程貓審判 發布:2025-01-22 08:54:17 瀏覽:142
明日之後怎麼加不同伺服器好友 發布:2025-01-22 08:51:08 瀏覽:206
php代碼格式化 發布:2025-01-22 08:50:22 瀏覽:180
db2plsql 發布:2025-01-22 08:19:10 瀏覽:779
豬豬俠腳本沒反應 發布:2025-01-22 08:08:37 瀏覽:812