web-gelistirme-sc.com

Görüntüyü yeniden oluştur

Düğüm başına imagecache ile çalışan bir imagefield var. Imagecache isteğe bağlı önbellekler sakladığından, önbellek dosyaları/varyasyonları ilk talep edilene kadar oluşturulmaz. Bu yüzden bir grup görüntüyü güncellersem, yeniden konuşlandırırsam veya tüm önbelleği patlatırsam, bu dosyayı işlemek ilk ziyaretçiye kalır.

Bu kullanıcıyı yükleme süresini nasıl yedekleyebilirim ve tüm önbelleği manuel olarak yeniden oluşturabilirim?

Bu son geldiğinde, programlı olarak her düğüm bağlantısını jquery ile yükledim ...

Mükemmel bir Drush eklentisi gibi görünüyor ... muhtemelen yazmaya bakmalı, ama başka birinin bunun için bir çözümü olup olmadığını merak ediyorum.

5
ack

Özel bir modül oluşturabilir ve sonra görüntüyü yeniden oluşturmak için hook_cron () kullanabilirsiniz.

Güncelleme

Ben sadece sunucu tarafında nasıl yapacağını çözmek için son bir saat geçirdim ve ben kırık olduğunu düşünüyorum.

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

Nasıl çalışır:

  1. Yayınlanan tüm düğümleri alın
  2. Her düğüm için düğüm türünü alır
  3. Yinelenmekte olan geçerli düğüm için bir dizi alan alır
  4. Tüm alanlar üzerinde yinelenir ve görüntü alanları olup olmadığını kontrol eder
  5. Görüntü alanı bulunursa ilişkilendirilmiş görüntü önbellek ön ayarını alın
  6. Düğümün görüntü alanı örnekleri üzerinde yineleme
  7. Her görüntü alanı örneği için görüntü dosyayolu alın
  8. Görüntü dosyası yolunu görüntü önbellek yoluna dönüştürme
  9. Önbelleğe alınmış görüntü oluşturmaya resim önbelleğini zorlamak için HTTP üzerinden file_get_contents () kullanarak dosya yolunu okuyun.

Test ettim ve Drupal 6. benim için harika çalıştı. A Drupal 7 sürümü, temeldeki dosyadaki değişiklikler nedeniyle biraz daha zor olurdu API.

Özel bir modül oluşturmanız ve bu işlevi yapıştırmanız gerekir. Kanca adını rebuildimagecache yerine özel modülünüzün adına da değiştirdiğinizden emin olun.

hook_cron() 'ı kullandım, böylece cron çalıştırıldığında çalışacak, ancak bir drush komutu ile manuel olarak çalıştırabilirsiniz.

12
Camsoft

Düşük teknoloji yaklaşımı ...

  1. Yeni bir düğüm görünümü oluşturun.
  2. İçerik türleri için görüntü alanlarını içeren bir filtre ayarlayın.
  3. Önbelleğe almak istediğiniz ImageCache ön ayarını kullanarak görüntü alanlarınızı ekleyin.
  4. Düğüm sayısı sınırı olmadan sayfayı değil olarak ayarlayın.
  5. Görünümü yükleyin.
  6. Yük altında sunucunuzun ezildiğini izleyin. Zaman aşımı olursa görünümü yeniden yükleyin.

Oh, ve bu görünümde yalnızca yöneticilerin izinleri olduğundan emin olun.

5
rogerhoward

Bir performans ipucu: Görüntü önbelleğini tetiklemek için tüm görüntü içeriğini yüklemeniz gerekmez, ayrıca üstbilgileri de isteyebilirsiniz. Yani bu çizgi:

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

olur

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

Çözümüm:

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

Bu tür şeyleri çalıştırmak için bir girişim oldu, bkz --- Imagecache Batch ama bu özelliklerin gelişiminin nerede durduğundan emin değilim. D6 veya D7 ile uğraşıyorsanız bahsetmiyorsunuz, ancak 6.x-2.x-dev'deki eylem ve kurallara bakar ve nerede olduğunu görürüm.

2
George

Bu yapıldı ve iyi çalışıyor, buraya bakın https://drupal.org/node/587086

İleti dizisinin sonundaki tam dosya düzeltme ekini deneyin. İçinde çalıştırdığınızdan emin olun /sites/all/modules/imagecache/imagecache.drush.inc ve standart olarak kökte değil.

0
Gabriel R.