该错误来自图像模块(核心),其逻辑如下所示:
$success = file_exists($derivative_uri) || image_style_create_derivative($style, $image_uri, $derivative_uri);
if ($success) {
$image = image_load($derivative_uri);
file_transfer($image->source, array('Content-Type' => $image->info['mime_type'], 'Content-Length' => $image->info['file_size']));
} else {
watchdog('image', 'Unable to generate the derived image located at %path.', array('%path' => $derivative_uri));
...
}
因此,当Drupal无法通过应用所有图像效果生成图像导数并保存所生成图像的缓存版本时,就会发生错误。
重现问题(用于诊断目的)的最简单方法是匆忙完成。
直接从drush调用image_style_create_derivative():
drush -v eval 'image_style_create_derivative(reset(@image_styles()), "public://pictures/picture-123.png", "public://styles/test/test-success.png");
用picture-123.png
日志中的现有图片替换:
无法生成位于public://styles/foo/public/pictures/picture-x.png的派生图像
或使用其他任何现有的,例如drush sqlq "SELECT * FROM file_managed"
。
如果您无权访问Shell,请使用Devel模块,然后转到/devel/php
并粘贴PHP代码。
注意:如果该files
文件夹归Apache用户所有,则应以该用户身份登录以进行测试。否则,在drush命令前加上sudo -u www-data
。
存在以下可能性。
- 上面的测试已经成功完成(文件已经在您的文件目录中成功生成),如果是这样,请检查日志中的失败图片是否确实存在,是否已将其从服务器中删除。
- 如果您有相同的错误消息,或者未创建文件,则说明您的权限存在问题或缺少库(请检查:)
drush eval "print_r(gd_info());"
。
- 如果没有任何错误且未创建文件,请检查是否使用了正确的现有文件。
通过可以很容易地实现调试权限问题strace
。安装它,并在要测试的任何命令前面加上前缀strace -f
(不必是root)。
例如:
$ strace -f drush -v eval 'image_style_create_derivative(reset(@image_styles()), "public://existing-image.png", "public://styles/test/test-success.png");' 2>&1 | grep "default/files"
mkdir(".../sites/default/files/styles/test", 0775) = -1 EACCES (Permission denied)
chmod(".../sites/default/files/styles/test", 0775) = -1 EPERM (Operation not permitted)
如果您使用拥有的其他帐户登录files
,那么不要忘记为drush命令加上前缀,sudo -u www-data
以Apache用户身份运行整个命令。