Lỗi đến từ mô-đun hình ảnh (lõi) và logic trông như sau:
$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));
...
}
Do đó, lỗi xảy ra khi Drupal gặp vấn đề với việc tạo đạo hàm hình ảnh bằng cách áp dụng tất cả các hiệu ứng hình ảnh và lưu phiên bản được lưu trong bộ nhớ cache của hình ảnh thu được.
Cách dễ nhất để tái tạo vấn đề (cho mục đích chẩn đoán) là bằng cách đánh trống.
Gọi trực tiếp image_style_create_derivative () từ drush:
drush -v eval 'image_style_create_derivative(reset(@image_styles()), "public://pictures/picture-123.png", "public://styles/test/test-success.png");
Thay thế picture-123.png
bằng hình ảnh hiện có từ nhật ký:
Không thể tạo hình ảnh xuất phát ở nơi công cộng: //styles/foo/public/pictures/picture-x.png
Hoặc sử dụng bất kỳ cái nào khác hiện có, ví dụ drush sqlq "SELECT * FROM file_managed"
.
Nếu bạn không có quyền truy cập shell, hãy sử dụng mô-đun Devel, đi đến /devel/php
và dán mã PHP ở đó.
Lưu ý: Nếu files
thư mục thuộc sở hữu của người dùng Apache, bạn nên đăng nhập với tư cách người dùng này cho mục đích thử nghiệm. Nếu không, tiền tố lệnh drush của bạn với sudo -u www-data
.
Có những khả năng sau đây.
- Thử nghiệm ở trên đã thành công (tệp đã được tạo thành công trong thư mục tệp của bạn), nếu vậy, hãy kiểm tra xem ảnh thất bại của bạn từ nhật ký có thực sự tồn tại không, có thể nó đã bị xóa khỏi máy chủ.
- Nếu bạn có cùng thông báo lỗi hoặc tệp không được tạo, thì đó là vấn đề với sự cho phép của bạn hoặc thư viện bị thiếu (kiểm tra
drush eval "print_r(gd_info());"
:).
- Nếu bạn không có bất kỳ lỗi nào và tệp không được tạo, thì hãy kiểm tra xem bạn đã sử dụng đúng các tệp hiện có chưa.
Vấn đề cấp phép gỡ lỗi có thể dễ dàng đạt được bằng cách strace
. Cài đặt nó và chỉ cần tiền tố bất kỳ lệnh nào mà bạn đang thử nghiệm strace -f
(bạn không phải root).
Trong ví dụ:
$ 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)
Nếu bạn đã đăng nhập bằng tài khoản khác sở hữu files
, thì đừng quên tiền tố lệnh drush của bạn sudo -u www-data
để chạy toàn bộ lệnh với tư cách là người dùng Apache.