Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Allowed memory size of 8388608 bytes exhausted
KCG
post
Post #1





Grupa: Zarejestrowani
Postów: 449
Pomógł: 4
Dołączył: 1.12.2006

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
Kowalikus
post
Post #2





Grupa: Zarejestrowani
Postów: 111
Pomógł: 25
Dołączył: 23.07.2004

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
vtuner
post
Post #3





Grupa: Zarejestrowani
Postów: 220
Pomógł: 10
Dołączył: 23.08.2005
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Może lepiej popracować nad optymalizacją skryptu.
Go to the top of the page
+Quote Post
KCG
post
Post #4





Grupa: Zarejestrowani
Postów: 449
Pomógł: 4
Dołączył: 1.12.2006

Ostrzeżenie: (0%)
-----


No tak też myślałem, bo raz działa, raz nie.
vtuner masz coś konkretnego na myśli?
Go to the top of the page
+Quote Post
.radex
post
Post #5





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

Ostrzeżenie: (0%)
-----


to
Go to the top of the page
+Quote Post
vtuner
post
Post #6





Grupa: Zarejestrowani
Postów: 220
Pomógł: 10
Dołączył: 23.08.2005
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Najpierw musiałbym znać przeznaczenie tego skryptu, żeby wiedzieć co jak pozmieniać.
Go to the top of the page
+Quote Post
KCG
post
Post #7





Grupa: Zarejestrowani
Postów: 449
Pomógł: 4
Dołączył: 1.12.2006

Ostrzeżenie: (0%)
-----


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ść.
Go to the top of the page
+Quote Post
vtuner
post
Post #8





Grupa: Zarejestrowani
Postów: 220
Pomógł: 10
Dołączył: 23.08.2005
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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.

Ten post edytował vtuner 28.02.2008, 20:42:49
Go to the top of the page
+Quote Post
LonelyKnight
post
Post #9





Grupa: Zarejestrowani
Postów: 240
Pomógł: 13
Dołączył: 1.06.2007
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Metoda na zabicie serwera (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

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

Poza tym http://www.google.pl/search?q=+Allowed+memory+size+of

Ten post edytował LonelyKnight 28.02.2008, 21:34:20
Go to the top of the page
+Quote Post
KCG
post
Post #10





Grupa: Zarejestrowani
Postów: 449
Pomógł: 4
Dołączył: 1.12.2006

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
LonelyKnight
post
Post #11





Grupa: Zarejestrowani
Postów: 240
Pomógł: 13
Dołączył: 1.06.2007
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
KCG
post
Post #12





Grupa: Zarejestrowani
Postów: 449
Pomógł: 4
Dołączył: 1.12.2006

Ostrzeżenie: (0%)
-----


W takim razie dzięki (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Chciałem się upewnić po prostu. Jak coś, to napiszę. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Kocurro
post
Post #13





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) we wsi (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

pozdr.

ps: jeśli i to nie poskutkuje to zmień serwer bo ten Cię oszukuje (IMG:http://forum.php.pl/style_emoticons/default/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.

Ten post edytował Kocurro 29.02.2008, 11:12:17
Go to the top of the page
+Quote Post
KCG
post
Post #14





Grupa: Zarejestrowani
Postów: 449
Pomógł: 4
Dołączył: 1.12.2006

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.09.2025 - 09:24