溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php fpm優(yōu)化的方法是什么

發(fā)布時(shí)間:2022-08-26 15:07:58 來(lái)源:億速云 閱讀:140 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“php fpm優(yōu)化的方法是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“php fpm優(yōu)化的方法是什么”吧!

    Nginx 與 php-fpm 運(yùn)行流程

    • Nginx 查看 nginx.conf 配置文件

    • 加載 nginx 的 fast-cgi 模塊

    • php-fpm 監(jiān)聽 127.0.0.1:9000

    • php-fpm 接收到請(qǐng)求,啟用 worker 進(jìn)程處理請(qǐng)求

    • php-fpm 處理完請(qǐng)求,返回給 nginx

    • nginx 將結(jié)果通過(guò) http 返回給瀏覽器\

    php fpm優(yōu)化的方法是什么

    Nginx 與 php-fpm 通信機(jī)制

      www.test.com
            |
            |
          Nginx
            |
            |
    路由到 www.test.com/index.php
            |
            |
    加載 nginx 的 fast-cgi 模塊
            |
            |
    fast-cgi 監(jiān)聽 127.0.0.1:9000 地址
            |
            |
    www.test.com/index.php 請(qǐng)求到達(dá) 127.0.0.1:9000
            |
            |
         等待處理...

    Nginx 與 php-fpm 的結(jié)合

    • 在 Linux 上,nginx 與 php-fpm 的通信有 tcp socket 和 unix socket 兩種方式。

    • tcp socket 的優(yōu)點(diǎn)是可以跨服務(wù)器,當(dāng) nginx 和 php-fpm 不在同一臺(tái)機(jī)器上時(shí),只能使用這種方式。

    • Unix socket 又叫 IPC (inter-process communication 進(jìn)程間通信) socket,用于實(shí)現(xiàn)同一主機(jī)上的進(jìn)程間通信,這種方式需要在 nginx 配置文件中填寫 php-fpm 的 socket 文件位置。

    兩種方式的數(shù)據(jù)傳輸過(guò)程如下圖所示:

    php fpm優(yōu)化的方法是什么

    php-fpm 進(jìn)程管理

    php-fpm 采用的是 master-worker 的進(jìn)程方式。其中,

    • master 負(fù)責(zé)監(jiān)聽端口,等待鏈接;其次,注冊(cè)信號(hào),可以通過(guò)信息好 master 進(jìn)行管理

    • worker 負(fù)責(zé)處理具體的邏輯
      查看 php-fpm 日志信息

    • 默認(rèn)路徑 -/usr/local/php/var/log

    php-fpm 優(yōu)化

    php.ini 優(yōu)化

    //默認(rèn)情況下服務(wù)器對(duì)上傳文件的大小是有限制的,如果想修改上傳文件的限制可以修改php.ini文件
    file_uploads = On; //是否允許上傳文件 
    upload_max_filesize = 1024M; //上傳文件的最大限制
    post_max_size = 1024M; //通過(guò)post提交的最多數(shù)據(jù)
    max_execution_time = 300; //腳本最長(zhǎng)的執(zhí)行時(shí)間 單位為秒
    max_input_time = 30000; //接收提交的數(shù)據(jù)的時(shí)間限制 單位為秒
    memory_limit = 256M; //每個(gè)腳本使用的最大內(nèi)存  ;在安全模式下,你不能用ini_set()在運(yùn)行時(shí)改變這個(gè)設(shè)置。

    php-fpm.conf 優(yōu)化

    (1)進(jìn)程數(shù)設(shè)置

     pm = dynamic
     pm.max_children = 15  //靜態(tài)方式下開啟的php-fpm進(jìn)程數(shù)量
     pm.start_servers = 5    //動(dòng)態(tài)方式下的起始php-fpm進(jìn)程數(shù)量
     pm.min_spare_servers = 5 //動(dòng)態(tài)方式下 空閑時(shí)間最小的php-fpm進(jìn)程
     pm.max_spare_servers = 5 //動(dòng)態(tài)方式下 空閑時(shí)間最大的php-fpm進(jìn)程

    (2)最大處理請(qǐng)求數(shù)

    最大處理請(qǐng)求數(shù)是指一個(gè)php-fpm的worker進(jìn)程在處理多少個(gè)請(qǐng)求后就終止掉,master進(jìn)程會(huì)重新respawn新的。

    該配置可以避免php解釋器自身或程序引起的memory leaks。 

    默認(rèn)值是500, pm.max_requests = 1024 這樣的規(guī)劃,1秒鐘 

    最大請(qǐng)求數(shù):15*1024=15360 最小請(qǐng)求數(shù):5*1024=7120

    如何避免程序 hang 死

    方法 1:設(shè)置 php-fpm 執(zhí)行的超時(shí)時(shí)間為固定值

    vi php-fpm.conf 修改為request_terminate_timeout = 60

    方法 2:定時(shí) reload php-fpm

    在負(fù)載較高的服務(wù)器上定時(shí)重載 php-fpm

    reload 可以平滑重啟而不影響生產(chǎn)系統(tǒng)的 php 腳本運(yùn)行,每 15 分鐘 reload 一次

    0-59/15 * * * * /usr/local/php/sbin/php-fpm reload

    方法 3:優(yōu)化進(jìn)程池配置

    php-fpm 根據(jù)配置文件內(nèi)容和實(shí)際情況,動(dòng)態(tài)創(chuàng)建子進(jìn)程來(lái)處理請(qǐng)求。

    當(dāng)達(dá)到能夠創(chuàng)建的最大值時(shí),只能阻塞。一個(gè)個(gè)地進(jìn)行執(zhí)行。

    進(jìn)程數(shù)優(yōu)化

    pm = dynamic
    pm.max_children = 300
    pm.start_servers = 20
    pm.min_spare_servers = 5
    pm.max_spare_servers = 35

    最大請(qǐng)求數(shù)優(yōu)化

    pm.max_requests = 10240

    提示:這個(gè)用來(lái)處理因?yàn)?PHP 解析器或引用的第三方庫(kù)時(shí),造成的內(nèi)存泄露問(wèn)題。

    最大請(qǐng)求數(shù):指一個(gè) php-fpm 的工作進(jìn)程在處理多少個(gè)請(qǐng)求后就終止掉。

    最長(zhǎng)執(zhí)行時(shí)間優(yōu)化(php.ini)

    request_terminate_timeout = 20

    提示:這個(gè)是用來(lái)處理因?yàn)?PHP 執(zhí)行時(shí)間超長(zhǎng)而報(bào) 502 錯(cuò)誤的解決。

    這個(gè)時(shí)長(zhǎng)配置可以在 php.ini(max_execution_time)或 php-fpm.conf 中配置均可,為了不影響全局配置,可在 php-fpm.conf 中實(shí)現(xiàn) crontab 定時(shí)任務(wù)把 php-fpm 平滑重啟,這種方式就是使用 crontab 定時(shí)任務(wù)去定時(shí)查詢網(wǎng)站是否 502 了,如果 502 了,就把 php-fpm 平滑重啟

    首先在 /root/ 目錄下面創(chuàng)建腳本

    vim restart-php-fpm.sh

    然后給這個(gè)腳本賦予執(zhí)行權(quán)限

    chmod +x /root/restart-php-fpm.sh

    然后就是編寫腳本內(nèi)容了,上代碼

    #!/bin/bash
    MY_URL="http://www.****.com/"
    RESULT=`curl -I $MY_URL|grep "HTTP/1.1 502"`
    if [ -n "$RESULT" ]; then
     /etc/init.d/php7.2-fpm restart
    fi

    注意:

    我是使用的 /etc/init.d/php7.2-fpm restart 這種方式重啟的

    然后編寫定時(shí)任務(wù)

    crontab -e
    /root/restart-php-fpm.sh

    用 crontab -l 查看定時(shí)任務(wù)列表

    感謝各位的閱讀,以上就是“php fpm優(yōu)化的方法是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)php fpm優(yōu)化的方法是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI