Kesalahan berasal dari modul Gambar (inti) dan logikanya terlihat seperti:
$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));
...
}
Oleh karena itu kesalahan terjadi ketika Drupal memiliki masalah dengan menghasilkan turunan gambar dengan menerapkan semua efek gambar dan menyimpan versi cache dari gambar yang dihasilkan.
Cara termudah mereproduksi masalah (untuk tujuan diagnosa) adalah dengan drush.
Aktifkan image_style_create_derivative () langsung dari drush:
drush -v eval 'image_style_create_derivative(reset(@image_styles()), "public://pictures/picture-123.png", "public://styles/test/test-success.png");
Ganti picture-123.png
dengan gambar yang ada dari log:
Tidak dapat menghasilkan gambar turunan yang terletak di publik: //styles/foo/public/pictures/picture-x.png
Atau gunakan yang sudah ada lainnya, mis drush sqlq "SELECT * FROM file_managed"
.
Jika Anda tidak memiliki akses ke shell, gunakan modul Devel, buka /devel/php
dan tempel kode PHP di sana.
Catatan: Jika files
folder tersebut dimiliki oleh pengguna Apache, Anda harus masuk sebagai pengguna ini untuk tujuan pengujian. Atau awali dengan perintah drush Anda sudo -u www-data
.
Ada beberapa kemungkinan berikut.
- Tes di atas telah berhasil (file telah berhasil dihasilkan di dir file Anda), jika demikian, periksa apakah gambar Anda yang gagal dari log benar-benar ada, mungkin dihapus dari server.
- Jika Anda memiliki pesan kesalahan yang sama atau file tidak dibuat, maka ada masalah dengan izin Anda atau pustaka yang hilang (periksa:)
drush eval "print_r(gd_info());"
.
- Jika Anda tidak memiliki kesalahan dan file tidak dibuat, maka periksa apakah Anda menggunakan file yang ada benar.
Masalah izin debug dapat dengan mudah dicapai oleh strace
. Instal dan awali saja perintah yang sedang Anda uji strace -f
(Anda tidak harus root).
Sebagai contoh:
$ 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)
Jika Anda masuk dengan akun berbeda yang memiliki files
, maka jangan lupa untuk awalan dengan perintah drush Anda sudo -u www-data
untuk menjalankan seluruh perintah sebagai pengguna Apache.