這些函式的行為會受到 php.ini 中設定的影響。
雖然預設的 APCu 設定適用於許多安裝環境,但進階使用者應考慮調整以下參數。
設定 APCu 時需要決定一件事。要分配多少記憶體給 APCu。控制此設定的 ini 指令是 apc.shm_size
,請仔細閱讀以下相關章節。
伺服器執行後,應將擴充套件隨附的 apc.php
指令碼複製到文件根目錄下的某個位置,並使用瀏覽器檢視,因為它提供了 APCu 內部運作方式的詳細分析。如果 PHP 中啟用了 GD,它甚至會顯示一些有趣的圖表。
如果 APCu 正在運作,左側的「快取已滿計數」(Cache full count
)數字會顯示快取達到最大容量並必須逐出項目以釋放記憶體的次數。在逐出過程中,如果指定了 apc.ttl
,APCu 會先嘗試移除過期的項目,即 TTL 已過期或未設定 TTL 且在過去 apc.ttl
秒內未被存取的項目。如果未設定 apc.ttl
,或移除過期項目無法釋放足夠的空間,APCu 將會清除整個快取。
在設定良好的快取中,逐出的次數應該很少。如果快取不斷被填滿,因此必須強制釋放,所產生的頻繁變動將會對腳本效能造成負面影響。減少此數字最簡單的方法是為 APCu 分配更多記憶體。
當 APCu 使用 mmap 支援(記憶體映射)編譯時,它只會使用一個記憶體區段,不像使用 SHM(SysV 共享記憶體)支援建置的 APCu 會使用多個記憶體區段。MMAP 沒有像 SHM 在 /proc/sys/kernel/shmmax
中那樣的最大限制。一般建議使用 MMAP 支援,因為它可以在網路伺服器重新啟動時更快地回收記憶體,並且總體上減少啟動時的記憶體配置影響。
名稱 | 預設值 | 可變更性 | 變更記錄 |
---|---|---|---|
apc.enabled | 1 | INI_SYSTEM |
|
apc.shm_segments | 1 | INI_SYSTEM |
|
apc.shm_size | "32M" | INI_SYSTEM |
|
apc.entries_hint | 4096 | INI_SYSTEM |
|
apc.ttl | 0 | INI_SYSTEM |
|
apc.gc_ttl | 3600 | INI_SYSTEM |
|
apc.mmap_file_mask | NULL | INI_SYSTEM |
|
apc.slam_defense | 0 | INI_SYSTEM |
|
apc.enable_cli | 0 | INI_SYSTEM |
|
apc.use_request_time | 0 | INI_ALL |
在 APCu 5.1.19 之前,預設值為 1 。 |
apc.serializer | "php" | INI_SYSTEM |
在 APCu 5.1.15 之前,預設值為 "default" 。 |
apc.coredump_unmap | 0 | INI_SYSTEM |
|
apc.preload_path | NULL | INI_SYSTEM |
以下是設定指令的簡短說明。
apc.enabled
布林值
可以將 apc.enabled
設定為 0 來停用 APC。當 APC 靜態編譯到 PHP 中時,這尤其有用,因為沒有其他方法可以停用它(當編譯為 DSO 時,只需將 php.ini
中的 extension
行註解掉即可)。
apc.shm_segments
整數要為編譯器快取配置的共享記憶體區段數。如果 APC 的共享記憶體不足,但 apc.shm_size
已設定為系統允許的最大值,提高此值可能會防止 APC 耗盡其記憶體。
apc.shm_size
字串每個共享記憶體區段的大小,以簡寫表示法表示,如此常見問題中所述。預設情況下,某些系統(包括大多數 BSD 變體)對共享記憶體區段的大小有非常低的限制。
apc.entries_hint
整數關於可能儲存的不同變數數量之「提示」。如果不確定,請設定為零或省略。
apc.ttl
整數如果未明確設定 TTL 的快取項目在此秒數內未被存取,則視為已過期。實際上,這允許在快取插入期間或在完全清除之前,有機會移除此類項目。請注意,由於移除是機會性的,即使項目早於 apc.ttl
秒,仍然可以讀取。此設定對已明確指定 TTL 的快取項目沒有影響。
apc.gc_ttl
整數快取項目在垃圾回收清單中可保留的秒數。此值提供了一個故障保險機制,以防伺服器處理程序在執行快取的原始碼檔案時當機;如果該原始碼檔案被修改,則分配給舊版本的記憶體將不會被回收,直到達到此 TTL 為止。設定為零可停用此功能。
apc.mmap_file_mask
字串如果使用 --enable-mmap
編譯 MMAP 支援,這是要傳遞給 mmap 模組的 mktemp 樣式 file_mask,用於決定您的 mmap 記憶體區域是基於檔案還是基於共享記憶體。對於直接基於檔案的 mmap,請將其設定為類似 /tmp/apc.XXXXXX
(正好 6 個 X
)。要使用 POSIX 樣式的 shm_open/mmap,請在遮罩中的某處放置 .shm
。例如 /apc.shm.XXXXXX
您也可以將其設定為 /dev/zero
以使用您的核心 /dev/zero
介面到匿名 mmap 的記憶體。將其保留為未定義將強制匿名 mmap。
apc.slam_defense
布林值在非常忙碌的伺服器上,每當您啟動伺服器或修改檔案時,都可能會產生許多處理程序同時嘗試快取同一個檔案的競爭情況。將 apc.slam_defense
設定為 1
可以透過引入機率機制來防止多個處理程序同時快取同一個檔案。如果不同的處理程序在短時間內嘗試快取相同的鍵,它會跳過目前處理程序的快取,以減輕潛在的快取衝突。
apc.enable_cli
整數主要用於測試和除錯。設定此選項可為 PHP 的 CLI 版本啟用 APC。在一般情況下,在每個 CLI 請求上建立、填充和銷毀 APC 快取並不理想,但對於各種測試場景,能夠輕鬆地為 PHP 的 CLI 版本啟用 APC 非常有用。
apc.serializer
字串用於設定 APC 以使用第三方序列化器。
apc.coredump_unmap
布林值啟用 APC 處理訊號,例如在收到訊號時寫入核心檔案的 SIGSEGV。當收到這些訊號時,APC 將嘗試取消映射共享記憶體區段,以將其從核心檔案中排除。當收到致命訊號且配置了大型 APC 共享記憶體區段時,此設定可以提高系統穩定性。
此功能潛在危險。如果發生致命錯誤,在致命訊號處理程序中取消映射共享記憶體區段可能會導致未定義的行為。
注意事項:
雖然某些核心可能提供在產生核心傾印檔案時忽略各種類型共享記憶體的功能,但這些實作也可能忽略重要的共享記憶體區段,例如 Apache 計分板。
apc.preload_path
字串或者,設定 APC 在啟動時載入快取資料的目錄路徑。
apc.use_request_time
布林值使用 SAPI 請求開始時間作為 TTL。