Jump to content
  • 0

Błąd podczas dodawania zdjęć produktów Allowed memory size of 134217728...


addd

Question

PHP wywala mi następujący błąd: 

 

 

Allowed memory size of 134217728 bytes exhausted (tried to allocate 17152 bytes) in C:\wamp64\www\prestashop\prestashop\classes\ImageManager.php on line 485

 

 

Wiem co ten błąd oznacza. Problem jest taki, że presta ma mechanizm sprawdzania czy zdjęcie o danej rozdzielczości może zostać przetworzone na serwerze o danym limicie pamięci. Dokładnie funkcja "checkImageMemoryLimit" w klasie ImageManager.php linia około 99. Mimo to zamiast wyrzucać komunikat "Sprawdź limit pamięci" to przy zdjęciach z przedziału 12 - 21 mln pikseli (dla serwera o limicie pamięci 128MB) wywala się, natomiast powyżej 21 mln pikseli zwraca komunikat "sprawdź limit pamięci". 

 

Na innym forum jedna osoba napisała, że taki problem nie występuje na serwerze o takim limicie pamięci ponieważ ładują zdjęcia większe i jest ok, a jak zdejmą sprawdzanie to nawet i 25 mln pikseli serwer da radę.

 

Ja próbowałam na:

  1. serwerze netart (limit pamięci 128MB) presta 1.6.1.3
  2. Na serwerze lokalnym (WAMP) ustawiłam limit pamięci 128MB presta 1.6.1.5
  3. Na innym serwerze (nie wiem co to za serwer) ale jest uruchomione demo na którym da się załadować zdjęcia: http://waluty.x13demo.pl/admin_sklep/ presta 1.6.1.4

 

We wszystkich tych trzech przypadkach presta wywala się dokładnie w tym samym punkcie przy zdjęciach o takich samych rozmiarach (chodzi o rozdzielczość nie wagę zdjęcia).

 

Próbowałam różnych wersji PHP - ta sama sytuacja.

 

Moje pytanie jest takie czy tylko mi się tak dzieje? Czy jednak coś jest nie tak z funkcją checkImageMemoryLimit i przepuszcza zdjęcia, których serwer nie jest  wstanie załadować?

 

W załączniku jest przykładowe zdjęcie przy którym presta się sypie w trzech wymienionych wyżej przypadkach. Można spróbować np. na tym demie.

 

Z doświadczenia  z innych forum chciałam wszystkich poinformować, że wiem jakie zdjęcia się potrzebne do sieci i, że zdjęcia o rozdzielczości 4000 x 2000 pikseli to zdecydowanie za dużo do sieci i presta i tak to musi zmniejszać więc nie ma sensu ładować tak dużych zdjęć. O tym wszystkim wiem, ale jeżeli ktoś przypadkiem załaduje takie zdjęcie bo np. waży ono tylko 800 KB, to nie powinna się sypnąć tylko zwrócić odpowiedni komunikat.

 

Kolejna sprawa jest taka, że w Panelu administracyjnym jest opcja Ograniczenia rozdzielczości zdjęcia w pikselach, ustawiam ograniczenie, ale ono nie działa i tak pozwala ładować większe zdjęcie, a potem albo się sypie, albo przy bardzo dużych zwraca komunikat o limicie pamięci.

 

z góry dziękuje wszystkim za pomoc

post-1128078-0-69656100-1466143517_thumb.jpg

Edited by addd (see edit history)
Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

W klasie ImageManager zmień funkcję checkImageMemoryLimit na:

    public static function checkImageMemoryLimit($image)
    {
        $infos = @getimagesize($image);

        if (!is_array($infos) || !isset($infos['bits'])) {
            return true;
        }

        $memory_limit = Tools::getMemoryLimit();
        $memory_limit == -1;
        if (function_exists('memory_get_usage') && (int)$memory_limit != -1) {
            $current_memory = memory_get_usage();
            $channel = isset($infos['channels']) ? ($infos['channels'] / 8) : 1;

            // Evaluate the memory required to resize the image: if it's too much, you can't resize it.
            // For perfs, avoid computing static maths formulas in the code. pow(2, 16) = 65536 ; 1024 * 1024 = 1048576
            if (($infos[0] * $infos[1] * $infos['bits'] * $channel + 65536) * 1.8 + $current_memory > $memory_limit - 1048576) {
                return false;
            }
        }
        return true;
    }

Grafika 4000x2000 da się wgrać przy 128M limitu pamięci. 4000x4000 już jest za duża.

Testowałem na hostingu linuxpl.

Link to comment
Share on other sites

  • 0

Moje pytanie jest takie czy tylko mi się tak dzieje? Czy jednak coś jest nie tak z funkcją checkImageMemoryLimit i przepuszcza zdjęcia, których serwer nie jest  wstanie załadować?

 

Funkcja jest zbyt optymistyczna na shared hostingi :)

Na shared hosting z apache2 + php5.6 limit pamięci 128M foto o rozdzielczości 4000x4000px nie przechodzi.

To samo foto na VPS z nginx + php7 limit pamięci 128M ładuje się bez problemu.

 

A ograniczenie rozdzielczości w konfiguracji fotek dotyczy zdjęć dodawanych przez klientów w custom fields w produkcie, a nie zdjęć dodawanych przez admina.

  • Like 1
Link to comment
Share on other sites

  • 0

Ustawiłem konfigurację localhost na apache2 + php5.6 + opcache, limit pamięci 128M i foto 4000x4000px wgrało się.

 

To dane z debug profilera:

h_1466417791_7117653_24add9df10.png

 

Trudno stwierdzić jaką masz konfigurację tego wampa.

 

W defines.inc.php włącz define('_PS_DEBUG_PROFILING_', true); może dostaniesz info na którym procesie się wywala.

Link to comment
Share on other sites

  • 0

Wiem w którym miejscu się wywala:
 

 

Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 4288 bytes) in C:\wamp64\www\prestashop\prestashop\classes\ImageManager.php on line 485

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...