Как и многие до меня, я пишу 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 будет обрабатывать.