it-swarm.com.de

Wie lösche ich APC-Cache-Einträge?

Ich muss alle APC-Cache-Einträge löschen, wenn ich eine neue Version der Site bereitstelle. Die Datei APC.php enthält eine Schaltfläche zum Löschen aller Opcode-Caches, aber keine Schaltflächen zum Löschen aller Benutzereinträge oder Systemeinträge oder alle Per-Directory-Einträge.

Ist es möglich, alle Cache-Einträge über die Befehlszeile oder auf andere Weise zu löschen?

169
lo_fye

Sie können die Funktion PHP apc_clear_cache verwenden.

Der Aufruf von apc_clear_cache() löscht den Systemcache und der Aufruf von apc_clear_cache('user') löscht den Benutzercache.

141
Travis Beale

Ich glaube nicht, dass eine dieser Antworten tatsächlich zum Löschen des APC-Cache von der Befehlszeile aus funktioniert. Wie Frank Farmer oben kommentiert, wird die CLI in einem von Apache getrennten Prozess ausgeführt.

Meine Lösung für das Löschen über die Befehlszeile bestand darin, ein Skript zu schreiben, das ein APC-Löschskript in das Verzeichnis web kopiert, darauf zugreift und es dann löscht. Auf das Skript kann nur vom localhost aus zugegriffen werden.

  1. apc_clear.php

    Dies ist die Datei, die das Skript in das Webverzeichnis kopiert, darauf zugreift und löscht.

    <?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. Cache-Löschskript

    Dieses Skript kopiert apc_clear.php in das Webverzeichnis, greift darauf zu und löscht es. Dies basiert auf einer Symfony-Aufgabe. In der Symfony-Version werden Aufrufe an das Symfony-Formular copy und unlink vorgenommen, das Fehler behandelt. Möglicherweise möchten Sie Überprüfungen hinzufügen, dass sie erfolgreich sind.

    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']);
    
115
Jeremy Kauffman

Ich weiß, dass es nicht für jeden etwas ist, aber: Warum nicht einen Apache-Neustart durchführen?

Für z. im Falle von Centos/RedHat Linux:

Sudo service httpd graceful

Ubuntu:

Sudo service Apache2 graceful
66

Dies ist nicht in der Dokumentation angegeben, aber um den Opcode-Cache zu löschen, müssen Sie Folgendes tun:

apc_clear_cache('opcode');

BEARBEITEN: Dies scheint nur für einige ältere APC-Versionen zu gelten.

Unabhängig davon, welche Version Sie verwenden, können Sie den mod_php- oder fastcgi-APC-Cache nicht aus einem php-cli-Skript löschen, da das cli-Skript von einem anderen Prozess als mod_php oder fastcgi ausgeführt wird. Sie müssen apc_clear_cache () innerhalb des Prozesses (oder untergeordneten Prozesses) aufrufen, für den Sie den Cache löschen möchten. Die Verwendung von curl zum Ausführen eines einfachen PHP-Skripts ist ein solcher Ansatz.

29
ColinM

Wenn Sie den apc-Cache im Befehl löschen möchten: (verwenden Sie Sudo, wenn Sie es benötigen)

php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
10
Léo Benoist

Wenn Sie einen NGINX/PHP-FPM-Stack verwenden, ist es am besten, php-fpm neu zu laden

service php-fpm reload (oder was auch immer Ihr Reload-Befehl auf Ihrem System ist)

9
passion4code

Eine andere, noch nicht erwähnte Möglichkeit zur Verwendung der Befehlszeile ist die Verwendung von curl.

Dies löst Ihr Problem nicht für alle Cache-Einträge, wenn Sie das stock apc.php-Skript verwenden. Es könnte jedoch ein angepasstes Skript oder ein anderes aufgerufen werden, das Sie installiert haben.

Dies löscht den Opcode-Cache:

curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=1&`date +%s`"

Ändern Sie den OB-Parameter in 3, um den Benutzercache zu löschen:

curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=3&`date +%s`"

Fügen Sie beide Zeilen in ein Skript ein und rufen Sie es mit $ PASSWORD in Ihrem Env auf.

4
Andy Triggs

Wie im APC-Dokument definiert:

So löschen Sie den Cache-Lauf: 

php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'
4
codersofthedark

Wenn Sie die Ergebnisse über Json überwachen möchten, können Sie dieses Skript verwenden:

<?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);

Wie in anderen Antworten erwähnt, muss dieses Skript über http oder curl aufgerufen werden und Sie müssen geschützt sein, wenn es im Webstamm der Anwendung verfügbar ist. (per ip, token ...)

4
COil

apc_clear_cache () funktioniert nur mit demselben PHP-SAPI, mit dem Sie den Cache gelöscht haben. Wenn Sie PHP-FPM haben und den Apc-Cache löschen möchten, müssen Sie dies über eines der PHP-Skripts tun, NICHT über die Befehlszeile, da die beiden Caches voneinander getrennt sind.

Ich habe CacheTool geschrieben, ein Befehlszeilentool, das genau dieses Problem löst. Mit einem Befehl können Sie Ihren PHP-FPM-APC-Cache von der Befehlszeile löschen (er stellt eine Verbindung zu PHP-Fpm her und führt APC-Funktionen aus.

Es funktioniert auch für opcache.

Sehen Sie hier, wie es funktioniert: http://gordalina.github.io/cachetool/

3

wenn Sie fpm unter ubuntu ausführen, müssen Sie den folgenden Code ausführen (aktiviert bei 12 und 14).

service php5-fpm reload
2
hrnsky

Der Stall von APC hat die Möglichkeit, einen Cache in seiner Schnittstelle selbst zu löschen. Um diese Einträge zu löschen, müssen Sie sich an der apc-Benutzeroberfläche anmelden.

APC hat die Option, Benutzernamen und Passwort in der Datei apc.php festzulegen.

enter image description here

2
vinothvetrivel

apc.ini 

apc.stat = "1" zwingt APC dazu, das Skript bei jeder Anforderung zu stat (prüfen), um festzustellen, ob es geändert wurde. Wenn es geändert wurde, wird die neue Version neu kompiliert und zwischengespeichert. 

Wenn diese Einstellung deaktiviert ist, prüft APC nicht. Dies bedeutet normalerweise, dass der Webserver neu gestartet werden muss, um zu verhindern, dass APC Dateien erneut prüft, oder der Cache muss manuell gelöscht werden. Beachten Sie, dass FastCGI-Webserver-Konfigurationen den Cache beim Neustart möglicherweise nicht löschen. Auf einem Produktionsserver, auf dem sich die Skriptdateien nur selten ändern, kann durch deaktivierte Statistiken ein erheblicher Leistungsanstieg erzielt werden.

1
mal

Die neue Benutzeroberfläche von APC Admin verfügt über Optionen zum Hinzufügen/Löschen von Benutzer- und Opcode-Cache. Eine interessante Funktion ist das Hinzufügen/Aktualisieren/Löschen von Verzeichnissen aus opCode Cache

APC Admin-Dokumentation

enter image description here

1
Jithin Jose

Meine Problemumgehung für Symfony Build mit Instanzen auf demselben Server:

Schritt 1. Erstellen Sie einen Auslöser oder etwas, um ein Dateiflag zu setzen (z. B. den Befehl Symfony), und erstellen Sie dann marker file .. 

file_put_contents('clearAPCU','yes sir i can buggy')

Schritt 2. Fügen Sie bei der Indexdatei am Anfang Löschcode hinzu und entfernen Sie marker file.

if(file_exists('clearAPCU')){
    apcu_clear_cache();
    unlink('clearAPCU');
}

Schritt 2. App ausführen.

Erstellen Sie die APC.php-Datei 

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

Führen Sie es in Ihrem Browser aus.

0
anshuman

Eine gute Lösung für mich war, den veralteten Benutzercache nach der Bereitstellung einfach nicht mehr zu verwenden.

Wenn Sie jedem Schlüssel ein Präfix hinzufügen, können Sie das Präfix beim Ändern der Datenstruktur der Cache-Einträge ändern. Dies hilft Ihnen, das folgende Verhalten bei der Bereitstellung zu ermitteln:

  1. Verwenden Sie nach der Bereitstellung nur aktualisierter Strukturen keine veralteten Cache-Einträge
  2. Bereinigen Sie beim Bereitstellen nicht den gesamten Cache, um die Seite nicht zu verlangsamen
  3. Einige alte zwischengespeicherte Einträge können nach dem Zurücksetzen der Bereitstellung erneut verwendet werden (Wenn die Einträge nicht bereits automatisch entfernt wurden)
  4. APC entfernt alte Cache-Einträge nach Ablauf von ODER bei fehlendem Cache-Speicherplatz

Dies ist nur für den Benutzercache möglich.

0
mabe.berlin