Ограничение разрешения изображений при загрузке
У меня возникает проблема, когда особенно большое изображение вызывает перезагрузку моего VPS сервера из-за проблем с памятью. Конфигурация этого механизма не в моих руках, это что-то вроде защитного механизма хостинга.
У меня VPS с 300Мб памяти, что, как я считаю, достаточно для моей установки WordPress, по крайней мере для повседневных операций.
Изображение, которое я загружаю, не особо большое по размеру файла (~380 Кб) и в основном черное с белыми буквами. Однако его разрешение составляет 4583 * 4583 пикселей. Когда я загружаю его через WordPress, я получаю HTTP-ошибку в окне загрузки, а когда проверяю живой сайт, он недоступен в течение пары минут.
Мне интересно, возможно ли определить разрешение изображения и предотвратить его загрузку. Я достаточно сообразителен, чтобы немного повозиться в графическом редакторе, но некоторые из моих авторов могут не обладать достаточными навыками для обработки изображения перед загрузкой чего-то настолько большого.
Было бы еще лучше, если бы ограничение могло основываться на битах на пиксель изображения, но я не знаю, каков предел моего сервера для этого, поэтому, думаю, сообщение об ошибке, говорящее, что изображение не может быть загружено, потому что оно больше, скажем, 2000 * 2000, будет достаточным.

Проблема заключается не столько в самой загрузке, так как это процесс передачи данных между клиентом и сервером. Это не то, что потребляет память сервера.
Когда WordPress начинает "обработку" изображений, именно здесь вступает в действие PHP, который начинает изменять размеры и обрезать загруженные изображения. Именно перед этим моментом вам нужно вмешаться и выполнить несколько проверок, прежде чем позволить PHP использовать вашу память.
Используя фильтр wp_handle_upload_prefilter
, вы можете подключить функцию, которая выполнит любые проверки изображения перед его обработкой:
<?php
/* Утилиты Marc Dingena
* Проверка разрешения изображения перед обработкой
*/
add_filter('wp_handle_upload_prefilter','mdu_validate_image_size');
function mdu_validate_image_size( $file ) {
$image = getimagesize($file['tmp_name']);
$minimum = array(
'width' => '400',
'height' => '400'
);
$maximum = array(
'width' => '2000',
'height' => '2000'
);
$image_width = $image[0];
$image_height = $image[1];
$too_small = "Размеры изображения слишком малы. Минимальный размер — {$minimum['width']} на {$minimum['height']} пикселей. Загруженное изображение имеет размер $image_width на $image_height пикселей.";
$too_large = "Размеры изображения слишком велики. Максимальный размер — {$maximum['width']} на {$maximum['height']} пикселей. Загруженное изображение имеет размер $image_width на $image_height пикселей.";
if ( $image_width < $minimum['width'] || $image_height < $minimum['height'] ) {
// Добавляем сообщение об ошибке в массив $file
$file['error'] = $too_small;
return $file;
}
elseif ( $image_width > $maximum['width'] || $image_height > $maximum['height'] ) {
// Добавляем сообщение об ошибке в массив $file
$file['error'] = $too_large;
return $file;
}
else
return $file;
}
?>

Для плагина попробуйте http://wordpress.org/plugins/imsanity/, который поможет предотвратить загрузку слишком больших изображений другими пользователями сайта.
Imsanity автоматически изменяет размер загружаемых огромных изображений до более разумного для отображения в браузере, но все же достаточно большого для типичного использования на сайте. Плагин настраивается с указанием максимальной ширины, высоты и качества. Когда участник загружает изображение, превышающее заданные размеры, Imsanity автоматически уменьшит его до указанных параметров и заменит оригинальное изображение.

Что касается потребления памяти PHP в WordPress при обработке изображений, как бы вы сравнили этот плагин? Не приведет ли этот плагин к такой же нагрузке на сервер?

Этот плагин хорош для уменьшения общего используемого дискового пространства из-за загрузки очень больших исходных изображений, но вопрос был не об этом. Imsanity не решает проблему, когда исходная загрузка не обрабатывается из-за слишком больших размеров изображения в пикселях, что приводит к нехватке памяти в PHP.

Возможно, что на вашем сервере достаточно памяти для выполнения задачи, но установленный лимит памяти в PHP слишком мал для обработки очень больших изображений.
Попробуйте увеличить значение memory_limit
в файле php.ini.
memory_limit=256M
*Примечание: В некоторых хостинг-средах это может быть не лучшим решением.

Для плагина попробуйте https://es.wordpress.org/plugins/cheetaho-image-optimizer/, он поможет предотвратить загрузку изображений слишком большого размера другими пользователями сайта.
