Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Allowed memory size of 8388608 bytes exhausted
Forum PHP.pl > Forum > PHP
KCG
Przy dodawaniu zdjęcia mam taki błąd:
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 5200 bytes) in D:\users\trudny\motocykl\o_czesci.php on line 136
Zwiększyłem ini_set() limit pamięci na około 50MB. Na lokalnym tego nie mam.
Kod:
  1. <?php
  2. $image_name = imagecreatefromjpeg($img);
  3. $getimg = getimagesize($img);
  4. list($width,$height) = $getimg;
  5. $image = imagecreatetruecolor($width,$height);
  6. imagecopyresampled($image,$image_name,0,0,0,0,$width,$height,$width,$height);
  7. imagejpeg($image,$img);
  8. imagedestroy($image);
  9.  
  10. //watermark
  11. $getimg = getimagesize($img);
  12. list($width,$height) = $getimg;
  13. $water_src = 'images/znak_wodny.png';
  14. $watermark = imagecreatefrompng($water_src);
  15. list($wwidth,$wheight) = getimagesize($water_src);
  16. $image = imagecreatetruecolor($width,$height);
  17. imagecopyresampled($image,$image_name,0,0,0,0,$width,$height,$width,$height);
  18. imagecopy($image,$watermark,10,10,0,0,$wwidth,$wheight);
  19. imagejpeg($image,$img);
  20. imagedestroy($image);
  21.  
  22. //thumb
  23. $imageThumbName = $imgName.'t.jpg';
  24. $widthT = 100;
  25. $heightT = $widthT/$width*$height;
  26. $imageThumb = imagecreatetruecolor($widthT,$heightT);
  27. $image_name = imagecreatefromjpeg($img);
  28. imagecopyresampled($imageThumb,$image_name,0,0,0,0,$widthT,$heightT,$width,$height);
  29. imagejpeg($imageThumb,'images/gielda/moto/'.$imageThumbName);
  30. //new thumb
  31. imagedestroy($imageThumb);
  32. imagedestroy($image_name);
  33. $imgThumbName = $imgName.'tt.jpg';
  34. $imgt = imagecreatefromjpeg($img);
  35. $imgTH = 140;
  36. $imgTW = $imgTH/$height*$width;
  37. $srcX = ($imgTW-100)/2;
  38. $imgT = imagecreatetruecolor($imgTW,$imgTH);
  39. imagecopyresampled($imgT,$imgt,0,0,0,0,$imgTW,$imgTH,$width,$height);
  40. imagedestroy($imgt);
  41. $imgT2 = imagecreatetruecolor(100,140);
  42. imagecopymerge($imgT2,$imgT,0,0,$srcX,0,$imgTW,$imgTH,100);
  43.  imagejpeg($imgT2,'images/gielda/moto/'.$imgThumbName);
  44.  imagedestroy($imgT2);
  45. imagedestroy($imgT);
  46. ?>
Kowalikus
Spróbuj pobrać czy ini_set(); zadziałał poprzez ini_get('memory_limit'); Jeśli nie działa spróbuj w htaccess dodać php_value memory_limit 32M
vtuner
Może lepiej popracować nad optymalizacją skryptu.
KCG
No tak też myślałem, bo raz działa, raz nie.
vtuner masz coś konkretnego na myśli?
.radex
to
vtuner
Najpierw musiałbym znać przeznaczenie tego skryptu, żeby wiedzieć co jak pozmieniać.
KCG
radex_p nie pytam, co to, tylko jak :]
Skrypt dodaje zdjęcie do ogłoszenia. Jest ograniczenie do 500kB. Zapisuje je, następnie tworzy 2 miniaturki, no i to tyle.
Jak widać po move_uploaded_file() wczytuje zdjęcie i zapisuje jeszcze raz przez imagecopyresampled, bo zauważyłem, że przez to zdjęcie ma mniejszą objętość.
vtuner
Wiadomo, że skrypt nie wyrabia się, bo za dużo jest tych funkcji tworzących i modyfikujących zdjęcia.

Ja bym zrobił tak:
- wgrywam oryginalne zdjęcie
- przy wyświetlaniu za pomocą odpowiedniej klasy tworzę na podstawie dostarczonego linku do zdjęcia miniaturkę (o szerokości lub wysokości podanej jako następny parametr, w zależności jak sobie zrobisz klasę. Trzeba pamiętać, że klasa powinna tworzyć proporcjonalne rozmiary miniaturki). Co prawda jest utrata na jakości zdjęcia (niewielka), ale nie jest ona tak zła jak problem z pojemnością pamięci.

Myślę, że od tej strony powinieneś podejść do tego.
LonelyKnight
Cytat(vtuner @ 28.02.2008, 20:40:55 ) *
- przy wyświetlaniu za pomocą odpowiedniej klasy tworzę na podstawie dostarczonego linku do zdjęcia miniaturkę (o szerokości lub wysokości podanej jako następny parametr, w zależności jak sobie zrobisz klasę. Trzeba pamiętać, że klasa powinna tworzyć proporcjonalne rozmiary miniaturki). Co prawda jest utrata na jakości zdjęcia (niewielka), ale nie jest ona tak zła jak problem z pojemnością pamięci.


Nie jestem pewien czy dobrze Ciebie zrozumiałem - proponujesz autorowi aby nie tworzył miniaturki przy uploadzie tylko przy każdym wywołaniu zdjęcia? W każdej chwili kiedy miniaturka będzie potrzebna ma ją wtedy tworzyć? Jeśli tak to pomysł jest.... brrr... niedobry smile.gif Metoda na zabicie serwera smile.gif

Co do problemu to na forum przewijał się x razy.

Poza tym http://www.google.pl/search?q=+Allowed+memory+size+of
KCG
No co do tego tworzenia przy wyświetlaniu też nie jestem pewien, a w skrypcie raczej tylko jest to, co potrzebne... No chyba, że jakoś łatwiej można to zrobić.
LonelyKnight, jak szukałem to głównie piszą, żeby zwiększyć memory_limit, który już zwiększyłem. Na serwerze na którym jest błąd mam chyba 8 czy 16 MB ramu. Jest darmowy, docelowo będzie na płatnym, np. home.pl daje max 80MB, z tego, co piszą. Może wtedy problemu nie będzie?
LonelyKnight
Nie powinno być. Operacje na obrazkach zabierają dużo pamięci a jeśli nie możesz zwiększyć dostępnej pamięci to zrobisz niewiele. Proponuję Ci poczekać do momentu aż przeniesiesz sie na nowy serwer. Jeśli problem będzie dalej istniał, chociaż w to wątpię, to będziesz mógł zacząć kombinować, teraz chyba nie ma sensu.
KCG
W takim razie dzięki winksmiley.jpg Chciałem się upewnić po prostu. Jak coś, to napiszę. smile.gif
Kocurro
Jak już kolega wspomniał ale niedopowiedział:

1) Wgrywasz plik do odpowiedniego katalogu, obcinając go jak należy i rekompresując
2) Na wyświetlanie miniaturek tworzysz wrappera
3) Gdy wrapper otrzyma zapytanie o miniaturke sprawdza w cache'u czy ją ma
4) Jeśli ją ma to wysyła
5) Jeśli nie ma to tworzy i zapisuje w cache'u a następnie wysyła do klienta

Do tego daj ograniczenie by nikt nie mógł Ci wgrać zdjęcia o większym rozmiarze pliku niż jakiś ludzki rozmiar oraz od razu przed robieniem operacji sprawdzaj czy wymiary x, y są zgodne z jakimiś założeniami np. nie więcej niż v, w.

I jakby to powiedział mój ulubiony aktor w ulubionym filmie: nie ma ch*** fujarki winksmiley.jpg we wsi smile.gif

pozdr.

ps: jeśli i to nie poskutkuje to zmień serwer bo ten Cię oszukuje winksmiley.jpg

ps2: a po ki diabeł robisz to:

  1. <?php
  2.  
  3. $image_name = imagecreatefromjpeg($img);
  4. $getimg = getimagesize($img);
  5. list($width,$height) = $getimg;
  6. $image = imagecreatetruecolor($width,$height);
  7. imagecopyresampled($image,$image_name,0,0,0,0,$width,$height,$width,$height);
  8. imagejpeg($image,$img);
  9. imagedestroy($image);
  10. ?>


Przecież to nic nie robi - w teorii zrobi rekompresje ale ... nie zwalniasz zasobu $image_name chociażby ...

Dalej znowu tworzysz zasoby i ich nie zwalniasz ...

Przepisz to od nowa i wrzuć tutaj a powiem Ci czy dobrze robisz czy nie - wybacz, że samemu nie przepiszę Ci teraz ale siedzę w pracy.

pozdr.
KCG
8,20,31,32,40,44,45 linie w których są usuwane zasoby, bo jeśli dobrze rozumiem chodzi o image_destroy()?
Co do ps2 to zdjęcie ma mniejszy rozmiar niż jak się tylko zapisze. (przynajmniej tak mi wychodziło)
Mógłbyś mi przybliżyć wrapper i cache?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.