web-dev-qa-db-ja.com

派生画像を生成できません

今日、サイトをサーバーにアップロードしたところ、次のようなエラーが発生しました。

Public://styles/sponsor_image/public/TerraThermaSponsorLogo.pngにある派生画像を生成できません。

画像スタイルは画像を生成できません。私はchmod -R 775 styles/を使用してstyles/*フォルダーに権限を設定しようとしましたが、chmod -R 777 styles/を試しました。フォルダの所有者はOKです。何が悪いのかわかりません。

Public://に関連付けられているディレクトリは、sites/default/filesであり、問​​題ありません。

8

簡単に言えば、これは私がこの問題を抱えているときはいつでも私がすることです:

ユーザーをWebサーバーを実行しているユーザー(Apache、httpd、www-data、nginxなど)に変更します。

Sudo -u [user] -s /bin/bash

およびcdを直接ファイルディレクトリに移動し、ランダムなデータを新しいファイルに書き込みます。

echo "Random text" > some_file_name

通常、これは失敗し、OSからエラーメッセージが表示され、少なくともDrupalから問題が解決されます。これが機能しない場合は、ファイル権限の問題があります。この質問は役立つ: 推奨されるディレクトリ権限は何ですか?

5
Letharion

また、サーバーにグラフィカルライブラリ(php-Gdなど)がインストールされていることを確認してください。/admin/config/media/image-toolkit(D7)を確認してください。

9
Julien

エラーは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を使用することです。

  1. 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_を付けます。

  2. 以下の可能性があります。

    • 上記のテストは成功しています(ファイルがファイル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ユーザーとして実行することを忘れないでください。

5
kenorb

これは、PHPがlibjpegなしでコンパイルされている場合にも発生します(生成されないイメージにjpegソースがある場合)。Gd_info()の出力を確認して、 PHPサポート。

4
Adam DiCarlo