HOWTO · PHP

PHP ini_set 記憶體限制

選擇單一指令碼或共用設定的 PHP 記憶體限制,檢查有效值,並驗證變更是否生效。

本頁內容

PHP 的 memory_limit 設定會限制指令碼可配置的記憶體量。適當的數值與修改位置,取決於應用程式和 PHP 執行環境。許多安裝環境的記憶體已足以應付工作負載,因此請先檢查有效值,並確認哪些指令碼需要調整。選擇能解決問題的最小影響範圍:只修改單一指令碼,影響範圍限於該次請求;修改 php.ini 則可能影響使用該設定的多個指令碼。(ini_get())

選擇合適的變更範圍

如果只有單一指令碼需要不同的限制,而且執行環境允許修改該設定,請使用 ini_set()。這樣可讓調整貼近需要它的程式碼。如果使用該檔案的 PHP 執行環境所執行的指令碼都應套用相同限制,請使用 php.ini。共用設定可能影響其他無關的應用程式,因此提高限制前,請先考量它們的記憶體用量。不要假設所有主機的預設值都相同,也不要認定一定需要提高限制。

有些主機會透過 .htaccess 或控制台提供額外的設定方式。這些方式是否可用,取決於伺服器、PHP 處理器和主機商的政策。請將它們視為依主機環境而異的替代方案,並在採用前查閱主機商的說明。

檢查目前的 PHP 記憶體限制

請在與受影響指令碼相同類型的 PHP 程序中呼叫 ini_get("memory_limit")。它會傳回該程序目前生效的值;命令列 PHP 與網頁請求使用的值可能不同。若是網頁應用程式,可暫時在相關請求中顯示或記錄此值,診斷完成後再移除輸出。避免在公開頁面上揭露設定細節。

傳回值是 PHP 設定值,例如附有單位後綴的大小。請將它與應用程式的實際需求,以及 PHP 程序可用的記憶體比較。提高設定上限不會增加實體記憶體,也不保證主機能滿足每次記憶體配置。

使用 ini_set() 提高單一指令碼的限制

將設定名稱和非空的大小值(例如 256M)傳給 ini_set()。如果變更成功,函式會傳回先前的值;如果 PHP 無法套用變更,則會傳回 false。之後請再次讀取設定,讓指令碼回報實際生效的值,而不要假設請求一定成功。

請在 PHP 程序中執行以下範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

<?php
$before = ini_get('memory_limit');
$previous = ini_set('memory_limit', '256M');
$after = ini_get('memory_limit');

echo "Before: {$before}\n";
echo 'Change accepted: ' . ($previous !== false ? 'yes' : 'no') . "\n";
echo "Effective limit: {$after}\n";
Before: -1
Change accepted: yes
Effective limit: 256M

此範例會回報自身程序觀察到的值;初始值會因安裝環境而異。程式碼與輸出中的標籤維持英文,依序為 Before、Change accepted 和 Effective limit。成功的指令碼層級變更只適用於目前請求,不會更新共用設定。如果傳回值顯示 PHP 未套用變更,請以有效值進行診斷,並檢查執行環境或主機施加的限制。

在 php.ini 中變更共用限制

首先,確認為受影響指令碼提供服務的 PHP 執行環境載入了哪個 php.ini 檔案。PHP 安裝環境可能會為命令列程序與網頁程序使用不同的設定檔,伺服器也可能載入額外設定。請查看執行環境的設定資訊或主機商文件,以確認目前使用的檔案;沒有一個路徑適用於所有作業系統和安裝環境。

在目前使用的檔案中,找到 memory_limit 指令,並設為預期值,例如 memory_limit = 256M。儲存檔案後,依照 PHP 服務或主機商的指示,讓設定變更生效。所需步驟取決於 PHP 的託管方式,因此不要假設每個環境都使用相同的重新啟動程序。

這項變更可能套用至使用該設定的多個指令碼。如果只有一個應用程式或請求需要較高限制,請優先考慮允許使用的指令碼層級變更,或主機支援的個別網站設定。.htaccess 和控制台選項並非所有環境都提供;使用前請確認該伺服器確實支援。

驗證有效限制並排查變更問題

變更設定後,請在受影響的指令碼或請求中呼叫 ini_get("memory_limit"),並將結果與預期值比較。若修改的是共用設定,請透過你編輯設定檔所屬的相同網頁或命令列執行環境進行驗證。使用不同的 PHP 執行檔檢查,可能會看到不同設定,進而誤以為變更沒有生效。

如果值沒有變化,請確認你修改的是該執行環境載入的檔案、PHP 服務或主機已套用變更,以及主機允許在該範圍設定此指令。若使用 ini_set(),請檢查其傳回值,再查看實際生效的設定。如果設定值正確,但應用程式仍發生記憶體不足,請檢視其工作負載與實際記憶體用量;單純提高上限可能無法解決根本原因。設定的限制應符合程序可用的資源。

參考資料:

  1. PHP 手冊:ini_set()
  2. PHP 手冊:ini_get()
  3. PHP 手冊:memory_limit