لدي حقل حماية لكل عقدة يتم تشغيله عبر ذاكرة التخزين المؤقت. نظرًا لأن ذاكرة التخزين المؤقت لتخزين ذاكرة التخزين المؤقت عند الطلب ، لا يتم إنشاء ملفات/اختلافات ذاكرة التخزين المؤقت حتى يتم طلبها لأول مرة. لذلك ، إذا قمت بتحديث مجموعة من الصور ، أو أعدت نشرها ، أو نسخت ذاكرة التخزين المؤقت بالكامل ، فسيكون الأمر عندئذٍ لدى الزائر الأول لمعالجة هذا الملف.
كيف يمكنني توفير وقت التحميل لذلك المستخدم وإعادة إنشاء ذاكرة التخزين المؤقت بأكملها يدويًا؟
في المرة الأخيرة التي ظهرت فيها ، قمت بتحميل كل رابط عقدة برمجياً باستخدام jquery ...
يبدو وكأنه مكون إضافي مثالي لـ Drush ... ربما يجب أن ينظر في كتابته ، لكنني أشعر بالفضول إذا كان لدى أي شخص آخر حل لهذا.
يمكنك إنشاء وحدة مخصصة ثم استخدام 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);
}
}
}
}
}
كيف تعمل:
لقد اختبرت ذلك وعملت بشكل رائع بالنسبة لي في Drupal 6. A Drupal 7 سيكون الإصدار 7 أكثر صعوبة نظرًا للتغييرات في الملف الأساسي API.
سيكون عليك إنشاء وحدة مخصصة ولصق هذه الوظيفة فيها. تأكد أيضًا من تغيير اسم الخطاف من rebuildimagecache
إلى اسم الوحدة المخصصة الخاصة بك.
لقد استخدمت hook_cron()
بحيث يتم تشغيلها عند تشغيل cron ولكن يمكنك تشغيلها يدويًا عبر أمر drush
.
نهج التكنولوجيا المنخفضة ...
حسنًا ، وتأكد من امتلاك المشرفين فقط أذونات لهذا العرض.
نصيحة واحدة للأداء: لا تحتاج إلى تحميل محتويات الصورة بأكملها لتشغيل ذاكرة التخزين المؤقت ، يمكنك أيضًا طلب الرؤوس. إذن هذا الخط:
file_get_contents($base_url . base_path() . $cachedpath);
يصبح
get_headers($base_url . base_path() . $cachedpath);
بلدي الحل:
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);
}
}
كانت هناك محاولة لجعل هذا النوع من الأشياء تعمل ، انظر Imagecache Batch لكنني لست متأكدًا من موقف تطوير هذه الميزات. لا تذكر ما إذا كنت تتعامل مع D6 أو D7 ولكني سوف أنظر في الإجراءات والقواعد في 6.x-2.x-dev وأرى أين هو.
تم ذلك ويعمل بشكل جيد ، انظر هنا https://drupal.org/node/587086
جرب التصحيح الكامل للملف في نهاية الخيط. تأكد من تشغيله داخل /sites/all/modules/imagecache/imagecache.drush.inc
وليس في الجذر ، كما هو قياسي.