it-swarm-vi.com

Xây dựng lại hình ảnh

Tôi có một trường hình ảnh trên mỗi nút chạy qua fantecache. Vì fantecache lưu trữ theo yêu cầu, các tệp/biến thể bộ đệm không được tạo cho đến khi chúng được yêu cầu lần đầu tiên. Vì vậy, nếu tôi cập nhật một loạt các hình ảnh, triển khai lại hoặc thổi toàn bộ bộ đệm, thì khách truy cập đầu tiên sẽ xử lý tệp đó.

Làm cách nào tôi có thể tiết kiệm thời gian tải của người dùng đó và tự xây dựng lại toàn bộ bộ đệm?

Lần cuối cùng xuất hiện, tôi đã lập trình tải mọi liên kết nút bằng jquery ...

Có vẻ như một plugin Drush hoàn hảo ... có lẽ nên xem xét việc viết nó, nhưng tôi tò mò liệu có ai có giải pháp cho việc này không.

5
ack

Bạn có thể tạo một mô-đun tùy chỉnh và sau đó sử dụng hook_cron () để xây dựng lại hình ảnh.

Cập nhật

Tôi vừa mới dành một giờ cuối cùng để cố gắng tìm ra cách để làm điều đó ở phía máy chủ và tôi nghĩ rằng tôi đã bẻ khóa nó.

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

Làm thế nào nó hoạt động:

  1. Nhận tất cả các nút được xuất bản
  2. Đối với mỗi nút được loại nút
  3. Nhận được một mảng các trường cho nút hiện tại được lặp lại
  4. Lặp lại trên tất cả các trường và kiểm tra nếu có bất kỳ trường hình ảnh
  5. Nếu trường hình ảnh được tìm thấy thì có được bộ đệm hình ảnh đặt sẵn liên kết
  6. Lặp lại các trường hợp hình ảnh của nút
  7. Đối với mỗi trường hình ảnh, hãy lấy filepath hình ảnh
  8. Chuyển đổi đường dẫn tệp hình ảnh thành đường dẫn bộ đệm hình ảnh
  9. Đọc đường dẫn tệp bằng file_get_contents () qua HTTP để buộc bộ đệm hình ảnh để tạo hình ảnh được lưu.

Tôi đã thử nghiệm và nó hoạt động rất tốt với tôi trong Drupal 6. A Drupal 7 sẽ khó khăn hơn một chút do những thay đổi trong Tệp bên dưới API.

Bạn sẽ phải tạo một mô-đun tùy chỉnh và dán chức năng này vào. Hãy đảm bảo bạn cũng thay đổi tên hook từ rebuildimagecache thành tên của mô-đun tùy chỉnh của bạn.

Tôi đã sử dụng hook_cron() để nó sẽ chạy khi cron được chạy nhưng bạn có thể chạy thủ công thông qua lệnh drush.

12
Camsoft

Phương pháp công nghệ thấp ...

  1. Tạo chế độ xem nút mới.
  2. Đặt bộ lọc cho loại nội dung chứa các trường hình ảnh.
  3. Thêm các trường hình ảnh của bạn, sử dụng bất kỳ cài đặt ImageCache nào bạn muốn vào bộ đệm trước.
  4. Đặt nó thành không trang, không có giới hạn số nút.
  5. Tải chế độ xem.
  6. Xem máy chủ của bạn đè dưới tải. Nếu hết thời gian, tải lại chế độ xem.

Ồ, và đảm bảo chỉ quản trị viên mới có quyền trên quan điểm đó.

5
rogerhoward

Một mẹo về hiệu suất: Bạn không cần tải toàn bộ nội dung hình ảnh để kích hoạt hình ảnh tưởng tượng, bạn cũng có thể chỉ cần yêu cầu các tiêu đề. Vì vậy, dòng này:

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

trở thành

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

Giải pháp của tôi:

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

Có một nỗ lực để làm cho loại điều này hoạt động, xem Imagecache Batch nhưng tôi không chắc sự phát triển của các tính năng này ở đâu. Bạn không đề cập đến nếu bạn đang giao dịch với D6 hoặc D7 nhưng tôi sẽ xem xét các hành động và quy tắc trong 6.x-2.x-dev và xem nó ở đâu.

2
George

Điều này đã được thực hiện và hoạt động tốt, xem tại đây https://drupal.org/node/587086

Hãy thử bản vá đầy đủ ở cuối chuỗi. Hãy chắc chắn rằng bạn chạy nó bên trong /sites/all/modules/imagecache/imagecache.drush.inc và không phải ở gốc, như là tiêu chuẩn.

0
Gabriel R.