重建ImageCache -- 7 领域 和 media 领域 drupal 相关 的问题

Rebuild imagecache


5
vote

问题

中文

我每个节点有一个图像域,它通过ImageCache运行。由于ImageCache缓存按需,因此在首次请求之前不会创建缓存文件/变体。因此,如果我更新一堆图像,重新部署或以其他方式吹整个缓存,这取决于第一个访问该文件的访问者。

如何才能备用用户加载时间并手动重建整个缓存?

最后一次提出来,我以编程方式加载了与jQuery ...

的每个节点链接

似乎是一个完美的苏打插件......应该看起来应该写它,但我很好奇,如果其他人有解决方案。

英文原文

I have an imagefield per node that's run through imagecache. Since imagecache caches on-demand, cache files/variations aren't created until they're first requested. So if I update a bunch of images, re-deploy, or otherwise blow the whole cache, it's up to first visitor to process that file.

How can I spare that user the load time and manually rebuild the whole cache?

The last time this came up, I programmatically loaded every node link with jquery ...

Seems like a perfect Drush plugin ... should probably look into writing it, but I'm curious if anyone else has a solution for this.

     
 
 

回答列表

12
 
vote
vote
最佳答案
 

您可以创建自定义模块,然后使用 hook_cron()重建Imageecage。

更新

我刚刚花了最后一小时试图弄清楚如何做到这一点,我觉得我已经破解了它。
  /**  * 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. 对于每个图像字段实例获取图像filepath
  9. 将图像文件路径转换为图像缓存路径
  10. 读取文件路径使用file_get_contents()在HTTP上强制映像缓存以生成缓存的图像。

我已经测试过它,它在Drupal 6中对我有好处。由于底层文件API的更改,Drupal 7版本将稍微棘手。

您必须创建一个自定义模块并粘贴此功能。确保您还从 998887664 更改挂钩名称到自定义模块的名称。

我已经使用了 hook_cron() ,以便当Cron ran时,它将运行,但您可以通过 drush 命令手动运行它。

 

You could create a custom module and then use hook_cron() to rebuild the imagecage.

Update

I've just spent the last hour trying to work out how to do it server-side and I think I've cracked it.

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

How it works:

  1. Get all the published nodes
  2. For each node gets the node type
  3. Gets an array of fields for the current node being iterated
  4. Iterates over all the fields and checks if any are image fields
  5. If image field found then get image cache preset associated
  6. Iterate over image field instances of node
  7. For each image field instance get image filepath
  8. Convert image file path into image cache path
  9. Read file path using file_get_contents() over HTTP to force image cache to generate cached image.

I've tested it and it worked great for me in Drupal 6. A Drupal 7 version would be slightly more tricky due to the changes in the underlying File API.

You'll have to create a custom module and paste this function in. Make sure you also change the hook name from rebuildimagecache to the name of your custom module.

I've used hook_cron() so that it will run when cron is ran but you could run it manually via a drush command.

 
 
       
       
5
 
vote

低科技方法...

  1. 创建一个新的节点视图。
  2. 为内容类型设置一个筛选器,该筛选器ocontains of the映像字段。
  3. 添加图像字段,使用要预设的ImageCache预设。
  4. 将其设置为不page,没有节点计数限制。
  5. 加载视图。
  6. 在负载下观看您的服务器暗示。如果超时,重新加载视图。

哦,确保仅在该视图上具有权限。

 

Low tech approach...

  1. Create a new node view.
  2. Set a filter for the content type thatcontains the image fields.
  3. Add your image fields, using whatever ImageCache preset you want to pre-cache.
  4. Set it to not page, with no node count limit.
  5. Load the view.
  6. Watch your server crush under the load. If timeout, reload the view.

Oh, and make sure only admins have permissions on that view.

 
 
 
 
4
 
vote

一个性能提示:您无需加载整个图像内容以触发ImageCache,您也可以请求标题。这条线:

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

变成

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

One performance tip: You don't need to load the whole image contents to trigger imagecache, you can also just request the headers. So this line:

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

becomes

get_headers($base_url . base_path() . $cachedpath); 
 
 
3
 
vote

我的解决方案:

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

My solution:

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);     } } 
 
 
 
 
2
 
vote

试图让这种事情工作,看 imageCache批处理但我不是当然,这些功能的发展在哪里。如果您正在处理D6或D7,则不提及,但我会在6.x-2.x-dev中查看动作和规则的东西,并查看它的位置。

 

There was an attempt to get this kind of thing working, see Imagecache Batch but I'm not sure where the development of these features stand. You don't mention if you're dealing with D6 or D7 but I would look into the actions and rules stuff in 6.x-2.x-dev and see where it's at.

 
 
0
 
vote

这已经完成并运行良好,请参阅这里 https://drupal.org/node/587086

在线程结束时尝试完整的文件补丁。确保您在 /sites/all/modules/imagecache/imagecache.drush.inc 而不是root中运行它,而不是标准。

 

This was done and works well, see here https://drupal.org/node/587086

Try the full file patch at the end of the thread. Make sure you run it inside /sites/all/modules/imagecache/imagecache.drush.inc and not at root, as is standard.

 
 

相关问题

3  视图2条件过滤器  ( Views 2 conditional filter ) 
如何将条件安装程序应用于视图(使用视图2)? 例如: 我有一个视图,它使用节点上的过滤器显示多个不同节点类型的预告:[博客条目,论坛主题,用户配置文件] 这适用于显示这些类型的所有节点,但假设我只想显示用户的个人资料,如果它也有图片(以及所有其他类型)。 ...

3  是否有一个可以处理MIDI文件的媒体处理模块?  ( Is there a media handling module that can handle midi files ) 
我一直在使用 mp3播放器提供一个页面mp3播放器,但我也需要能够处理MIDI文件。现在我可以做的最好的就是允许它们上传到"MP3文件" 字段中,但是当它呈现节点时,它只是给出了文件的链接,这意味着您必须导航到文件(或打开它在一个新标签中,浏览器播放它。 ...

5  删除用户时会导致站点挂起的内容?  ( What can cause a site to hang when deleting a user ) 
当我尝试删除用户时,整个站点挂起,即drupal不再响应了。什么会导致它? 该站点没有安装任何特殊的用户配置文件模块。 编辑: 只有一个自定义(自制)模块,带有Hook_User,它打开 $op 。 "删除" 案例外观未验证: case 'delete': $sql = "DELETE FROM {m...

16  如何在Drupal 7的一页上获得超过10个搜索结果?  ( How can i get more than 10 search results on one page in drupal 7 ) 
默认搜索页面仅显示10个结果。如何更改它以显示无限数量的结果? ...

6  从视图中重复分类分类术语  ( Duplicate taxonomy terms from view ) 
所以我尚未能够找到解决方案,而无需使用预处理函数来检查重复或仅使用"标签" 模块。很好,可以封闭。 如何配置(块)视图以显示词汇表的术语列表,每个术语显示一次(也许是指示它使用的次数的数字) - 即使术语可以由多个节点? "截然不同" 没有工作..字段'分类:所有术语'和'分类:术语'都会产生类似的重复项目,当该术...

80  任何方法为单页/节点添加CSS?  ( Any way to add css for a single page node ) 
我正在清理我的大疯狂风格的表格(可能与未来的问题有关),我想知道将自定义CSS添加到特定节点或页面的最佳方法。 特别是,我的工作网站的主页是面板页面,它有一堆不同的造型。现在,CSS刚刚包含在主题样式表中。 有没有办法说,"如果这是节点foo,则添加foo.css" ?是 css注射器我正在寻找什么? i 可能对其...

12  如何管理Drupal网站上的协作发展?  ( How do i manage collaborative development on a drupal site ) 
我在Drupal网站上使用另一个开发人员。我们一直在努力在没有彼此的情况下同时找到在网站的不同部分工作的好方法。我们已经尝试过在网站的同一开发实例上工作,但我们经常踩到其他人脚趾,或者用一些不好的代码延续网站,使其无法继续工作,直到它得到解决。所以我们搬到了分开的开发实例。但现在将我们的工作合并到网站的单一实例中是一...

4  如何使用子主题覆盖主题的Template.php的单一函数?  ( How to override single function of themes template php using sub theme ) 
目标: drupal 7子主题开发 我不想覆盖整个template.php文件。我只是想覆盖template.php文件的单一函数。 ...

5  使用数据库的良好做法  ( Good practices working with databases ) 
我正在学习drupal,我想开发一个网站,主要是它的数据库。 我已经拥有数据库的扩展实体关系模型(类型的复杂)。 在创建要由drupal使用的数据库时,采取的正确方向是什么,创建它手动,并使用php在drupal中进行查询,因为它是从头开始的php + mysql站点? Drupal是否提供了更容易的方法来做这件事?...

17  如何在有多个功能有多个功能时选择要使用的模块?  ( How do i choose which module to use when there are several options for the same ) 
它并不罕见,找到提供基本相同的功能的多个模块。例如,有许多垃圾邮件控制模块提供极为相似的功能(例如, spamicide 和)。并且有很多不同的分类模块可以做类似的事情。因此,当多个模块满足我的要求时,我应该如何选择使用哪一个? ...

5  如何每次查看节点时执行操作?  ( How to perform an operation every time a node is viewed ) 
在编写模块时,我如何每次用户查看节点时执行一次操作? ...

0  如何生成一个列表,其中包含哪些空格?  ( How to generate a list of which features are enabled in which spaces ) 
我正在使用有机组,特征和空格运行一个Drupal 6.x站点,我对生成一个空格启用的空格的列表有兴趣。优选地,具有沿Y轴的空间的表,以及沿X轴的特征。 关于如何生成此的任何想法?我可以使用视图生成组空间列表,但无法找到已启用功能的字段。 ...

5  批量保存节点与文件字段  ( Bulk saving nodes with a file field ) 
我正在为笨拙网站创建批量上载函数的进度。使用Flash我能够将文件上传到应该能够处理文件的特定URL。 我想做什么,不仅仅是上传文件,而是使用保存到已使用CCK设置的文件字段的文件创建特定类型的节点。由于这些是音频文件,因此文件字段处理文件是重要的,因此可以使用GetID3模块提供其他元数据。 我看了代码/ doc,...

3  如何处理博客标签在贡献主题中?  ( How to handle blog tags in a contrib theme ) 
在博客或博客的网站中,分类通常用于标签和类别。 在Drupal 6中,Node.TPL.php文件可以使用$分类系统,如果它们需要访问与当前节点相关联的UnRended分类链接数组。该变量通常是通过Control主题假设来包含帖子标记和或类别,并且相应地呈现。 在Drupal 7中,$分类学不再可用。 是什么选择...

11  hook_preprocess_page():如何讲述视图页面?  ( Hook preprocess page how to tell a views page ) 
im写一个需要在视图页面中插入一些javascript和css文件的自定义模块。 im使用hook_preprocess_page,但我无法判断当前页面是否来自视图: function mymodule_preprocess_page(&vars) { var_dump($vars); //outpu...

5  Field API与自定义代码  ( Field api versus custom code ) 
如果我需要仅为用户配置文件添加自定义字段,它是否更好地创建使用字段API的模块,或者使用自己的代码以自定义URL显示自定义字段的模块,并保存数据在自己的数据库表中? 字段API无法实现决定哪些字段可对其用户可见的权限;是足以实现自定义代码的原因? ...

5  视图幻灯片VS列表视图+ jQuery Cycle Lite?  ( Views slideshow vs list viewjquery cycle lite ) 
在我的工作站主页上的旋转图像是以列表格式的视图创建。我正在使用 jquery循环Lite 插件,用于旋转效果。 CycliT.Lite.js文件在我的主题的.info文件中的脚本数组中设置,页面中有一点代码.TPL.php检查这是否是主页,如果是,则设置旋转器。< / p> 现在我正在第二个旋转器用于另一个部分,我一...

3  如何使功能仅适用于某些空格?  ( How to make a feature available only to certain spaces ) 
对于Drupal 6开放式庭院站点(即,功能,空格,有机组)我正在运行,我创建了一些自定义功能,只能真正适用于站点上的数百个群体。 它代表,"自定义功能" 配置屏幕显示所有的功能,包括那些我想故意限制到几个特殊群体的那些。 预防每个小组提供这些特殊功能的最佳方法,同时保留了特殊组上的这些功能? ...

4  在子域之间共享登录  ( Login shared between subdomains ) 
如果我应该允许用户使用相同的用户名/密码登录,在以下解决方案之间选择时,我应该考虑什么? 安装,并使用面包店单点登录系统在主站点上,以及所有子域。 共享包含用户数据的数据库表。 ...

3  如何追溯应用Mollom垃圾邮件过滤?  ( How to retroactively apply mollom spam filtering ) 
我被要求清理几年运行的网站,除了大量有效内容之外还累积了一些垃圾邮件。 我刚刚在网站上安装了Mollom,以帮助减少未来的垃圾邮件帖子;但是有些方法可以让Mollom过程已经发布到网站上的内容,并为我的评论销售潜在的垃圾内容(而不是单独查看全部有效内容的所有)? ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.