Como usar mais de 256 MB de memória no administrador?

10

Estou construindo um site para um fotógrafo que envia fotos normalmente grandes para as câmeras digitais de hoje. As imagens consomem muita memória, especialmente as operações de imagem, como a criação de miniaturas.

Então, eu queria aumentar o limite de memória no administrador acima de 256 MB - como isso pode ser feito? Eu permiti que CGI e PHP usassem até 1 Gigabyte, mas o wordpress sempre diminui a memória para 256 MB. Alguma idéia de como corrigir isso no lado do cliente que precisa ser capaz de atualizar automaticamente?

ATUALIZAÇÃO: No Wordpress 3.2 em andamento, o limite máximo de memória no Wordpress poderá ser configurado novamente .

hakre
fonte
Ei, não te vejo há um tempo. Acho que você esteve ocupado com os clientes; bom para você! Você já pensou em transferir o processamento da imagem, talvez usar o Amazon S3 e EC2? aws.amazon.com/articles/1602 Ou o Google App Engine? code.google.com/appengine/docs/python/images/usingimages.html Ou usando urlimg.com ?
MikeSchinkel
@MikeSchnikel - Hej! Estou procurando resolver isso com o wordpress. Se eu precisar configurar um servidor de miniaturas, não usaria o wordpress. Mas obrigado pelos links, muito interessante pelo menos :).
hakre

Respostas:

13

Teoricamente, edite seu config.php e adicione esta linha antes da inclusão do wp-settings.php.

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

deve aumentar o limite de memória do WordPress para 256 MB ou o valor que você definir. E isso funcionará em todo o site. No entanto, como sorich87 apontou , existem poucas funções que alterarão essa configuração com um limite de 256 MB codificado.

Para hackear ou não hackear

Um pouco de preocupação com isso, WP_MEMORY_LIMITé uma das configurações WP mais estranhas que já encontrei. se você verificar, /wp-includes/default-constants.phpencontrará esta configuração:

// set memory limits
if ( !defined('WP_MEMORY_LIMIT') ) {
    if( is_multisite() ) {
        define('WP_MEMORY_LIMIT', '64M');
    } else {
        define('WP_MEMORY_LIMIT', '32M');
    }
}

Eu nunca percebi que o WP definirá seu uso de memória padrão tão baixo, até encontrar isso no codex WP:

O WordPress verificará automaticamente se o PHP recebeu menos memória que o valor digitado antes de utilizar esta função. Por exemplo, se o PHP tiver sido alocado a 64 MB, não há necessidade de definir esse valor para 64M, pois o WordPress usará automaticamente todos os 64MB, se necessário. ( Fonte )

Essa explicação foi aliviante. No entanto, o uso da @ini_set('memory_limit', '256M');função de execução WP sempre codificada sempre que precisar de mais memória nunca é mencionado . De fato, não encontro nenhuma explicação sobre esse comportamento vago do WP codex. Como a maioria das funções não relacionadas ao usuário não é documentada ou não é explicada claramente no codex.

Embora essa configuração funcione bem na maioria dos casos, ela tornará essas funções inúteis no servidor com configuração de memória máxima mais baixa ou, no seu caso, maior uso de memória.

Até que o pessoal do WP conserte isso, acho que sua única solução é modificar o núcleo. Você pode achar este post escrito por hakre interessante de ler. Ele também enviou uma recomendação de patch no Trac. O link anterior para o arquivo de correção pode ajudá-lo a encontrar a lista de funções que usam essa configuração.

editar:

esta é a resposta mais estúpida que já dei, porque dou um link para o seu próprio post (apenas perceba que o nome do OP foi hakre após 2 dias): D

editar 2:

como mencionado no comentário, isso foi corrigido pela versão 3.2

bangbambang
fonte
sua resposta está longe de ser estúpida. Para ser preciso, foi meio estúpido da minha parte postar esta pergunta enquanto eu já sabia a resposta, e seu comentário mostra totalmente que você realmente passou por cima dela. Realmente, minhas maiores desculpas, postar o link aqui foi tão certo quanto eu me conhecia ao postar a pergunta, então o que dizer? Obrigado por estar aberto a admitir isso! Eu gosto do seu estilo e vinculei meu blog à sua resposta (não apenas vinculado ao blog).
hakre
No 3.2, isso deve ser configurável: Changeset 17749
hakre
1

@ini_set('memory_limit', '256M');antes de as imagens são carregadas na memória por funções GD.

imagecreatefromstring()(linha 253, wp-includes / media.php) é usado pelo wp_load_image()qual é usado por image_resize(a função em que o processamento de imagens é feito para a criação de miniaturas). O limite de memória está na linha 252, portanto, até onde posso ver, não há como modificá-lo sem matar um gatinho *> :).

Também existem funções GD em load_image_to_edit()(linha 200, wp-admin / includes / image-edit.php). Este é usado pelo editor de imagens (nunca o usei, já que conheço o WordPress, nem sabia que o encontraria :)). Se o seu cliente usá-lo, você também pode definir o limite de memória. Existe o filtro load_image_to_edit_path.

Espero que minha resposta seja útil.

* núcleo de hackers

sorich87
fonte
Sim, eles são codificados em algumas funções do lado do administrador relacionadas às imagens. Existe uma WP_MEMORY_LIMITconstante e até um admin_memory_limitfiltro, mas nenhuma delas é consultada nesses poucos casos.
Annika Backstrom
1

Swill - Eu tive exatamente os mesmos problemas. Maldito wordpress com alguns dos "recursos" Uma abordagem mais sofisticada é alterar todos os @ini_set 's para configurá-lo de WP_MEMORY_LIMIT - problema resolvido

Além disso, alterar os valores php em tempo de execução não é tão inteligente, não sei por que ele é implementado :(

neosk
fonte
0

Pela sua descrição, acho que esse código admin.phpé o problema:

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

Um tanto estranho que ele trata o uso da memória do administrador separadamente, mas pelo menos é filtrável.

Rarst
fonte
Isso não funciona para as operações de imagem no administrador. Eles são reduzidos para 256 MB novamente, independentemente de eu usar esse filtro ou não. : /
hakre 26/10/10
0

Eu só queria dizer obrigado ao bangbambang. Este é o primeiro post que descobri que foi capaz de me dar algumas dicas sobre por que a entrada no wp-config.php define('WP_MEMORY_LIMIT', '512M');não estava realmente sendo usada. Passei horas tentando descobrir isso ...

Minha importação falhou com o problema esgotado de 256M, independentemente de como eu defini o limite de memória.

Aqui estão os lugares onde o limite de memória é codificado para 256M (na versão 3.0.5 de qualquer maneira).

wp-admin/includes/file.php (line 532)

wp-admin/includes/image-edit.php (line 393 & 498)

wp-includes/media.php (line 252)

fonte
O ticket nº 13847 possui um patch anexado que torna esses locais configuráveis ​​com uma constante adicional chamada WP_MAX_MEMORY_LIMIT.
hakre
-4
/* Memory Limit */
define( 'WP_MEMORY_LIMIT', '1G' );
define( 'WP_MAX_MEMORY_LIMIT', '1G');
Anton
fonte