Jak korzystać z więcej niż 256 MB pamięci w adminie?

10

Buduję witrynę dla fotografa, który przesyła zdjęcia, które zwykle są duże dla dzisiejszych aparatów cyfrowych. Obrazy zajmują dużo pamięci, zwłaszcza operacje na obrazie, takie jak tworzenie miniaturek.

Chciałem więc podnieść limit pamięci u administratora powyżej 256 MB - jak to zrobić? Pozwoliłem CGI i PHP używać do 1 gigabajta, ale wordpress zawsze zmniejsza pamięć do 256 MB. Masz pomysł, jak to naprawić po stronie klienta, który musi mieć możliwość automatycznej aktualizacji?

AKTUALIZACJA: Od trwającego Wordpress 3.2 maksymalny limit pamięci w Wordpress będzie można ponownie skonfigurować .

hakre
źródło
hej, nie widziałem cię od dłuższego czasu. Zgadnij, że byłeś zajęty klientami; dobrze dla ciebie! Czy rozważałeś może odciążenie przetwarzania obrazu, może używając Amazon S3 i EC2? aws.amazon.com/articles/1602 Lub Google App Engine? code.google.com/appengine/docs/python/images/usingimages.html Lub korzystasz z urlimg.com ?
MikeSchinkel
@MikeSchnikel - Hej! Szukam rozwiązania tego za pomocą wordpress. Gdybym musiał skonfigurować serwer miniatur, i tak nie używałbym wordpress. Ale dzięki za linki, przynajmniej bardzo interesujące :).
hakre

Odpowiedzi:

13

Teoretycznie edytuj config.php i dodaj tę linię przed włączeniem wp-settings.php.

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

powinien zwiększyć limit pamięci dla WordPressa do 256 MB lub dowolnej ustawionej wartości. I to będzie działać na całej szerokości. Jednak, jak zauważył sorich87 , istnieje kilka funkcji, które zmienią to ustawienie z zakodowanym na stałe limitem 256 MB.

Hakować czy nie hakować

Trochę obaw o to, WP_MEMORY_LIMITto jedno z najbardziej dziwnych ustawień WP, jakie spotkałem. jeśli zaznaczysz /wp-includes/default-constants.php, znajdziesz to ustawienie:

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

Nigdy nie zdaję sobie sprawy, że WP ustawi tak niskie domyślne użycie pamięci, dopóki nie znajdę tego w kodeksie WP:

WordPress automatycznie sprawdzi, czy PHP ma przydzieloną mniej pamięci niż wprowadzona wartość przed użyciem tej funkcji. Na przykład, jeśli PHP przydzielono 64 MB, nie trzeba ustawiać tej wartości na 64 MB, ponieważ WordPress automatycznie użyje wszystkich 64 MB, jeśli zajdzie taka potrzeba. ( Źródło )

Wyjaśnienie to ulżyło. Jednak użycie zakodowanego na @ini_set('memory_limit', '256M');stałe funkcji wykonywania WP, która wymaga więcej pamięci, nigdy nie jest wspomniane . W rzeczywistości nie znajduję wyjaśnienia na temat tego niejasnego zachowania z kodeksu WP. Ponieważ większość funkcji niezwiązanych z użytkownikiem nie jest ani udokumentowana, ani nie jest jasno wyjaśniona w kodzie.

Chociaż to ustawienie działa dobrze w większości przypadków, sprawi, że te funkcje będą bezużyteczne na serwerze z niższym ustawieniem maksymalnej pamięci lub w twoim przypadku, większym wykorzystaniem pamięci.

Dopóki faceci WP nie naprawią tego, myślę, że jedynym rozwiązaniem jest modyfikacja rdzenia. Można znaleźć ten artykuł napisany przez hakre ciekawego do czytania. Przedstawił również zalecenie dotyczące łaty w Trac. Poprzedni link do pliku łatki może pomóc ci znaleźć listę funkcji korzystających z tego ustawienia.

edytować:

to jest najgłupsza odpowiedź, jaką kiedykolwiek dałem, ponieważ podam link do twojego postu (po prostu uświadom sobie, że nazwa OP była hakre po 2 dniach): D

edycja 2:

jak wspomniano w komentarzu, zostało to naprawione przez wydanie 3.2

bangbambang
źródło
twoja odpowiedź jest daleka od bycia głupią. Mówiąc ściślej, to było trochę głupie, że opublikowałem to pytanie, kiedy już znałem odpowiedź, a twój komentarz całkowicie pokazuje, że faktycznie to przeoczyłeś. Naprawdę, moje największe przeprosiny, opublikowanie linku tutaj było tak słuszne, o ile znałem siebie podczas publikowania pytania, więc co powiedzieć? Dzięki, że jesteś tak otwarty, żeby to przyznać! Podoba mi się twój styl i powiązałem mojego bloga z Twoją odpowiedzią (nie tylko link z powrotem do bloga).
hakre
W 3.2 powinno to być konfigurowalne: Changeset 17749
hakre
1

Są jeszcze @ini_set('memory_limit', '256M');zanim obrazy zostaną załadowane do pamięci przez funkcje GD.

imagecreatefromstring()(wiersz 253, wp-obejmuje / media.php) jest używany wp_load_image()przez image_resize(funkcja, w której przetwarzanie obrazów odbywa się w celu utworzenia miniatur). Limit pamięci znajduje się w linii 252, więc, o ile widzę, nie ma sposobu, aby go zmodyfikować bez zabicia kotka *> :).

Istnieją również funkcje GD w load_image_to_edit()(wiersz 200, wp-admin / obejmuje / image-edit.php). Ten jest używany przez edytor zdjęć (nigdy go nie użyłem, ponieważ znam WordPressa, nawet nie wiedziałem, że go znajdę :)). Jeśli używa go Twój klient, możesz również ustawić limit pamięci. Jest filtr load_image_to_edit_path.

Mam nadzieję, że moja odpowiedź jest pomocna.

* rdzeń hakerski

sorich87
źródło
Tak, są one zakodowane w kilku funkcjach po stronie administratora związanych z obrazami. Istnieje WP_MEMORY_LIMITstały, a nawet admin_memory_limitfiltr, ale w tych garstce przypadków nie ma potrzeby ich sprawdzania.
Annika Backstrom
1

Swill - miałem te same problemy. Cholerne wordpress z niektórymi „funkcjami”. Bardziej wyrafinowanym podejściem jest zmiana wszystkich @ini_set, aby ustawić je z WP_MEMORY_LIMIT - problem rozwiązany

Również zmiana wartości php w czasie wykonywania nie jest zbyt mądra, nie jestem pewien, dlaczego została zaimplementowana :(

neosk
źródło
0

Według twojego opisu myślę, że ten kod admin.phpjest problemem:

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

Nieco dziwne, że traktuje oddzielnie użycie pamięci administracyjnej, ale przynajmniej można je filtrować.

Rarst
źródło
To nie działa dla operacji na obrazie w adminie. Są ponownie zmniejszane do 256 MB, niezależnie od tego, czy użyję tego filtra, czy nie. : /
hakre
0

Chciałem tylko podziękować Bangbambang. To jest pierwszy post, który znalazłem, który był w stanie dać mi wgląd w to, dlaczego wpis do wp-config.php define('WP_MEMORY_LIMIT', '512M');nie był faktycznie używany. Spędziłem godziny próbując to rozgryźć ...

Mój import nie powiódł się, ponieważ problem z wyczerpaniem 256 MB został wyczerpany niezależnie od tego, jak ustawiłem limit pamięci.

Oto miejsca, w których limit pamięci jest zakodowany na stałe do 256 MB (w każdym razie w wersji 3.0.5).

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

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

wp-includes/media.php (line 252)

źródło
Ticket # 13847 ma łatkę dołączony sprawia, że miejsca te configure-stanie z dodatkowym stałej nazwie WP_MAX_MEMORY_LIMIT.
hakre
-4
/* Memory Limit */
define( 'WP_MEMORY_LIMIT', '1G' );
define( 'WP_MAX_MEMORY_LIMIT', '1G');
Anton
źródło