Comment utiliser plus de 256 Mo de mémoire dans l'administrateur?

10

Je construis un site pour un photographe qui télécharge des images qui sont normalement grandes pour les appareils photo numériques d'aujourd'hui. Les images sont assez gourmandes en mémoire, en particulier les opérations d'image comme la création de miniatures.

Je voulais donc augmenter la limite de mémoire dans l'administrateur au-dessus de 256 Mo - comment cela peut-il être fait? J'ai autorisé CGI et PHP à utiliser jusqu'à 1 gigaoctet, mais wordpress réduit toujours la mémoire à 256 Mo. Une idée de comment résoudre ce problème côté client qui doit pouvoir se mettre à jour automatiquement?

MISE À JOUR: À partir de Wordpress 3.2 en cours, la limite de mémoire maximale dans Wordpress sera à nouveau configurable .

hakre
la source
hé, je ne vous ai pas vu depuis un moment. Je suppose que vous avez été occupé avec des clients; Bien pour vous! Avez-vous envisagé de décharger le traitement d'image, peut-être d'utiliser Amazon S3 et EC2? aws.amazon.com/articles/1602 Ou Google App Engine? code.google.com/appengine/docs/python/images/usingimages.html Ou utiliser urlimg.com ?
MikeSchinkel du
@MikeSchnikel - Hej! Je cherche à résoudre ce problème avec wordpress. Si j'ai besoin de configurer un serveur de miniatures, je n'utiliserais pas WordPress de toute façon. Mais merci pour les liens, très intéressants au moins :).
hakre

Réponses:

13

Théoriquement, éditez votre config.php et ajoutez cette ligne avant l' inclusion de wp-settings.php.

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

devrait augmenter votre limite de mémoire pour WordPress à 256 Mo ou quelle que soit la valeur que vous définissez. Et cela fonctionnera sur tout le site. Cependant, comme l' a souligné sorich87 , peu de fonctions modifieront ce paramètre avec une limite de 256 Mo codée en dur.

Pirater ou ne pas pirater

Une petite inquiétude à ce sujet WP_MEMORY_LIMITest l'un des paramètres WP les plus étranges que j'ai rencontrés. si vous cochez, /wp-includes/default-constants.phpvous trouverez ce paramètre:

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

Je ne me rends jamais compte que WP définira son utilisation de la mémoire par défaut si bas, jusqu'à ce que je trouve cela dans le codex WP:

WordPress vérifiera automatiquement si PHP a reçu moins de mémoire que la valeur entrée avant d'utiliser cette fonction. Par exemple, si PHP a reçu 64 Mo, il n'est pas nécessaire de définir cette valeur sur 64 Mo car WordPress utilisera automatiquement tous les 64 Mo si nécessaire. ( Source )

Cette explication était soulageante. Cependant, l'utilisation de la @ini_set('memory_limit', '256M');fonction d'exécution à chaque fois codée en dur qui nécessite plus de mémoire n'est jamais mentionnée . En fait, je ne trouve aucune explication sur ce comportement vague du codex WP. Étant donné que la plupart des fonctions non liées à l'utilisateur ne sont pas documentées ou ne sont pas clairement expliquées dans le codex.

Bien que ce paramètre fonctionne bien dans la plupart des cas, il rendra ces fonctions inutiles sur le serveur avec un paramètre de mémoire maximale inférieur ou sur votre cas, une utilisation de la mémoire plus élevée.

Jusqu'à ce que les gars WP corrigent cela, je pense que votre seule solution est de modifier le noyau. Vous pouvez trouver cet article écrit par hakre intéressant à lire. Il a également soumis une recommandation de patch dans Trac. Le lien précédent vers le fichier de correctif peut vous aider à trouver la liste des fonctions qui utilisent ce paramètre.

Éditer:

c'est la réponse la plus stupide que j'ai jamais donnée parce que je donne un lien vers votre propre message (réalisez juste que le nom de l'OP était hakre après 2 jours): D

modifier 2:

comme mentionné dans le commentaire, cela a été corrigé par la version 3.2

Bangbambang
la source
votre réponse est loin d'être stupide. Pour être précis, c'était un peu stupide de ma part de poser cette question alors que je connaissais déjà la réponse, et votre commentaire montre totalement que vous l'avez effectivement dépassé. Vraiment, mes plus grandes excuses, la publication du lien ici était si juste pour autant que je me connaissais lors de la publication de la question, alors que dire? Merci d'être ouvert à l'admettre! J'aime votre style et j'ai lié mon blog à votre réponse (non seulement lié au blog).
hakre
En 3.2 cela devrait être configurable: Changeset 17749
hakre
1

Il y a @ini_set('memory_limit', '256M');avant que les images ne soient chargées en mémoire par les fonctions GD.

imagecreatefromstring()(ligne 253, wp-includes / media.php) est utilisé par wp_load_image()qui est utilisé par image_resize(la fonction où le traitement des images est effectué pour la création des miniatures). La limite de mémoire est à la ligne 252, donc, pour autant que je puisse voir, il n'y a aucun moyen de la modifier sans tuer un chaton *> :).

Il existe également des fonctions GD dans load_image_to_edit()(ligne 200, wp-admin / includes / image-edit.php). Celui-ci est utilisé par l'éditeur d'image (je ne l'ai jamais utilisé, car je connais WordPress, je ne savais même pas où le trouver :)). Si votre client l'utilise, vous pouvez également y définir la limite de mémoire. Il y a le filtre load_image_to_edit_path.

J'espère que ma réponse sera utile.

* noyau de piratage

sorich87
la source
Oui, ceux-ci sont codés en dur dans quelques fonctions côté administrateur relatives aux images. Il existe une WP_MEMORY_LIMITconstante et même un admin_memory_limitfiltre, mais aucun n'est consulté dans ces quelques cas.
Annika Backstrom
1

Swill - J'ai eu les mêmes problèmes. Merde wordpress avec certaines des "fonctionnalités" Une approche plutôt plus sophistiquée consiste à changer tous les @ini_set pour le régler à partir de WP_MEMORY_LIMIT - problème résolu

De plus, changer les valeurs php au moment de l'exécution n'est pas si intelligent, je ne sais pas pourquoi il est implémenté :(

neosk
la source
0

D'après votre description, je pense que ce code admin.phpest le problème:

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

Un peu étrange qu'il traite séparément l'utilisation de la mémoire d'administration, mais au moins il est filtrable.

Rarst
la source
Cela ne fonctionne pas pour les opérations d'image dans l'administrateur. Ils sont à nouveau réduits à 256 Mo, que j'utilise ou non ce filtre. : /
hakre
0

Je voulais juste dire merci à Bangbambang. C'est le premier message que j'ai trouvé qui m'a permis de comprendre pourquoi l'entrée dans wp-config.php define('WP_MEMORY_LIMIT', '512M');n'était pas réellement utilisée. J'ai passé des heures à essayer de comprendre cela ...

Mon importation a échoué avec le problème épuisé de 256 Mo, quelle que soit la façon dont j'ai défini la limite de mémoire.

Voici les endroits où la limite de mémoire est codée en dur à 256M (dans la version 3.0.5 de toute façon).

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

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

wp-includes/media.php (line 252)

la source
Le ticket # 13847 a un patch attaché qui rend ces endroits configurables avec une constante supplémentaire appelée WP_MAX_MEMORY_LIMIT.
hakre
-4
/* Memory Limit */
define( 'WP_MEMORY_LIMIT', '1G' );
define( 'WP_MAX_MEMORY_LIMIT', '1G');
Anton
la source