imagecreatefromjpeg молча завершает сценарии - PullRequest
6 голосов
/ 21 марта 2009

Как и многие до меня, я пишу PHP-скрипт для создания миниатюр изображений. Сценарий получил сертификат WOMM (работает на моем компьютере), но когда я перемещаю его на свой хост (1 & 1 Basic), возникает проблема: изображения выше определенного размера файла не могут быть обработаны. Я перенес все операции в файловую систему, чтобы убедиться, что это не какая-то скрытая проблема POST. Вот соответствующий код:


function cropAndResizeImage( $imageLocation )
{
  //
  // Just to be certain
  //
  ini_set('display_errors','on');
  error_reporting(E_ALL);
  ini_set('memory_limit','128M'); 
  ini_set('max_execution_time','300');  

  $image_info   = getimagesize($imageLocation);
  $image_width  = $image_info[0];
  $image_height = $image_info[1];
  $image_type   = $image_info[2];

  switch ( $image_type )
  {
    // snip...
    case IMAGETYPE_JPEG:
      $image = imagecreatefromjpeg($imageLocation);
      break;

    default:
      break;
  }

  // snip...
}

Используя мои мистические способности отладки println, я смог определить, что imagecreatefromjpeg не возвращается; фактически сценарий полностью останавливается, когда до него доходит. Некоторые факты:

  • Это связано с размером файла. Изображения размером менее 1 МБ выглядят хорошо (с выборочной проверкой), но изображения размером около 3 МБ. Хотя понятия не имею, что такое точное обрезание.
  • Это не связано с таймаутами сервера; wget возвращает в <1 с для изображений размером 3 МБ, значительно дольше для «соответственно небольших» изображений (что указывает на отсутствие обработки больших изображений). </li>
  • Префикс вызова функции с @ для подавления ошибок не имеет никакого эффекта. Это хорошо согласуется с тем фактом, что скрипт не выдает ошибку, он просто молча завершается при вызове этой функции.

Если бы мне пришлось угадывать, может быть, есть какой-то параметр GD, о котором я не знаю (или не имею доступа), который ограничивает размеры входных файлов на серверах 1 & 1 & mdash; угадывание переменной конфигурации связано с тем, что она немедленно срабатывает и не появляется (эвристически) для какой-либо реальной загрузки или вычислений на изображении.

Есть предложения? Спасибо за помощь.

Обновление (любезно предоставлено @ комментариями Даррила ): вызовы phpinfo указывают, что PHP корректно обновляет переменные max_execution_time и memory_limit. Это не обязательно означает, что эти ресурсы распределяются, просто кажется, что они функционируют должным образом.

Обновление 2: , следуя некоторым рекомендациям Google, я безуспешно пытался оптимизировать JPEG (качество уменьшено с 3 МБ до 200 КБ), поэтому это не проблема размера файла изображения. Затем я попытался уменьшить количество пикселей исходного изображения 3888x2592, и первый успешный размер - 1400x2592 (1401x и 1402x приводят к получению половинного анализа и ошибкам, указывающим на «искаженный JPEG»), что не имеет особого смысла, если только изображение не полностью не загружается). Уменьшая его до 1300x2592, я могу создать экземпляр миниатюрного изображения 400x300, которое на самом деле ищу; в 1400x2592 вызов imagecreatetruecolor, который я использую для решения этой задачи, завершается молча так же, как и imagecreatefromjpeg.

Что касается того, почему это так, я немного неуверен. 1400 * 2592 == 3,5 МБ не дает ничего особенно значимого, но я должен представить, что это ограничение на количество пикселей, которые GD + PHP будет обрабатывать.

Ответы [ 2 ]

2 голосов
/ 21 марта 2009

Пожалуйста, смотрите это примечание относительно использования памяти на сайте php.

* "Память, необходимая для загрузки изображения с помощью imagecreatefromjpeg (), является функцией размеров изображения и битовой глубины изображений, умноженной на служебную информацию.

Можно рассчитать по этой формуле:

число байтов = ширина * высота * байты на пиксель * коэффициент служебной пометки "*

1 голос
/ 21 марта 2009

Я предполагаю, что 1 & 1 не позволяют вам изменять сценарии memory_limit или max_execution_time, поэтому, вероятно, не хватает памяти Вы пытались запустить phpinfo(), чтобы увидеть, каковы ограничения?

...