it-swarm.com.de

Erstellen Sie den Imagecache neu

Ich habe ein Bildfeld pro Knoten, das durch den Bildcache ausgeführt wird. Da Imagecache bei Bedarf zwischengespeichert wird, werden Cache-Dateien/-Variationen erst erstellt, wenn sie zum ersten Mal angefordert werden. Wenn ich also eine Reihe von Images aktualisiere, den gesamten Cache erneut bereitstelle oder auf andere Weise sprenge, muss der erste Besucher diese Datei verarbeiten.

Wie kann ich diesem Benutzer die Ladezeit ersparen und den gesamten Cache manuell neu erstellen?

Als dies das letzte Mal auftauchte, lud ich programmgesteuert jeden Knotenlink mit jquery ...

Scheint wie ein perfektes Drush-Plugin ... sollte sich wahrscheinlich darum kümmern, es zu schreiben, aber ich bin gespannt, ob jemand anderes eine Lösung dafür hat.

5
ack

Sie können ein benutzerdefiniertes Modul erstellen und dann hook_cron () verwenden, um den Imagecage neu zu erstellen.

Aktualisieren

Ich habe gerade die letzte Stunde damit verbracht, herauszufinden, wie man es serverseitig macht, und ich glaube, ich habe es geknackt.

/**
 * Implements hook_cron().
 */
function rebuildimagecache_cron() {
    global $base_url;

    // get published nodes
    $result = db_query('SELECT nid FROM {node} WHERE status = 1');
    while ($nodes = db_fetch_array($result)) {
        $node = node_load($nodes['nid']);
        $node_type = $node->type;

        // get cck fields for the current nodes node_type
        $fields = content_fields(NULL, $node_type);
        foreach ($fields as $key => $value) {

            // only deal with file fields that use the image widegt tyoe
            if ($value['type'] == 'filefield' && $value['widget']['type'] == 'imagefield_widget') {
                $preset_tokens = explode('_', $value['display_settings']['full']['format']);
                $imagecache_preset = $preset_tokens[0];
                $field_name = $value['field_name'];

                // iterate over each field instance 
                foreach ($node->$field_name as $field_instance) {
                    $filepath = $field_instance['filepath'];
                    $cachedpath = imagecache_create_path($imagecache_preset, $filepath);
                    file_get_contents($base_url . base_path() . $cachedpath);
                }
            }
        }       
    }   
}

Wie es funktioniert:

  1. Holen Sie sich alle veröffentlichten Knoten
  2. Für jeden Knoten wird der Knotentyp abgerufen
  3. Ruft ein Array von Feldern für den aktuellen Knoten ab, der iteriert wird
  4. Durchläuft alle Felder und prüft, ob es sich um Bildfelder handelt
  5. Wenn ein Bildfeld gefunden wurde, wird die Bild-Cache-Voreinstellung zugeordnet
  6. Durch Bildfeldinstanzen des Knotens iterieren
  7. Holen Sie sich für jede Bildfeldinstanz den Bilddateipfad
  8. Konvertieren Sie den Bilddateipfad in den Bildcachepfad
  9. Lesen Sie den Dateipfad mit file_get_contents () über HTTP, um den Bildcache zum Generieren eines zwischengespeicherten Bildes zu zwingen.

Ich habe es getestet und es hat in Drupal 6. A Drupal 7 Version) aufgrund der Änderungen in der zugrunde liegenden Datei etwas schwieriger gewesen API.

Sie müssen ein benutzerdefiniertes Modul erstellen und diese Funktion einfügen. Stellen Sie sicher, dass Sie auch den Hook-Namen von rebuildimagecache in den Namen Ihres benutzerdefinierten Moduls ändern.

Ich habe hook_cron() verwendet, damit es ausgeführt wird, wenn cron ausgeführt wird, aber Sie können es manuell über einen Befehl drush ausführen.

12
Camsoft

Low-Tech-Ansatz ...

  1. Erstellen Sie eine neue Knotenansicht.
  2. Legen Sie einen Filter für den Inhaltstyp fest, der die Bildfelder enthält.
  3. Fügen Sie Ihre Bildfelder hinzu, indem Sie die ImageCache-Voreinstellung verwenden, die Sie vorab zwischenspeichern möchten.
  4. Setzen Sie es auf keine Seite ohne Begrenzung der Knotenanzahl.
  5. Laden Sie die Ansicht.
  6. Beobachten Sie, wie Ihr Server unter der Last zerquetscht. Wenn das Zeitlimit überschritten ist, laden Sie die Ansicht neu.

Oh, und stellen Sie sicher, dass nur Administratoren Berechtigungen für diese Ansicht haben.

5
rogerhoward

Ein Leistungstipp: Sie müssen nicht den gesamten Bildinhalt laden, um den Bildcache auszulösen, sondern können auch nur die Header anfordern. Also diese Zeile:

file_get_contents($base_url . base_path() . $cachedpath);

wird

get_headers($base_url . base_path() . $cachedpath);
4
Stan James

Meine Lösung:

function example_cron() {
    $result = db_query('SELECT fid, uri FROM {file_managed} WHERE filemime like :mime AND status = :status', array('mime' => 'image/%', 'status' => FILE_STATUS_PERMANENT));
    $queue = DrupalQueue::get('generate_image_styles');
    foreach ($result as $img_info) {
        foreach(image_styles() as $style) {
            $derivative_uri = image_style_path($style['name'], $img_info->uri);
            if (file_exists($derivative_uri)) continue; // skip existing files
            $data = (object) array(
                    'style' => $style,
                    'img_info' => $img_info,
                    'derivative_uri' => $derivative_uri
                     );
        $queue->createItem($data);
        }
    }
}


function example_cron_queue_info(){
    $queues['generate_image_styles'] = array(
        'worker callback' => '_example_generate_image_styles',
        'time' => 30
        );
return $queues;
}

function _example_generate_image_styles($data){
    if (!file_exists($data->derivative_uri)) {
        image_style_create_derivative($data->style, $data->img_info->uri, $data->derivative_uri);
    }
}
3
atavio

Es wurde versucht, so etwas zum Laufen zu bringen, siehe Imagecache Batch , aber ich bin mir nicht sicher, wo die Entwicklung dieser Funktionen steht. Sie erwähnen nicht, ob Sie mit D6 oder D7 zu tun haben, aber ich würde mir die Aktionen und Regeln in 6.x-2.x-dev ansehen und herausfinden, wo sie sich befinden.

2
George

Dies wurde gemacht und funktioniert gut, siehe hier https://drupal.org/node/587086

Probieren Sie den vollständigen Dateipatch am Ende des Threads aus. Stellen Sie sicher, dass Sie es in /sites/all/modules/imagecache/imagecache.drush.inc Und nicht wie üblich im Stammverzeichnis ausführen.

0
Gabriel R.