Come utilizzare più di 256MB di memoria nell'area amministrativa?

26 ott 2010, 12:21:17
Visualizzazioni: 23.2K
Voti: 11

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.

2
Commenti

ehi, non ci vediamo da un po'. Immagino tu sia stato impegnato con i clienti; buon per te! Hai pensato di delegare l'elaborazione delle immagini, magari usando Amazon S3 e EC2? http://aws.amazon.com/articles/1602 O Google App Engine? https://code.google.com/appengine/docs/python/images/usingimages.html Oppure usando http://urlimg.com/?

MikeSchinkel MikeSchinkel
26 ott 2010 13:02:34

@MikeSchnikel - Ciao! Sto cercando di risolvere questo con WordPress. Se dovessi configurare un server per le miniature non userei comunque WordPress. Ma grazie per i link, comunque molto interessanti :).

hakre hakre
26 ott 2010 13:20:56
Tutte le risposte alla domanda 6
2
13

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

26 ott 2010 18:27:00
Commenti

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).

hakre hakre
13 feb 2011 03:32:49

Nella versione 3.2 questo dovrebbe essere configurabile: Changeset 17749

hakre hakre
5 mag 2011 02:29:28
0

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 :(

10 mag 2011 02:30:33
1

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.

26 ott 2010 12:41:15
Commenti

Questo non funziona per le operazioni sulle immagini nell'admin. Vengono ridotte nuovamente a 256MB indipendentemente dal fatto che io usi o meno quel filtro. :/

hakre hakre
26 ott 2010 13:17:46
1

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

26 ott 2010 15:41:40
Commenti

Sì, queste sono hardcoded in alcune funzioni lato admin relative alle immagini. Esiste una costante WP_MEMORY_LIMIT e persino un filtro admin_memory_limit, ma nessuno dei due viene consultato in queste poche situazioni.

User User
26 ott 2010 15:56:01
1

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)
10 feb 2011 00:18:04
Commenti

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

hakre hakre
10 feb 2011 00:29:29
0
-4
/* Limite di Memoria */
define( 'WP_MEMORY_LIMIT', '1G' );
define( 'WP_MAX_MEMORY_LIMIT', '1G');
22 mar 2016 08:48:44