エラーはImageモジュール(コア)から発生しており、ロジックは次のようになります。
$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を使用することです。
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"
。
シェルにアクセスできない場合は、Develモジュールを使用して/devel/php
、そこにPHPコードを貼り付けます。
注:files
フォルダーがApacheユーザーによって所有されている場合、テスト目的でこのユーザーとしてログインする必要があります。それ以外の場合は、drushコマンドの前にを付けますsudo -u www-data
。
以下の可能性があります。
- 上記のテストは成功しました(ファイルがファイルdirに正常に生成されました)。その場合、ログからの失敗した画像が実際に存在するかどうかを確認します。サーバーから削除された可能性があります。
- 同じエラーメッセージが表示されるか、ファイルが作成されなかった場合は、アクセス権に問題があるか、ライブラリが不足しています(チェック:)
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ユーザーとしてコマンド全体を実行することを忘れないでください。