Как использовать более 256МБ памяти в админке?

26 окт. 2010 г., 12:21:17
Просмотры: 23.2K
Голосов: 11

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

Поэтому я хотел увеличить лимит памяти в админке выше 256МБ - как это можно сделать? Я разрешил CGI и PHP использовать до 1 Гигабайта, но WordPress всегда уменьшает память до 256МБ. Есть ли идеи, как исправить это на стороне клиента, которому нужна возможность автоматического обновления?

ОБНОВЛЕНИЕ: Начиная с WordPress 3.2, максимальный лимит памяти в WordPress снова станет настраиваемым.

2
Комментарии

Привет, давно тебя не видел. Наверное, был занят клиентами — это хорошо! А не думал вынести обработку изображений на сторону, например, используя Amazon S3 и EC2? http://aws.amazon.com/articles/1602 Или Google App Engine? https://code.google.com/appengine/docs/python/images/usingimages.html Или может http://urlimg.com/?

MikeSchinkel MikeSchinkel
26 окт. 2010 г. 13:02:34

@MikeSchnikel — Привет! Я хочу решить это именно через WordPress. Если бы мне понадобился сервер для превью, я бы вообще не использовал WordPress. Но спасибо за ссылки, как минимум интересно :).

hakre hakre
26 окт. 2010 г. 13:20:56
Все ответы на вопрос 6
2
13

Теоретически, редактирование вашего файла config.php и добавление этой строки перед подключением wp-settings.php:

define('WP_MEMORY_LIMIT', '256M');

должно увеличить лимит памяти для WordPress до 256MB или любого другого указанного вами значения. И это будет работать для всего сайта. Однако, как отметил sorich87, есть несколько функций, которые перезаписывают этот параметр жестко заданным лимитом в 256 MB.

Хакнуть или не хакнуть

Небольшое замечание по этому поводу: WP_MEMORY_LIMIT — одна из самых странных настроек WordPress, с которыми я сталкивался. Если вы посмотрите /wp-includes/default-constants.php, вы найдете такие настройки:

// установка лимитов памяти
if ( !defined('WP_MEMORY_LIMIT') ) {
    if( is_multisite() ) {
        define('WP_MEMORY_LIMIT', '64M');
    } else {
        define('WP_MEMORY_LIMIT', '32M');
    }
}

Я никогда не осознавал, что WordPress устанавливает лимит памяти настолько низким, пока не нашел это в кодексе WordPress:

WordPress автоматически проверит, выделено ли PHP меньше памяти, чем указанное значение, перед использованием этой функции. Например, если PHP выделено 64MB, нет необходимости устанавливать это значение в 64M, так как WordPress автоматически использует все 64MB, если это потребуется. (источник)

Это объяснение было обнадеживающим. Однако использование жесткого @ini_set('memory_limit', '256M'); каждый раз, когда WordPress выполняет функцию, требующую больше памяти, никогда не упоминается. Фактически, я не нашел объяснения этому неясному поведению в кодексе WordPress. Поскольку большинство функций, не связанных с пользователем, либо не задокументированы, либо объяснены недостаточно четко.

Хотя эта настройка работает хорошо в большинстве случаев, она делает эти функции бесполезными на серверах с меньшим максимальным лимитом памяти или, в вашем случае, с более высоким потреблением памяти.

Пока разработчики WordPress не исправят это, единственное решение — модифицировать ядро. Вам может быть интересно прочитать этот пост, написанный hakre. Он также предложил рекомендацию по исправлению в Trac. Предыдущая ссылка на файл исправления может помочь вам найти список функций, использующих эту настройку.

редактирование:

Это самый глупый ответ, который я когда-либо давал, потому что я дал ссылку на ваш собственный пост (осознал, что имя автора было hakre, только спустя 2 дня) :D

редактирование 2:

Как упоминалось в комментариях, это было исправлено в версии 3.2

26 окт. 2010 г. 18:27:00
Комментарии

ваш ответ далек от того, чтобы быть глупым. Если быть точным, это было довольно глупо с моей стороны задавать этот вопрос, когда я уже знал ответ, и ваш комментарий полностью показывает, что вы это поняли. Честно, мои глубочайшие извинения, размещение ссылки здесь было настолько правильным, насколько я сам понимал, задавая вопрос, так что тут и добавить нечего? Спасибо, что были настолько открыты, чтобы признать это! Мне нравится ваш стиль, и я связал свой блог с вашим ответом (не просто оставил обратную ссылку на блог).

hakre hakre
13 февр. 2011 г. 03:32:49

В версии 3.2 это должно быть настраиваемым: Изменение 17749

hakre hakre
5 мая 2011 г. 02:29:28
0

Swill - У меня были точно такие же проблемы. Чёртов WordPress с некоторыми своими "фичами".

Более изящное решение - заменить все @ini_set, чтобы они брали значение из WP_MEMORY_LIMIT - проблема решена.

Кроме того, изменение значений PHP в runtime - не самое разумное решение, не уверен, почему это было реализовано :(

10 мая 2011 г. 02:30:33
1

Судя по вашему описанию, я думаю, что проблема в этом коде в файле admin.php:

if ( current_user_can( 'manage_options' ) )
    @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', '256M' ) );

Довольно странно, что он обрабатывает использование памяти в админке отдельно, но, по крайней мере, это можно изменить с помощью фильтра.

26 окт. 2010 г. 12:41:15
Комментарии

Это не работает для операций с изображениями в админке. Они снова уменьшаются до 256 МБ, независимо от того, использую я этот фильтр или нет. :/

hakre hakre
26 окт. 2010 г. 13:17:46
1

Перед загрузкой изображений в память функциями GD используется @ini_set('memory_limit', '256M');.

imagecreatefromstring() (строка 253, wp-includes/media.php) вызывается через wp_load_image(), который, в свою очередь, используется в image_resize (функция, где происходит обработка изображений для создания миниатюр). Лимит памяти устанавливается на строке 252, поэтому, насколько я вижу, изменить это без убийства котёнка* >:) не получится.

Также функции GD используются в load_image_to_edit() (строка 200, wp-admin/includes/image-edit.php). Это часть редактора изображений (лично я им никогда не пользовался, даже не знал, где его найти :)). Если ваш клиент им пользуется, возможно, стоит установить лимит памяти и там. Для этого есть фильтр load_image_to_edit_path.

Надеюсь, мой ответ был полезен.

*взлом ядра

26 окт. 2010 г. 15:41:40
Комментарии

Да, они жестко прописаны в нескольких функциях админки, связанных с изображениями. Существует константа WP_MEMORY_LIMIT и даже фильтр admin_memory_limit, но ни один из них не учитывается в этих нескольких случаях.

User User
26 окт. 2010 г. 15:56:01
1

Я просто хотел сказать спасибо пользователю bangbambang. Это первый пост, который дал мне понимание, почему добавление строки define('WP_MEMORY_LIMIT', '512M'); в wp-config.php на самом деле не работало. Я потратил часы, пытаясь разобраться в этой проблеме...

Мой импорт завершался ошибкой "256M exhausted" (исчерпание памяти), несмотря на все мои попытки увеличить лимит памяти.

Вот места, где лимит памяти жестко задан как 256M (по крайней мере в версии 3.0.5):

wp-admin/includes/file.php (строка 532)

wp-admin/includes/image-edit.php (строки 393 и 498)

wp-includes/media.php (строка 252)
10 февр. 2011 г. 00:18:04
Комментарии

Тикет #13847 содержит прикреплённый патч, который делает эти места настраиваемыми с помощью дополнительной константы WP_MAX_MEMORY_LIMIT.

hakre hakre
10 февр. 2011 г. 00:29:29
0
-4
/* Лимит памяти */
define( 'WP_MEMORY_LIMIT', '1G' );
define( 'WP_MAX_MEMORY_LIMIT', '1G');
22 мар. 2016 г. 08:48:44