Cum să folosești mai mult de 256MB de memorie în admin?
Construiesc un site pentru un fotograf care încarcă poze care sunt în mod normal mari pentru camerele digitale din ziua de azi. Imaginile consumă multă memorie, în special operațiunile cu imagini precum crearea miniaturilor.
Așa că am vrut să cresc limita de memorie în admin peste 256MB - cum poate fi făcut acest lucru? Am permis CGI și PHP să folosească până la 1 Gigabyte dar WordPress întotdeauna reduce memoria la 256MB. Aveți vreo idee cum să rezolv asta pe partea clientului care trebuie să poată face actualizări automate?
ACTUALIZARE: Începând cu WordPress 3.2, limita maximă de memorie în WordPress va fi din nou configurabilă.

Teoretic, editând fișierul tău config.php și adăugând această linie înainte de includerea wp-settings.php.
define('WP_MEMORY_LIMIT', '256M');
ar trebui să crească limita de memorie pentru WordPress la 256MB sau orice altă valoare ai seta. Și această setare va funcționa pe întregul site. Totuși, după cum a menționat sorich87, există câteva funcții care vor modifica această setare cu o limită fixă de 256 MB.
A Hacking or Not To Hack
O mică preocupare legată de acest lucru, WP_MEMORY_LIMIT
este una dintre cele mai ciudate setări din WP pe care le-am întâlnit. Dacă verifici /wp-includes/default-constants.php
vei găsi această setare:
// set memory limits
if ( !defined('WP_MEMORY_LIMIT') ) {
if( is_multisite() ) {
define('WP_MEMORY_LIMIT', '64M');
} else {
define('WP_MEMORY_LIMIT', '32M');
}
}
Nu am realizat niciodată că WP va seta utilizarea implicită a memoriei atât de mică, până când am găsit asta în WP codex:
WordPress va verifica automat dacă PHP a alocat mai puțină memorie decât valoarea introdusă înainte de a utiliza această funcție. De exemplu, dacă PHP a alocat 64MB, nu este nevoie să setezi această valoare la 64M, deoarece WordPress va utiliza automat toți cei 64MB dacă este necesar. (sursă)
Această explicație a fost liniștitoare. Totuși, utilizarea codului fix @ini_set('memory_limit', '256M');
de fiecare dată când WP execută o funcție care are nevoie de mai multă memorie nu este nicăieri menționată. De fapt, nu găsesc nicio explicație despre acest comportament vag în codex-ul WP. Deoarece majoritatea funcțiilor care nu sunt legate de utilizator fie nu sunt documentate, fie nu sunt explicate clar în codex.
Deși această setare funcționează frumos în majoritatea cazurilor, va face acele funcții inutile pe servere cu setări maxime de memorie mai mici sau, în cazul tău, cu utilizare mai mare a memoriei.
Până când cei de la WP rezolvă acest lucru, cred că singura ta soluție este să modifici nucleul. Poți găsi acest articol scris de hakre interesant de citit. El a trimis și o recomandare de patch în Trac. Link-ul anterior către fișierul patch te poate ajuta să găsești lista de funcții care utilizează această setare.
edit:
acesta este cel mai stupid răspuns pe care l-am dat vreodată pentru că am dat un link către propriul tău post (am realizat abia după 2 zile că numele OP era hakre) :D
edit 2:
după cum s-a menționat în comentarii, această problemă a fost rezolvată în versiunea 3.2

răspunsul tău este departe de a fi prost. Pentru a fi precis, a fost oarecum prostesc din partea mea să postez această întrebare în timp ce știam deja răspunsul, iar comentariul tău arată clar că ai observat acest lucru. Serios, cele mai mari scuze, postarea link-ului aici a fost corectă din câte știam eu în momentul în care am postat întrebarea, așa că ce să mai spun? Mulțumesc că ai fost atât de deschis să recunoști asta! Îmi place stilul tău și am legat blogul meu de răspunsul tău (nu doar am dat link înapoi către blog).

În versiunea 3.2 acest lucru ar trebui să fie configurabil: Changeset 17749

Swill - Am avut exact aceleași probleme. La naiba cu WordPress și unele dintre "feature-urile" sale.
O abordare mai sofisticată ar fi să modifici toate directivele @ini_set pentru a seta limita din WP_MEMORY_LIMIT - problemă rezolvată.
De asemenea, modificarea valorilor PHP la runtime nu este cea mai inteligentă soluție, nu sunt sigur de ce este implementată astfel :(

După descrierea ta, cred că acest cod din admin.php
este problema:
if ( current_user_can( 'manage_options' ) )
@ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', '256M' ) );
Oarecum ciudat că tratează utilizarea memoriei pentru admin separat, dar măcar este filtrabil.

Există @ini_set('memory_limit', '256M');
înainte ca imaginile să fie încărcate în memorie de funcțiile GD.
imagecreatefromstring()
(linia 253, wp-includes/media.php) este utilizată de wp_load_image()
, care la rândul său este folosită de image_resize
(funcția în care se face procesarea imaginilor pentru crearea thumbnail-urilor).
Limita de memorie este setată la linia 252, așa că, din câte văd eu, nu există nicio modalitate de a o modifica fără a ucide un pisoi* >:).
Există și funcții GD în load_image_to_edit()
(linia 200, wp-admin/includes/image-edit.php). Aceasta este folosită de editorul de imagini (nu am folosit-o niciodată, de când folosesc WordPress, nici măcar nu știam unde să o găsesc :)). Dacă clientul dumneavoastră o folosește, poate doriți să setați limita de memorie și acolo. Există filtrul load_image_to_edit_path
.
Sper că răspunsul meu este util.
*hacking core

Vreau să îi mulțumesc lui bangbambang. Acesta este primul articol pe care l-am găsit și care mi-a oferit informații despre motivul pentru care adăugarea în wp-config.php a liniei define('WP_MEMORY_LIMIT', '512M');
nu era de fapt utilizată. Am petrecut ore întregi încercând să înțeleg problema...
Importul meu eșua din cauza depășirii limitei de 256M, indiferent cum setam limita de memorie.
Iată locurile în care limita de memorie este hardcodată la 256M (cel puțin în versiunea 3.0.5).
wp-admin/includes/file.php (linia 532)
wp-admin/includes/image-edit.php (linia 393 & 498)
wp-includes/media.php (linia 252)

Tichetul #13847 are un patch atașat care face aceste locații configurabile cu o constantă suplimentară numită WP_MAX_MEMORY_LIMIT
.
