Come utilizzare più di 256MB di memoria nell'area amministrativa?
Sto creando un sito per un fotografo che carica immagini che sono normalmente di grandi dimensioni per le fotocamere digitali di oggi. Le immagini richiedono molta memoria, specialmente le operazioni sulle immagini come la creazione di miniature.
Quindi volevo aumentare il limite di memoria nell'amministrazione oltre i 256MB - come si può fare? Ho consentito a CGI e PHP di utilizzare fino a 1 Gigabyte ma WordPress riduce sempre la memoria a 256MB. Qualche idea su come risolvere questo problema su un sito client che deve essere in grado di auto-aggiornarsi?
AGGIORNAMENTO: A partire da WordPress 3.2 il limite massimo di memoria in WordPress sarà nuovamente configurabile.

Teoricamente, modificando il tuo config.php e aggiungendo questa riga prima dell'inclusione di wp-settings.php.
define('WP_MEMORY_LIMIT', '256M');
dovrebbe aumentare il limite di memoria per WordPress a 256MB o qualsiasi valore tu abbia impostato. E questo funzionerà su tutto il sito. Tuttavia, come ha sottolineato sorich87, ci sono alcune funzioni che modificheranno questa impostazione con un limite hardcoded di 256 MB.
Hackerare o Non Hackerare
Una piccola preoccupazione riguardo a questo, WP_MEMORY_LIMIT
è una delle impostazioni più strane di WP che abbia mai incontrato. Se controlli /wp-includes/default-constants.php
troverai questa impostazione:
// imposta i limiti di memoria
if ( !defined('WP_MEMORY_LIMIT') ) {
if( is_multisite() ) {
define('WP_MEMORY_LIMIT', '64M');
} else {
define('WP_MEMORY_LIMIT', '32M');
}
}
Non mi ero mai reso conto che WP impostasse il suo utilizzo predefinito di memoria così basso, fino a quando non ho trovato questo nel codex di WP:
WordPress controllerà automaticamente se a PHP è stata allocata meno memoria del valore inserito prima di utilizzare questa funzione. Ad esempio, se a PHP sono stati allocati 64MB, non c'è bisogno di impostare questo valore a 64M poiché WordPress utilizzerà automaticamente tutti i 64MB se necessario. (fonte)
Quella spiegazione è stata rassicurante. Tuttavia, l'uso di @ini_set('memory_limit', '256M');
hardcoded ogni volta che WP esegue una funzione che richiede più memoria non è mai menzionato. Infatti, non trovo alcuna spiegazione su questo comportamento vago nel codex di WP. Poiché la maggior parte delle funzioni non legate all'utente non sono documentate o non sono chiaramente spiegate nel codex.
Mentre questa impostazione funziona bene nella maggior parte dei casi, renderà quelle funzioni inutili su server con un'impostazione di memoria massima più bassa o, nel tuo caso, con un utilizzo di memoria più alto.
Fino a quando i ragazzi di WP non risolveranno questo problema, penso che la tua unica soluzione sia modificare il core. Potresti trovare interessante leggere questo post scritto da hakre. Ha anche inviato una raccomandazione di patch in Trac. Il link precedente al file di patch potrebbe aiutarti a trovare la lista delle funzioni che utilizzano questa impostazione.
modifica:
questa è la risposta più stupida che abbia mai dato perché ho dato un link al tuo stesso post (mi sono reso conto solo dopo 2 giorni che il nome dell'OP era hakre) :D
modifica 2:
come menzionato nei commenti, questo è stato risolto con la release 3.2

la tua risposta è tutt'altro che stupida. Ad essere precisi, è stato piuttosto stupido da parte mia postare questa domanda mentre già conoscevo la risposta, e il tuo commento dimostra chiaramente che l'hai notato. Davvero, le mie più sincere scuse, postare il link qui era la cosa giusta per quanto ne sapevo al momento della domanda, quindi cosa dire? Grazie per essere stato così aperto nell'ammetterlo! Mi piace il tuo stile e ho collegato il mio blog alla tua risposta (non solo ho linkato di nuovo al blog).

Nella versione 3.2 questo dovrebbe essere configurabile: Changeset 17749

Swill - Ho avuto esattamente gli stessi problemi. Maledetto Wordpress con alcune delle sue "funzionalità"
Un approccio più sofisticato è cambiare tutte le @ini_set per impostarlo da WP_MEMORY_LIMIT - problema risolto
Inoltre, modificare i valori php a runtime non è così intelligente, non sono sicuro del perché sia implementato :(

Dalla tua descrizione penso che il problema sia questo codice in admin.php
:
if ( current_user_can( 'manage_options' ) )
@ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', '256M' ) );
Abbastanza strano che gestisca separatamente l'utilizzo della memoria per l'amministrazione, ma almeno è filtrabile.

Ci sono @ini_set('memory_limit', '256M');
prima che le immagini vengano caricate in memoria dalle funzioni GD.
imagecreatefromstring()
(riga 253, wp-includes/media.php) è utilizzata da wp_load_image()
che a sua volta è usata da image_resize
(la funzione dove avviene l'elaborazione delle immagini per la creazione delle miniature).
Il limite di memoria è impostato alla riga 252, quindi, per quanto ne so, non c'è modo di modificarlo senza uccidere un gattino* >:).
Ci sono anche funzioni GD in load_image_to_edit()
(riga 200, wp-admin/includes/image-edit.php). Questa viene utilizzata dall'editor delle immagini (non l'ho mai usato, da quando conosco WordPress, non sapevo nemmeno dove trovarlo :)). Se il tuo cliente lo utilizza, potresti voler impostare anche lì il limite di memoria. C'è il filtro load_image_to_edit_path
.
Spero che la mia risposta sia utile.
*modificare il core

Volevo solo ringraziare bangbambang. Questo è il primo post che ho trovato in grado di darmi qualche indicazione sul motivo per cui l'inserimento in wp-config.php di define('WP_MEMORY_LIMIT', '512M');
non veniva effettivamente utilizzato. Ho passato ore a cercare di capirlo...
La mia importazione falliva con il problema dell'esaurimento dei 256M indipendentemente da come impostavo il limite di memoria.
Ecco i punti in cui il limite di memoria è hardcoded a 256M (nella versione 3.0.5 comunque).
wp-admin/includes/file.php (riga 532)
wp-admin/includes/image-edit.php (riga 393 & 498)
wp-includes/media.php (riga 252)

Ticket #13847 ha una patch allegata che rende configurabili quei punti con una costante aggiuntiva chiamata WP_MAX_MEMORY_LIMIT
.
