it-swarm.asia

إعادة بناء ذاكرة التخزين المؤقت

لدي حقل حماية لكل عقدة يتم تشغيله عبر ذاكرة التخزين المؤقت. نظرًا لأن ذاكرة التخزين المؤقت لتخزين ذاكرة التخزين المؤقت عند الطلب ، لا يتم إنشاء ملفات/اختلافات ذاكرة التخزين المؤقت حتى يتم طلبها لأول مرة. لذلك ، إذا قمت بتحديث مجموعة من الصور ، أو أعدت نشرها ، أو نسخت ذاكرة التخزين المؤقت بالكامل ، فسيكون الأمر عندئذٍ لدى الزائر الأول لمعالجة هذا الملف.

كيف يمكنني توفير وقت التحميل لذلك المستخدم وإعادة إنشاء ذاكرة التخزين المؤقت بأكملها يدويًا؟

في المرة الأخيرة التي ظهرت فيها ، قمت بتحميل كل رابط عقدة برمجياً باستخدام jquery ...

يبدو وكأنه مكون إضافي مثالي لـ Drush ... ربما يجب أن ينظر في كتابته ، لكنني أشعر بالفضول إذا كان لدى أي شخص آخر حل لهذا.

5
ack

يمكنك إنشاء وحدة مخصصة ثم استخدام hook_cron () لإعادة إنشاء الصورة.

تحديث

لقد قضيت للتو الساعة الأخيرة محاولًا العمل على كيفية القيام بذلك من جانب الخادم وأعتقد أنني قمت بإصلاحها.

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

كيف تعمل:

  1. احصل على جميع العقد المنشورة
  2. لكل عقدة تحصل على نوع العقدة
  3. يحصل على مجموعة من الحقول للعقدة الحالية التي يتم تكرارها
  4. يكرر على جميع الحقول ويتحقق من وجود حقول الصورة
  5. إذا تم العثور على حقل الصورة ، فاحصل على إعداد مسبق لذاكرة التخزين المؤقت للصور
  6. التكرار فوق مثيلات حقل الصورة للعقدة
  7. لكل مثيل حقل صورة الحصول على مسار الصورة
  8. تحويل مسار ملف الصورة إلى مسار ذاكرة التخزين المؤقت للصورة
  9. اقرأ مسار الملف باستخدام file_get_contents () عبر HTTP لإجبار ذاكرة التخزين المؤقت للصورة على إنشاء صورة مخزنة مؤقتًا.

لقد اختبرت ذلك وعملت بشكل رائع بالنسبة لي في Drupal 6. A Drupal 7 سيكون الإصدار 7 أكثر صعوبة نظرًا للتغييرات في الملف الأساسي API.

سيكون عليك إنشاء وحدة مخصصة ولصق هذه الوظيفة فيها. تأكد أيضًا من تغيير اسم الخطاف من rebuildimagecache إلى اسم الوحدة المخصصة الخاصة بك.

لقد استخدمت hook_cron() بحيث يتم تشغيلها عند تشغيل cron ولكن يمكنك تشغيلها يدويًا عبر أمر drush.

12
Camsoft

نهج التكنولوجيا المنخفضة ...

  1. إنشاء عرض عقدة جديد.
  2. قم بتعيين عامل تصفية لنوع المحتوى الذي يحتوي على حقول الصورة.
  3. أضف حقول صورتك باستخدام أي إعداد مسبق لـ ImageCache تريد تخزينه مسبقًا.
  4. اضبطها على عدم الصفحة ، مع عدم وجود حد لعدد العقد.
  5. قم بتحميل العرض.
  6. شاهد سحق الخادم الخاص بك تحت الحمل. إذا انتهت المهلة ، فأعد تحميل العرض.

حسنًا ، وتأكد من امتلاك المشرفين فقط أذونات لهذا العرض.

5
rogerhoward

نصيحة واحدة للأداء: لا تحتاج إلى تحميل محتويات الصورة بأكملها لتشغيل ذاكرة التخزين المؤقت ، يمكنك أيضًا طلب الرؤوس. إذن هذا الخط:

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

يصبح

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

بلدي الحل:

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

كانت هناك محاولة لجعل هذا النوع من الأشياء تعمل ، انظر Imagecache Batch لكنني لست متأكدًا من موقف تطوير هذه الميزات. لا تذكر ما إذا كنت تتعامل مع D6 أو D7 ولكني سوف أنظر في الإجراءات والقواعد في 6.x-2.x-dev وأرى أين هو.

2
George

تم ذلك ويعمل بشكل جيد ، انظر هنا https://drupal.org/node/587086

جرب التصحيح الكامل للملف في نهاية الخيط. تأكد من تشغيله داخل /sites/all/modules/imagecache/imagecache.drush.inc وليس في الجذر ، كما هو قياسي.

0
Gabriel R.