[英]How to clear APC cache entries?
當我部署站點的新版本時,我需要清除所有 APC 緩存條目。 APC.php 有一個用於清除所有操作碼緩存的按鈕,但我沒有看到用於清除所有用戶條目、所有系統條目或所有每目錄條目的按鈕。
是否可以通過命令行或其他方式清除所有緩存條目?
您可以使用PHP函數apc_clear_cache
。
調用apc_clear_cache()
將清除系統緩存,調用apc_clear_cache('user')
將清除用戶緩存。
我不相信這些答案中的任何一個實際上都可以用於從命令行清除APC緩存。 正如Frank Farmer在上面評論的那樣,CLI在與Apache分開的進程中運行。
我從命令行清除的解決方案是編寫一個腳本,將APC清除腳本復制到web
目錄並訪問它然后將其刪除。 該腳本僅限於從localhost訪問。
apc_clear.php
這是腳本復制到Web目錄,訪問和刪除的文件。
<?php if (in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1'))) { apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode'); echo json_encode(array('success' => true)); } else { die('SUPER TOP SECRET'); }
緩存清除腳本
此腳本將apc_clear.php復制到Web目錄,訪問它,然后刪除它。 這是基於Symfony任務。 在Symfony版本中,調用Symfony形式的copy和unlink,它們處理錯誤。 您可能希望添加成功的檢查。
copy($apcPaths['data'], $apcPaths['web']); //'data' is a non web accessable directory $url = 'http://localhost/apc_clear.php'; //use domain name as necessary $result = json_decode(file_get_contents($url)); if (isset($result['success']) && $result['success']) { //handle success } else { //handle failure } unlink($apcPaths['web']);
我知道並不適合所有人,但是:為什么不重新啟動優雅的Apache?
例如,對於Centos / RedHat Linux:
sudo service httpd graceful
Ubuntu的:
sudo service apache2 graceful
這在文檔中沒有說明,但要清除操作碼緩存,您必須執行以下操作:
apc_clear_cache('opcode');
編輯:這似乎只適用於一些舊版本的APC ..
無論您使用什么版本,都無法從php cli腳本中清除mod_php或fastcgi APC緩存,因為cli腳本將以不同的進程運行為mod_php或fastcgi。 您必須從要清除緩存的進程(或子進程)中調用apc_clear_cache()。 使用curl運行一個簡單的PHP腳本就是這樣一種方法。
如果要在命令中清除apc cache :(如果需要,請使用sudo)
APCu
php -r "apcu_clear_cache();"
APC
php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
如果你在NGINX / PHP-FPM堆棧上運行,最好的辦法就是重新加載php-fpm
service php-fpm reload
(或者你的系統上的重載命令)
如APC文件中所定義:
要清除緩存運行:
php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'
命令行使用的另一種可能性,尚未提及,是使用curl。
如果您正在使用stock apc.php腳本,這並不能解決所有緩存條目的問題,但它可以調用已調整的腳本或您已安裝的另一個腳本。
這會清除操作碼緩存:
curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=1&`date +%s`"
將OB參數更改為3以清除用戶緩存:
curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=3&`date +%s`"
將兩行放在腳本中並在env中使用$ PASSWORD調用它。
如果要通過json監視結果,可以使用這種腳本:
<?php
$result1 = apc_clear_cache();
$result2 = apc_clear_cache('user');
$result3 = apc_clear_cache('opcode');
$infos = apc_cache_info();
$infos['apc_clear_cache'] = $result1;
$infos["apc_clear_cache('user')"] = $result2;
$infos["apc_clear_cache('opcode')"] = $result3;
$infos["success"] = $result1 && $result2 && $result3;
header('Content-type: application/json');
echo json_encode($infos);
如其他答案所述,此腳本必須通過http或curl調用,如果它在應用程序的Web根目錄中公開,則必須加以保護。 (通過ip,令牌......)
apc_clear_cache()僅適用於您希望緩存清除的同一個php SAPI。 如果你有PHP-FPM並想要清除apc緩存,你可以通過一個php腳本而不是命令行來完成,因為這兩個緩存是分開的。
我編寫了CacheTool ,這是一個命令行工具,可以解決這個問題,只需一個命令就可以從命令行清除PHP-FPM APC緩存(它連接到php-fpm,並執行apc函數)
它也適用於opcache。
看看它是如何工作的: http : //gordalina.github.io/cachetool/
APC的穩定性可以選擇在其界面中清除緩存。 要清除這些條目,您必須登錄到apc界面。
APC可以選擇在apc.php文件中設置用戶名和密碼。
如果你在ubuntu下運行fpm,需要運行下面的代碼(在12和14上檢查)
service php5-fpm reload
apc.ini
apc.stat =“1”將強制APC對每個請求上的腳本進行統計(檢查)以確定它是否已被修改。 如果它已被修改,它將重新編譯並緩存新版本。
如果此設置關閉,APC將不會檢查,這通常意味着強制APC重新檢查文件,必須重新啟動Web服務器或必須手動清除緩存。 請注意,FastCGI Web服務器配置可能無法在重新啟動時清除緩存。 在腳本文件很少更改的生產服務器上,禁用統計信息可以顯着提高性能。
創建APC.php文件
foreach(array('user','opcode','') as $v ){
apc_clear_cache($v);
}
從瀏覽器運行它。
對我來說一個很好的解決方案是在部署后不再使用過時的用戶緩存。
如果為每個鍵添加前綴,則可以在更改緩存條目的數據結構時更改前綴。 這將有助於您在部署時獲得以下行為:
這僅適用於用戶緩存。
我在Symfony構建的解決方案是在同一台服務器上有一堆實例:
步驟1.創建觸發器或其他東西以設置文件標志(例如,Symfony命令),然后創建marker file
。
file_put_contents('clearAPCU','yes sir i can buggy')
步驟2.在開始時的索引文件中添加清除代碼並刪除marker file
。
if(file_exists('clearAPCU')){
apcu_clear_cache();
unlink('clearAPCU');
}
第2步。運行應用。
TL;DR:刪除/storage/framework/cache/data/
緩存文件
我啟用了 APC 但它沒有安裝(也無法安裝),所以它拋出了Call to undefined function Illuminate\\Cache\\apc_store()
。
“好吧,我只是禁用它,它應該可以工作”。
嗯,不。 然后我陷入了Call to undefined function Illuminate\\Cache\\apc_delete()
我們遇到了APC和符號鏈接到文件的符號鏈接問題 - 它似乎忽略了文件本身的變化。 以某種方式對文件本身執行觸摸有幫助。 我不知道修改文件和觸摸文件之間有什么區別,但不知何故有必要......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.