溫馨提示×

php-fpm錯誤日志如何分析

小樊
43
2025-10-05 17:47:30
欄目: 編程語言

一、定位PHP-FPM錯誤日志文件
PHP-FPM的錯誤日志路徑通常由配置文件決定,默認常見位置包括:

  • /var/log/php-fpm/error.log
  • /var/log/php-fpm/www-error.log
  • /var/log/php7.x-fpm.logx為PHP版本號,如7.4、8.2)

可通過以下命令快速查找:

sudo find /var/log -name "*php-fpm*log"

若路徑未確定,可檢查PHP-FPM主配置文件(/etc/php/{version}/fpm/php-fpm.conf)或pool配置文件(/etc/php/{version}/fpm/pool.d/www.conf)中的error_log指令。

二、常用日志查看與分析命令

  1. 實時查看最新日志
    使用tail -f命令跟蹤日志文件的實時更新,快速捕捉新出現的錯誤:
    sudo tail -f /var/log/php-fpm/error.log
    
  2. 過濾特定錯誤類型
    grep命令篩選關鍵詞(如“error”“fatal”“warning”),縮小分析范圍:
    sudo grep -i "error" /var/log/php-fpm/error.log      # 查找錯誤信息
    sudo grep -i "fatal" /var/log/php-fpm/error.log     # 查找致命錯誤
    sudo grep -i "warning" /var/log/php-fpm/error.log   # 查找警告信息
    
  3. 統計高頻錯誤
    結合sortuniq命令,統計重復出現的錯誤次數,定位高頻問題:
    sudo grep "PHP Fatal error" /var/log/php-fpm/error.log | sort | uniq -c | sort -rn
    
  4. 查看慢日志(性能分析)
    若啟用了慢日志(需提前配置slowlog參數),可通過以下命令分析慢請求:
    sudo tail -f /var/log/php-fpm/www-slow.log          # 慢日志路徑需根據配置調整
    
    常用慢日志分析命令(找出執行時間最長的請求):
    sudo awk '/^.*script_filename.*$/{print $0}' /var/log/php-fpm/www-slow.log | sort -k 10 -nr | head -10
    

三、常見錯誤類型及解讀

  1. PHP語法/運行時錯誤
    日志中會出現PHP Fatal error(致命錯誤,腳本終止)、PHP Warning(警告,腳本繼續執行)、PHP Notice(通知,輕微問題)。
    示例:

    [01-Sep-2023 12:34:56] PHP Fatal error: Uncaught Error: Call to undefined function foo() in /var/www/my_script.php:12
    Stack trace:
    #0 /var/www/my_script.php(12): foo()
    #1 {main}
    thrown in /var/www/my_script.php on line 12
    

    解讀:腳本/var/www/my_script.php第12行調用了未定義的函數foo(),導致致命錯誤。

  2. 權限問題
    日志中出現Permission denied(權限被拒絕),通常因PHP-FPM進程用戶(如www-data)無權訪問腳本、目錄或套接字文件。
    示例:

    [01-Sep-2023 12:35:00] WARNING: [pool www] child 1234 said into stderr: "ERROR: Unable to open primary script: /var/www/html/index.php (Permission denied)"
    

    解讀:www-data用戶無法讀取/var/www/html/index.php文件。

  3. 端口/套接字沖突
    日志中出現Address already in use(地址已被使用)或socket already in use(套接字已被使用),因PHP-FPM監聽的端口或套接字被其他進程占用。
    示例:

    [01-Sep-2023 12:35:05] ERROR: unable to bind listening socket for address '/run/php/php7.4-fpm.sock': Address already in use
    [01-Sep-2023 12:35:05] ERROR: FPM initialization failed
    

    解讀:/run/php/php7.4-fpm.sock套接字已被其他進程占用,導致PHP-FPM無法啟動。

  4. 資源限制
    日志中出現pm.max_children reached(進程數達到上限)、Allowed memory size exhausted(內存耗盡)或unable to create new process(無法創建新進程),因資源不足導致請求無法處理。
    示例:

    [01-Sep-2023 12:35:10] WARNING: [pool www] server reached pm.max_children setting (50), consider raising it
    

    解讀:當前進程數已達pm.max_children設置的50,需增加該值以處理更多并發請求。

  5. 擴展加載失敗
    日志中出現Unable to load dynamic library(無法加載動態庫),因PHP擴展未正確安裝或配置。
    示例:

    [01-Sep-2023 12:35:15] WARNING: [pool www] child 1235 said into stderr: "PHP Startup: Unable to load dynamic library 'redis.so' (tried: /usr/lib/php/20210902/redis.so (/usr/lib/php/20210902/redis.so: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/redis.so.so (/usr/lib/php/20210902/redis.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0"
    

    解讀:redis.so擴展未找到,需安裝或修復該擴展。

四、常見錯誤解決方法

  1. 權限問題

    • 確保PHP-FPM進程用戶(如www-data)對腳本、目錄有讀寫權限:
      sudo chown -R www-data:www-data /var/www/html       # 修改網站目錄所有者
      sudo chmod -R 755 /var/www/html                     # 設置目錄權限
      
    • 檢查www.conf中的listen.ownerlisten.group設置,確保與進程用戶一致:
      sudo nano /etc/php/{version}/fpm/pool.d/www.conf
      # 確認以下兩行
      listen.owner = www-data
      listen.group = www-data
      
    • 重啟PHP-FPM使更改生效:
      sudo systemctl restart php{version}-fpm
      ```。  
      
      
  2. 端口/套接字沖突

    • 使用netstatlsof查找占用進程:
      sudo netstat -tulnp | grep 9000         # 檢查端口占用
      sudo lsof /run/php/php7.4-fpm.sock    # 檢查套接字占用
      
    • 殺死占用進程(確認進程無用后):
      sudo kill -9 <PID>                      # 替換<PID>為占用進程ID
      
    • 修改www.conf中的listen指令(如將端口改為9001或修改套接字路徑):
      sudo nano /etc/php/{version}/fpm/pool.d/www.conf
      # 修改為
      listen = 127.0.0.1:9001                 # 或 listen = /run/php/php7.4-fpm.sock
      
    • 重啟PHP-FPM。
  3. 資源限制

    • 增加pm.max_children(進程數):根據服務器內存調整(如每進程占用100MB內存,1GB內存可設為10):
      sudo nano /etc/php/{version}/fpm/pool.d/www.conf
      pm.max_children = 50                    # 根據實際情況調整
      
    • 增加memory_limit(內存限制):修改php.ini文件:
      sudo nano /etc/php/{version}/fpm/php.ini
      memory_limit = 256M                     # 根據實際情況調整
      
    • 重啟PHP-FPM。
  4. 擴展加載失敗

    • 確認擴展是否安裝:
      php -m | grep redis                     # 檢查redis擴展是否加載
      
    • 安裝缺失的擴展(以redis為例):
      sudo apt-get install php{version}-redis # 替換<version>為PHP版本號
      
    • 注釋掉php.ini中無效的擴展行(如extension=redis.so),或重新安裝擴展。
  5. 配置文件語法錯誤

    • 使用php-fpm -t命令測試配置文件語法:
      sudo php-fpm{version} -t                # 替換<version>為PHP版本號
      
    • 根據輸出提示修復錯誤(如缺少分號、括號不匹配),保存后重啟PHP-FPM。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女