Wie lösche ich den Cache extern?

6

Ich hätte gerne Hilfe beim Löschen des Caches mit einem externen Skript. Ich habe ein Skript, das jede Nacht Knoten hinzufügt, und ich möchte auch, dass es den Ansichts-Cache so löscht - ohne die MySQL-Abfrage selbst erkennen zu müssen.

Daniel Holm
quelle

Antworten:

7

Wenn Sie nur ein oder zwei bestimmte Cache-Bins löschen möchten, die Sie verwenden können cache_clear_all()(vorausgesetzt, Ihr Skript verfügt über Drupal-Bootstrap):

cache_clear_all(NULL, 'cache_views');
cache_clear_all(NULL, 'cache_views_data');
Clive
quelle
Da es sich um ein Nicht-Drupal-Skript handelt, werde ich es wahrscheinlich so machen und () die erforderlichen Dateien einschließen. Vielen Dank!
Daniel Holm
10

Wenn Sie ein Skript ausführen, profitieren Sie wahrscheinlich von der Verwendung von Drush . Mit den Befehlen Drush php-eval und php-script können Sie nach dem Booten von Drupal problemlos einen Ausschnitt aus dem PHP-Code aufrufen (wie in den Beispielen, die in anderen Antworten auf diese Frage gezeigt werden). Ohne Drush müssten Sie einen Webdienst einrichten und Ihren Code mit wget oder curl ausführen oder versuchen, den Drupal-Bootstrap-Code selbst aufzurufen. Besser noch, Drush verfügt sogar über einen integrierten Befehl zum Löschen des Caches, sodass Sie sich keine Gedanken über das Schreiben von PHP-Code machen müssen, wenn dies alles ist, was Sie mit Ihrem Skript tun möchten. Benutz einfach:

cd /path/to/drupal/sites/default && drush cache-clear all

Möglicherweise möchten Sie auch mehr über Site-Aliase erfahren. Wenn Sie einen Alias ​​mit dem Namen @site definieren, können Sie stattdessen Folgendes verwenden:

drush @site cache-clear all
greg_1_anderson
quelle
Drush scheint hier die klare Lösung zu sein, obwohl OP den Views-Cache leeren möchte. Versuchen Sie es drush cc viewsin Ihrem Skript als Benutzer mit dem richtigen Zugriff.
Citricguy
Ja, Sie haben Recht drush cc views; Drush-Befehle rufen jedoch normalerweise API-Funktionen ohne Zugriffsüberprüfung direkt auf. Es ist normalerweise nicht erforderlich, einen Benutzer anzugeben.
Greg_1_anderson
Leider habe ich auf diesem Server keinen solchen Zugriff. Ansonsten genieße ich Drush sehr!
Daniel Holm
6

Ich schlage vor, das Menü zu registrieren und es extern aufzurufen. Geben Sie beim Rückruf Ihren Code ein (Cache löschen).

function yourmodule_menu() {
    $items = array();
    $items['customclearcache'] = array(
        'title' => 'clear cache',
        'description' => 'clear cache',
        'page callback' => 'yourmodule_clear_cache',
        'access callback' => TRUE , // or any access you need
    );
    return $items;
}


 function yourmodule_clear_cache(){
   cache_clear_all(NULL, 'cache_views');
   cache_clear_all(NULL, 'cache_views_data');
   drupal_set_message(t('cache clearing completed'));
   drupal_goto("node"); // or any page you want
}

und Sie können den Cache leeren, indem Sie diese URL aufrufen : yoursite.com/customclearcache.

Auch wenn Sie damit den drushCache gelöscht habendrush cc all

   //first go to your installed site path
  $cd /path/to/drupal 
   $drush cc all
Yuseferi
quelle
5
Stellen
@Berdir, ja, ich stimme dir zu, dies ist nur ein Weg, um eine Idee zu bekommen und sie zu entwickeln.
Yuseferi
Das Skript befindet sich außerhalb des tatsächlichen Drupal-Codes. Dies wäre perfekt für mein Modul, aber nicht in diesem genauen Fall. Aber danke!
Daniel Holm
Ein solcher Rückruf sollte ein geheimes Token und im Idealfall ein Anti-CSRF-Token überprüfen, um Missbrauch zu vermeiden.
greggles
@Greggles Ja, ich stimme Ihnen zu oder spezifizierter Zugriffsrückruf;)
Yuseferi
0

Der Cache kann am besten extern mit Drush-Befehlen geleert werden.

Sie könnten drush ccim Terminal verwenden und es wird Sie fragen, was genau Sie löschen möchten. Im Beispiel wird gefragt:

Geben Sie eine Nummer ein, um den zu löschenden Cache auszuwählen.

 [0]   :  Cancel         
 [1]   :  all            
 [2]   :  drush          
 [3]   :  theme-registry 
 [4]   :  menu           
 [5]   :  css-js         
 [6]   :  block          
 [7]   :  module-list    
 [8]   :  theme-list     
 [9]   :  registry       
 [10]  :  views   

Wählen Sie Ihre Option und Sie können den Cache extern löschen.

Weitere Informationen zum Drush und den Befehlen finden Sie auf der drush GitHub-Seite .

Nitesh Sethia
quelle
0

Wenn Sie den Cache extern leeren möchten, verwenden Sie am einfachsten Folgendes drush:

drush -y cc all

Dies würde alle Drupal-Caches löschen (aber nicht alle Caches ). In Drupal 8 : drush cr.

Eine andere Möglichkeit besteht darin, ein einfaches Skript zu schreiben, das alle Tabellen abschneidet / löscht, mit denen begonnen wird cache_, beispielsweise mit dem folgenden Einzeiler:

echo "SHOW TABLES LIKE 'cache%'" | drush sqlc --extra=--skip-column-names | xargs -L1 -I% echo "DELETE FROM %;" | drush sqlc --extra=-v 
Kenorb
quelle
-2

TRUNCATEdie cache_viewsTabelle in der Datenbank.

Gaelan
quelle
Es tut uns leid. Ich habe nicht sorgfältig genug gelesen.
Gaelan
Es ist in Ordnung. Aber ja, ich wollte es nicht so, sondern mit einer "sicheren" Drupal-Funktion.
Daniel Holm