簡體   English   中英

如何清除APC緩存條目?

[英]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訪問。

  1. 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'); } 
  2. 緩存清除腳本

    此腳本將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 Admin界面有添加/清除用戶緩存和操作碼緩存的選項,一個有趣的功能是從opCode Cache添加/刷新/刪除目錄

APC管理員文檔

在此輸入圖像描述

創建APC.php文件

foreach(array('user','opcode','') as $v ){
    apc_clear_cache($v);
}

從瀏覽器運行它。

對我來說一個很好的解決方案是在部署后不再使用過時的用戶緩存。

如果為每個鍵添加前綴,則可以在更改緩存條目的數據結構時更改前綴。 這將有助於您在部署時獲得以下行為:

  1. 在僅部署更新的結構后,請勿使用過時的緩存條目
  2. 不要在部署時清理整個緩存以減慢頁面速度
  3. 恢復部署后,可以重用一些舊的緩存條目(如果條目未自動刪除)
  4. APC將在到期后刪除舊緩存條目刪除緩存空間

這僅適用於用戶緩存。

我在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM