drupal 7 – Reconstruir el caché de imágenes

Pregunta:

Tengo un campo de imagen por nodo que se ejecuta a través de imagecache. Dado que el caché de imágenes se almacena en caché a pedido, los archivos / variaciones de caché no se crean hasta que se solicitan por primera vez. Entonces, si actualizo un montón de imágenes, las vuelvo a implementar o de alguna otra manera arruino todo el caché, depende del primer visitante procesar ese archivo.

¿Cómo puedo ahorrarle a ese usuario el tiempo de carga y reconstruir manualmente todo el caché?

La última vez que surgió esto, cargué programáticamente cada enlace de nodo con jquery …

Parece un complemento perfecto de Drush … probablemente debería pensar en escribirlo, pero tengo curiosidad por saber si alguien más tiene una solución para esto.

Respuesta:

Puede crear un módulo personalizado y luego usar hook_cron () para reconstruir la caja de imágenes.

Actualizar

Acabo de pasar la última hora tratando de averiguar cómo hacerlo del lado del servidor y creo que lo he descifrado.

/**
 * 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);
                }
            }
        }       
    }   
}

Cómo funciona:

  1. Obtén todos los nodos publicados
  2. Para cada nodo obtiene el tipo de nodo
  3. Obtiene una matriz de campos para el nodo actual que se está iterando
  4. Repite todos los campos y comprueba si alguno es un campo de imagen.
  5. Si se encuentra el campo de imagen, obtenga el ajuste preestablecido de caché de imagen asociado
  6. Iterar sobre instancias de campo de imagen del nodo
  7. Para cada instancia de campo de imagen, obtenga la ruta del archivo de imagen
  8. Convertir la ruta del archivo de imagen en la ruta de la caché de imágenes
  9. Lea la ruta del archivo usando file_get_contents () a través de HTTP para forzar la caché de imágenes a generar una imagen almacenada en caché.

Lo probé y me funcionó muy bien en Drupal 6. Una versión de Drupal 7 sería un poco más complicada debido a los cambios en la API de archivos subyacente.

Tendrá que crear un módulo personalizado y pegar esta función. Asegúrese de cambiar también el nombre del rebuildimagecache de rebuildimagecache al nombre de su módulo personalizado.

He usado hook_cron() para que se ejecute cuando se ejecute cron, pero puede ejecutarlo manualmente a través de un comando drush .

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım