Не хватает памяти при загрузке изображения


Иногда, когда я загружаю изображение (либо с помощью flash, либо с помощью загрузчика браузера), я получаю сообщение типа (это было с jpg размером 1,46 МБ):

Fatal error: Out of memory (allocated 69206016) (tried to allocate 4000 bytes) in /home/ab64489/public_html/wp-includes/media.php on line 254

Я нахожусь на общем хостинге, но максимальный размер загрузки составляет 64 МБ. Я пробовал загружать другие файлы (я сделал zip из нескольких случайных файлов, с архивом общим объемом ~58,1 МБ, и он загружается и сжимается без проблем, так что это не размер файла). Также кажется, что загрузка работает нормально, но когда она пытается захрустеть, она сталкивается ошибка.

Я видел подобные проблемы здесь и на других сайтах без реальных решений.

Что может быть причиной этой проблемы?

Author: Teknophilia, 2011-09-16

2 answers

Это не проблема Wordpress. В общей среде невозможно сказать, кто может быть виновником. Вероятно, у вас нет доступа к вашей конфигурации php.ini, и мы не знаем, сколько веб-сайтов ваша хостинговая компания заблокировала на вашем сервере.

Сама природа общего сервера заключается в том, что каждый клиент совместно использует ресурсы этого одного сервера. Если один веб-сайт использует огромное количество ресурсов, пока вы пытаетесь загрузить свое изображение, это, безусловно, повлияет это.

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

 1
Author: Brian Fegter, 2011-09-16 22:00:53

Мое решение (в wordpress 3.3.1) состояло в том, чтобы выполнить сжатие изображения самостоятельно, а затем добавить одну запись в таблицу метаданных в БД.

Для сжатия изображения я отметил, что все другие правильно сжатые файлы были сжаты до трех согласованных размеров: 150x150, Mx300 и Nx1024, где M и N будут поддерживать соотношение исходного изображения.

В таблице метаданных уже была запись для моей недавно созданной записи. Отсортируйте по post_id, а затем найдите запись с вашим post_id и meta_key = _wp_attached_file чтобы убедиться, что твой там.

Моя соответствующая строка имеет значение meta_value = 2012/04/get_in_shape.png.

Теперь самое интересное! Найдите строку (из сообщения, изображение которого было правильно сжато) с meta_key = _wp_attachment_metadata и используйте его значение meta_value в качестве шаблона для вашей новой строки.

В вашей новой строке значения должны быть

`meta_id`  (null)  as it's an AUTOINCREMENT field
`post_id`  (your post id)
`meta_key` _wp_attachment_metadata
`meta_value`  (as below)

Ниже приводится serialize() отредактированная строка с данными, которые работали для меня в течение meta_value. Это не будет работать для вас без хитростей. Если вы можете сделать все вышеперечисленное, вы, безусловно, сможете также выполнить настройки.

a:6:{s:5:"width";s:4:"3321";s:6:"height";s:4:"4153";s:14:"hwstring_small";s:22:"height='96' width='67'";s:4:"file";s:24:"2012/03/get_in_shape.png";s:5:"sizes";a:3:{s:9:"thumbnail";a:3:{s:4:"file";s:24:"get_in_shape-150x150.png";s:5:"width";s:3:"150";s:6:"height";s:3:"150";}s:6:"medium";a:3:{s:4:"file";s:24:"get_in_shape-240x300.png";s:5:"width";s:3:"212";s:6:"height";s:3:"300";}s:5:"large";a:3:{s:4:"file";s:25:"get_in_shape-819x1024.png";s:5:"width";s:3:"724";s:6:"height";s:4:"1024";}}s:10:"image_meta";a:10:{s:8:"aperture";s:1:"0";s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";s:1:"0";s:9:"copyright";s:0:"";s:12:"focal_length";s:1:"0";s:3:"iso";s:1:"0";s:13:"shutter_speed";s:1:"0";s:5:"title";s:0:"";}}

Видишь штуку, похожую на тропинку 2012/04/get_in_shape.png? Это путь к вашему файлу (с wp-контентом в качестве понятного префикса). Обратите внимание, что ему предшествует s:24, который является длиной строки значения. Измените путь, чтобы он соответствовал вашему файлу, затем измените 24, чтобы они соответствовали длине используемого вами пути.

Сделайте это для каждого размера файла, сохраните новую запись, и вы будете в восторге.

НЕ ПЫТАЙТЕСЬ ЭТО если вы мало/совсем не знаете, как это сделать. Просто говорю, что есть более дешевый(*) метод, чем переход на новый хост.

(*) если обучение всему этому в универе считается дешевым.

 0
Author: Thunder Rabbit, 2012-03-08 01:55:25