Невозможно сгенерировать производное изображение

8

Сегодня я загрузил свой сайт на сервер, и у меня появляются такие ошибки:

Невозможно сгенерировать производное изображение, расположенное по адресу public: //styles/sponsor_image/public/TerraThermaSponsorLogo.png.

Стили изображений не могут генерировать изображения. Я пытался установить разрешения для папок styles / * с chmod -R 775 styles/, и даже пытался chmod -R 777 styles/. Владелец папки в порядке. Я не понимаю, что может быть не так.

Каталог, связанный с public: // это sites / default / files, и это нормально.

Петр Попелишко
источник

Ответы:

5

Вкратце, это то, что я делаю всякий раз, когда у меня возникает эта проблема:

Измените пользователя на того, на котором работает ваш веб-сервер (apache, httpd, www-data, nginx и т. Д.)

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

и cdпрямо в каталог файлов, и попробуйте записать случайные данные в новый файл.

echo "Random text" > some_file_name

Обычно это заканчивается неудачей, и вы получите сообщение об ошибке из ОС, по крайней мере, из Drupal. Если это не работает, у вас есть проблема с правами доступа к файлам. Этот вопрос может быть полезен: каковы рекомендуемые права доступа к каталогу?

Letharion
источник
да вы правы, я ничего не могу написать: /
Петр Попелишко
1
Тогда у вас все еще есть проблема с разрешениями на уровне файловой системы. Предполагается, что у вас есть каталоги ближе к корню, в которые веб-серверу не разрешено писать. Это тема для некоторых форумов, не связанных с Drupal, поскольку у нас теперь есть все виды проблем, связанных с файловой системой и операционной системой. Вы по крайней мере знаете, что проблема не в Друпале сейчас. :)
Летарион
Я могу написать что-то как www-data, но я все еще получаю ошибку. Что еще мне делать? ImageMagick настроен правильно, я запускаю это на сервере, который имеет много установок Drupal.
nnyby
@nnyby На данный момент, я не совсем уверен, что делать дальше. Единственное, о чем я могу подумать, это начать копаться в исходном коде, где происходит ошибка.
Летарион
Я решил проблему - файлы образов, которые искал Drupal, на самом деле не существовали, а сообщение об ошибке вводило в заблуждение.
nnyby
9

Вы также должны убедиться, что на вашем сервере установлена ​​графическая библиотека (например, php-gd): check / admin / config / media / image-toolkit (D7).

Julien
источник
1
После перехода на другой сервер я получил эту ошибку. Конечно, я забыл apt-get php5-gd ;-)
TheSquad
5

Ошибка исходит от модуля 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. Вызовите image_style_create_derivative () непосредственно из drush:

    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. Есть следующие возможности.

    • Вышеупомянутый тест был успешным (файл был успешно создан в вашей директории файлов), если это так, проверьте, действительно ли существует ваша ошибочная картинка из журнала, возможно, она была удалена с сервера.
    • Если у вас такое же сообщение об ошибке или файл не был создан, значит, это проблема с вашим разрешением или отсутствующими библиотеками (проверьте:) 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.

kenorb
источник
4

Это также может быть вызвано тем, что PHP компилируется без libjpeg (если изображения, которые не будут генерироваться, имеют источники jpeg). Проверьте выходные данные, gd_info()чтобы увидеть, есть ли поддержка PHP.

Адам ДиКарло
источник
3
для быстрой печати из командной строки: php -r 'print_r (gd_info ());'
латышский
Это была определенно моя проблема. (И спасибо @latvian за быстрый ссылки
CMD