Как использовать более 256МБ памяти в админке?
Я разрабатываю сайт для фотографа, который загружает снимки, обычно большого размера для современных цифровых камер. Изображения требуют много памяти, особенно при выполнении операций с изображениями, таких как создание миниатюр.
Поэтому я хотел увеличить лимит памяти в админке выше 256МБ - как это можно сделать? Я разрешил CGI и PHP использовать до 1 Гигабайта, но WordPress всегда уменьшает память до 256МБ. Есть ли идеи, как исправить это на стороне клиента, которому нужна возможность автоматического обновления?
ОБНОВЛЕНИЕ: Начиная с WordPress 3.2, максимальный лимит памяти в WordPress снова станет настраиваемым.

Теоретически, редактирование вашего файла 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

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

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

Swill - У меня были точно такие же проблемы. Чёртов WordPress с некоторыми своими "фичами".
Более изящное решение - заменить все @ini_set, чтобы они брали значение из WP_MEMORY_LIMIT - проблема решена.
Кроме того, изменение значений PHP в runtime - не самое разумное решение, не уверен, почему это было реализовано :(

Судя по вашему описанию, я думаю, что проблема в этом коде в файле admin.php
:
if ( current_user_can( 'manage_options' ) )
@ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', '256M' ) );
Довольно странно, что он обрабатывает использование памяти в админке отдельно, но, по крайней мере, это можно изменить с помощью фильтра.

Перед загрузкой изображений в память функциями 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
.
Надеюсь, мой ответ был полезен.
*взлом ядра

Я просто хотел сказать спасибо пользователю 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)

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