Ошибка GD (PHP) из-за неправильного изменения размера изображения JPEG (Laravel Intervention\Image), ошибки в error.log нет

Я использую Apache/PHP 5.6 как в Windows, так и в Ubuntu. Используя Laravel 5.1 и Intervention/Image с драйвером GD, я пытаюсь изменить размер некоторых довольно больших изображений (15-25 МБ), проблема в том, что изменение размера не выполняется с ошибкой Unable to read image from file (/tmp/phpxxxxxx), но только на больших изображениях. Все в диапазоне 5-10 МБ не вызывает проблем с изменением размера...

Я предполагаю, что это как-то связано с тем, что процессу не хватает памяти (поскольку файлы меньшего размера не имеют проблем), однако проблема в том, что я вообще не получаю никаких сообщений об ошибках в error.log...

Я увеличил memory_limit в моем php.ini до 2000M для тестирования, но изменение размера по-прежнему не удается.

Код в контроллере для изменения размера изображения...

$img = Img::make($file->getRealPath());

Подробности ошибки, о которой сообщалось через Laravel, приведены ниже...

NotReadableException in Decoder.php line 46:
Unable to read image from file (C:\Apache24\htdocs\tmp\php361F.tmp).
in Decoder.php line 46
at Decoder->initFromPath('C:\Apache24\htdocs\tmp\php361F.tmp') in AbstractDecoder.php line 293
at AbstractDecoder->init('C:\Apache24\htdocs\tmp\php361F.tmp') in AbstractDriver.php line 64
at AbstractDriver->init('C:\Apache24\htdocs\tmp\php361F.tmp') in ImageManager.php line 50
at ImageManager->make('C:\Apache24\htdocs\tmp\php361F.tmp') in Facade.php line 216
at Facade::__callStatic('make', array('C:\Apache24\htdocs\tmp\php361F.tmp')) in SubmitPhotoController.php line 97
at Image::make('C:\Apache24\htdocs\tmp\php361F.tmp') in SubmitPhotoController.php line 97
at SubmitPhotoController->store()

Как мне продолжить устранение неполадок, чтобы выяснить, почему это не удается?

ПРИМЕЧАНИЯ:

  1. Я уменьшил memory_limit только для того, чтобы убедиться, что низкое значение будет отображать ошибку при изменении размера, и это так, поэтому я не думаю, что это проблема с памятью PHP.
  2. Я вижу, что файл появляется в C:\Apache24\htdocs\tmp, прежде чем быстро исчезнуть.

РЕДАКТИРОВАТЬ:

upload_max_filesize = 2000M
post_max_size = 2000M

РЕДАКТИРОВАТЬ 2: После некоторого тестирования изображения, которые не удались, были созданы функцией панорамы на моем мобильном телефоне. Даже файлы меньшего размера не удавались.


person dangel    schedule 22.09.2016    source источник
comment
Лучше используйте свой код на сервере Linux, я видел много странных ошибок при использовании Windows LAMP. Также для обработки больших изображений и видео я использую ffmpeg для выполнения этой части.   -  person Dionis L    schedule 22.09.2016
comment
@DionisL точно такая же ошибка в Ubuntu 16.04 с PHP7. Просто замените C:\Apache24\htdocs на /tmp/phpxxxxx   -  person dangel    schedule 22.09.2016
comment
Может ли это быть на исходе времени? Проверьте max_execution_time в php.ini   -  person Patrick Moore    schedule 22.09.2016
comment
@PatrickMoore, max_execution_time=60, однако фактическая загрузка\изменение размера занимает всего несколько секунд до ошибки   -  person dangel    schedule 22.09.2016
comment
@DionisL Я ценю это предложение, но пытаюсь отладить эту ошибку, прежде чем переходить к чему-то другому (что, вероятно, в конечном итоге окажется imagemagick)   -  person dangel    schedule 22.09.2016
comment
Php gd хорош, но в производстве хорош для небольших изображений, а не для очень больших, php, являющийся скриптом, который работает под apache, лучше передать работу по изменению размера изображений специальному инструменту, такому как ffmpeg   -  person Dionis L    schedule 22.09.2016
comment
Да, надеюсь, вы найдете ошибку, потому что мне тоже любопытно. Я буду следить здесь, чтобы увидеть, как решено   -  person Dionis L    schedule 22.09.2016
comment
Что-то из этого помогает? stackoverflow.com/questions/24195028 // stackoverflow.com/questions/33468437/   -  person Patrick Moore    schedule 22.09.2016
comment
Также интересно, есть ли в вашей форме скрытое входное значение MAX_FILE_SIZE?   -  person Patrick Moore    schedule 22.09.2016
comment
@PatrickMoore не имеет MAX_FILE_SIZE, установленного в форме   -  person dangel    schedule 22.09.2016
comment
@PatrickMore, я просмотрел эти ссылки, не думаю, что это проблема, поскольку они правильно работают для изображений среднего размера. Но это дает мне несколько советов по устранению неполадок.   -  person dangel    schedule 22.09.2016
comment
Глупый вопрос, служба Apache была перезапущена после изменения значений максимального размера публикации/максимального размера загрузки?   -  person Patrick Moore    schedule 22.09.2016
comment
Не глупый вопрос (потому что я уже делал эту ошибку раньше...) Но да, это было.   -  person dangel    schedule 22.09.2016
comment
@dangel, если вы действительно хотите отладить это, сохраните большое изображение где-нибудь на своем сервере и попробуйте изменить его размер, таким образом вы устраните все вещи с HTTP-запросами. Если это работает, значит, что-то не так с вашей формой / запросами, если это не так. t тогда что-то не так с вашей базовой настройкой php/gd/server   -  person vitr    schedule 22.09.2016
comment
@vitr Он не работает даже с локальным изображением, так что это не загрузка формы, но я заметил, что он не работает даже на изображениях меньшего размера, если они имеют большие размеры (панорамы)   -  person dangel    schedule 24.09.2016
comment
@dangel у вас закончилась память, проверьте этот сайт dotsamazing.com/en/labs/phpmemorylimit и поиграйтесь с цифрами, 2 гига это ничто для либа типа GD))   -  person vitr    schedule 24.09.2016
comment
@vitr, разве это не будет отображаться в журналах ошибок? Кроме того, теперь я могу заставить его работать только с изображениями размером 3 МБ.   -  person dangel    schedule 24.09.2016
comment
@dangel, вы можете поделиться неудачным источником изображения? может быть много вещей, я могу попытаться изменить его размер, чтобы проверить, в порядке ли изображение   -  person vitr    schedule 24.09.2016
comment
@vitr, что интересно, мне не удалось загрузить это изображение в Imgur... postimg.org/image/ i4dy0ppar   -  person dangel    schedule 24.09.2016
comment
@dangel, чувак, ты должен заархивировать его, если хочешь поделиться настоящим источником, ты разработчик?   -  person vitr    schedule 24.09.2016
comment
@vitr.. в чем смысл твоего вопроса? этот образ все еще терпит неудачу. ты хоть пробовал?   -  person dangel    schedule 24.09.2016
comment
я хочу сказать, что вы предоставили обработанное изображение через сторонний сервис, а не оригинал   -  person vitr    schedule 24.09.2016
comment
это все еще не удалось, так что это была действующая ссылка. Проблема решена, спасибо за помощь   -  person dangel    schedule 24.09.2016


Ответы (1)


Нужно было сказать GD, чтобы он игнорировал предупреждения от плохого JPEG, поскольку, по-видимому, GD не очень терпим к неисправным или сломанным JPEG. Эти изображения, которые не удавались, были фактически созданы на моем телефоне с помощью встроенного инструмента панорамы. Большие изображения, загруженные онлайн или открытые\сохраненные в фотошопе (восстановленные), на самом деле были в порядке после того, как я начал тестирование.

ini_set("gd.jpeg_ignore_warning", 1);

https://stackoverflow.com/a/3901885/895810 и https://bugs.php.net/bug.php?id=39918.

Проблема возникла из-за следующих строк Intervention\Image\Gd\Decoder.php

....
$info = @getimagesize($path);
...

// define core
        switch ($info[2]) {
            case IMAGETYPE_PNG:
                $core = @imagecreatefrompng($path);
                break;

            case IMAGETYPE_JPEG:
                $core = @imagecreatefromjpeg($path); //<--------here
                dd($core);
                break;

Я мог представить, что столкнусь с другими проблемами, полностью игнорируя предупреждения.

person dangel    schedule 24.09.2016