首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Drupal 模組過多導致最大執行時間超過解決方案

     編輯:PHP 綜合知識

錯誤現象

啟用大量模組後,儲存設定頁面出現空白、導航選單項目消失、點擊無反應。錯誤日誌顯示:

Fatal error: Maximum execution time of 30 seconds exceeded in database.mysqli.inc

根本原因

Drupal 核心、模組安裝/更新、快取重建、資料庫 Schema 更新等操作在模組數量大時極度耗時,超過 PHP 預設 max_execution_time = 30 秒導致腳本中斷,留下不一致狀態 (快取未清、資料庫交易未完成)。

三種解決方案

方案一:修改 php.ini (永久、全域)

; php.ini
max_execution_time = 120  ; 或 300 秒視專案複雜度
; 重啟 Apache / PHP-FPM 生效

適用於開發環境、獨立主機、長期專案。

方案二:程式碼動態設定 (臨時、精準)

<?php
// settings.php 或特定操作前 (如 update.php、drush 指令)
ini_set('max_execution_time', 300); // 5 分鐘
// 或 0 代表無限制 (慎用)
ini_set('max_execution_time', 0);

在 Drupal settings.php 加入:

// settings.php
if (defined('MAINTENANCE_MODE') || strpos($_SERVER['SCRIPT_NAME'], 'update.php') !== false) {
    ini_set('max_execution_time', 300);
}

操作完成後建議移除或註解,避免常態運行時無限制。

方案三:調整 MySQL 封包大小 (針對資料庫層面)

; my.cnf / my.ini (MySQL 設定檔)
[mysqld]
max_allowed_packet = 16M  ; 預設 4M,大量資料寫入需調大
; 重啟 MySQL 生效

若錯誤訊息含 MySQL server has gone away 或 Packet too large,此方案有效。

Drupal 專屬優化建議 (治本)

  1. 使用 Drush 執行重度操作:drush en module_name -y、drush cr (清除快取)、drush updb (資料庫更新)。CLI 模式預設無時間限制,記憶體限制較寬鬆。
  2. 分批啟用模組:依賴關係複雜時,分組啟用,避免單次請求處理過多 Schema 更新。
  3. 啟用快取 / 優化資料庫:Admin > Configuration > Performance 開啟頁面快取、區塊快取、壓縮 CSS/JS。
  4. 增加 PHP 記憶體限制:ini_set('memory_limit', '256M'),大量模組載入需更多記憶體。
  5. 考慮模組精簡:審視是否所有模組皆必要,移除未使用模組減少 Bootstrap 開銷。

環境檢查清單

  • [ ] PHP max_execution_time ≥ 120 (或 CLI 0)
  • [ ] PHP memory_limit ≥ 256M
  • [ ] MySQL max_allowed_packet ≥ 16M
  • [ ] 使用 Drush/Console 執行安裝、更新、匯入操作
  • [ ] 生產環境關閉錯誤顯示、開啟日誌
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved