it-swarm-eu.dev

Obnovte imagecache

Mám obrazové pole na uzlu, které běží přes imagecache. Protože mezipaměti imagecache na vyžádání, soubory/variace mezipaměti se nevytvářejí, dokud nejsou poprvé vyžádány. Takže pokud aktualizuji spoustu obrázků, znovu nasadím nebo jinak vypálím celou mezipaměť, je na prvním návštěvníkovi, aby tento soubor zpracoval.

Jak mohu ušetřit tomuto uživateli čas načítání a ručně znovu vytvořit celou mezipaměť?

Naposledy se to stalo, programově jsem načetl každý odkaz na uzel pomocí jquery ...

Vypadá to, že perfektní plugin pro Drush ... by se měl pravděpodobně podívat do jeho psaní, ale jsem zvědavý, jestli má někdo jiný řešení.

6
ack

Mohli byste vytvořit vlastní modul a poté pomocí hook_cron () znovu vytvořit imagecage.

Aktualizace

Právě jsem strávil poslední hodinu zkoušením, jak to udělat na straně serveru, a myslím, že jsem to popraskal.

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

Jak to funguje:

  1. Získejte všechny publikované uzly
  2. Pro každý uzel získá typ uzlu
  3. Získá pole polí pro aktuální iterovaný uzel
  4. Provede všechna pole a zkontroluje, zda jsou některá z obrazových polí
  5. Pokud je nalezeno obrazové pole, bude přidružena předvolba mezipaměti
  6. Iterovat nad instancemi obrazového pole uzlu
  7. Pro každou instanci obrazového pole získáte obrazovou cestu k obrázku
  8. Převést cestu k souboru obrázku na cestu k mezipaměti
  9. Přečtěte si cestu k souboru pomocí file_get_contents () přes HTTP, abyste vynutili mezipaměť obrazu pro generování obrazu v mezipaměti.

Testoval jsem to a fungovalo to pro mě skvěle v Drupal 6. A Drupal 7 verze by byla o něco složitější kvůli změnám v základním souboru) API.

Budete si muset vytvořit vlastní modul a vložit tuto funkci dovnitř. Ujistěte se, že také změníte název háčku z rebuildimagecache na název vlastního modulu.

Použil jsem hook_cron(), takže se spustí, když je spuštěn cron, ale mohl bys to spustit ručně pomocí příkazu drush.

12
Camsoft

Low tech přístup ...

  1. Vytvořte nové zobrazení uzlů.
  2. Nastavte filtr pro typ obsahu, který obsahuje obrazová pole.
  3. Přidejte svá obrazová pole pomocí libovolné předvolby ImageCache, kterou chcete předem uložit do mezipaměti.
  4. Nastavte ji na stránku bez omezení počtu uzlů.
  5. Načíst pohled.
  6. Sledujte, jak se server zatěžuje pod zatížením. Pokud vyprší časový limit, znovu načtěte pohled.

Jo, a ujistěte se, že pouze správci mají oprávnění k tomuto zobrazení.

5
rogerhoward

Jeden tip na výkon: Nemusíte načítat celý obsah obrázku, abyste spustili imagecache, můžete také jen požádat o záhlaví. Tento řádek:

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

se stává

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

Moje řešení:

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

Došlo k pokusu o to, aby tento druh práce fungoval, viz Imagecache Batch , ale nejsem si jistý, kde vývoj těchto funkcí stojí. Nezmiňuješ se, jestli jednáš s D6 nebo D7, ale podíval jsem se na věci a pravidla v 6.x-2.x-dev a uviděl, kde to je.

2
George

Bylo to provedeno a funguje to dobře, viz zde https://drupal.org/node/587086

Vyzkoušejte úplnou opravu souboru na konci vlákna. Ujistěte se, že je spustíte uvnitř /sites/all/modules/imagecache/imagecache.drush.inc a ne u root, jak je standardní.

0
Gabriel R.