Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Miniaturki zdjęć i Allowed memory size
Forum PHP.pl > Forum > PHP
Fargo17
  1. <?php
  2.  header('Content-type: image/jpeg');
  3.   define ('SZEROKOSC',130);
  4.   define ('WYSOKOSC',100);
  5.    $orginal=imagecreatefromjpeg($_GET['fotka']);
  6.     list($org_szer,$org_wys)=getimagesize($_GET['fotka']);
  7.      $minitaturka=imagecreatetruecolor(SZEROKOSC,WYSOKOSC);
  8.      imagecopyresized($minitaturka, $orginal, 0, 0, 0, 0, SZEROKOSC, WYSOKOSC, 20, 20, $org_szer, $org_wys);
  9.      imagejpeg($minitaturka, NULL, 50);
  10.  ?>



Przeszukałem google w poszukiwaniu rozwiązania, nic. Otrzymuję taki komunikat:

PHP Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 12224 bytes) in /home/pineawaw/public_html/mini.php on line 5

Pisałem już do firmy hostingującej o zwiększenie mi memory_limit z 32M na 64M co też uczynili. Próbowałem też dodać w skrypcie
  1. <?php
  2. ini_set('memory_limit', '64M');
  3. ?>

Zero efektu. Skrypt nie może stworzyć miniaturki oryginalnego zdjęcia nawet o rozmiarze 180kb. Szczerze powiedziawszy nie znam się na programowaniu, skrypt jest ogólnie dostępny w internecie. Chciałbym się dowiedzieć, co mogę zrobić by to zadziałało. Na ustawieniach serwera z memory_limit 128M nie ma tego problemu, miniatury tworzą się normalnie.
maly_swd
podaj adres do pliku, ktory wczytujesz przez GET:) bedzie mozna cos sie dowiedziec i Ci pomoc
Fargo17
  1. <?php
  2.  
  3. /*
  4. Ustalamy w jakim katalogu znajduja sie zdjecia oraz
  5. ile wierszy i kolumn bedzie tworzyc galeria jednej strony.
  6. */
  7. define('KATALOG_ZDJEC','galeria/');
  8. define('KATALOG_OPIS','galeria/opis/');
  9. define('WIERSZY',2);
  10. define('KOLUMN',4);
  11.  
  12. /*
  13. Przeczesujemy wybrana lokalizacje w poszukiwaniu plikow .jpg
  14. i zapujemy ich nazwy w tablicy $album. Wszelkie informacje o
  15. plikach beda teraz odczytywane z tej tablicy dzieki czemu ograniczymy
  16. mielenie dyskiem do minimum :)
  17. */
  18. $x=0;
  19. foreach (glob(KATALOG_ZDJEC."*.jpg") as $zdjecie) $album[$x++]=$zdjecie;
  20.  
  21. /* Zliczamy ile fotek lacznie pojawi sie na jednej stronie oraz calkowita ich liczbe */
  22. $na_stronie=WIERSZY*KOLUMN; $razem=count($album);
  23.  
  24. /*
  25. Dzieki czemu mozemy wyliczyc liczbe stron. Czesc calkowita z dzielenia
  26. liczby fotek przez liczbe zdjec na jednej stronie da laczna liczbe stron.
  27. Jesli zostanie jakas reszta z dzielenia to znaczy ze potrzebujemy jeszcze
  28. jednej strony dla wyswietlenie kilku ostatnich zdjec
  29. */
  30. $stron=floor($razem/$na_stronie); $stron+=$razem % $na_stronie ? 1:0;
  31.  
  32. /*
  33. Zmienna $pokaz_strone przechowuje nr. akutalnej strony do wyswietlenia.
  34. Jej wartosc odczytywana jest z adresu strony (np. <a href=\"http://szabloniki.com/galeria.php?pokaz_strone=4)\" target=\"_blank\">http://szabloniki.com/galeria.php?pokaz_strone=4)</a>
  35. Jesli wartosc nie zostala ustalona (http://szabloniki.com/galeria.php)
  36. przyjmujemy ze wyswietlamy strone 1
  37. */
  38. $pokaz_strone=$_GET['pokaz_strone']; if (!isset($pokaz_strone)) $pokaz_strone=1;
  39.  
  40.  
  41. /*
  42. Bedziemy odczytywac tylko te fragmenty tablicy $album ktore zawieraja
  43. zdjecia wystepujace na danej stronie, dlatego potrzebujemy ustalic
  44. jaki bedzie to obszar
  45. */
  46. $start=($pokaz_strone-1) * $na_stronie;
  47. $stop=($pokaz_strone==$stron) ? $razem % $na_stronie: $na_stronie; $stop+=$start;
  48.  
  49. echo "<table align=\"center\" valign=\"top\"><tr><div class=\"pages1\" style=\"padding-left: 8px\">";
  50. echo "<span class=\"nextprev\">Strona: </span>";
  51.  
  52. for($x=1;$x<=$stron;$x++) {
  53. /* Bierzaca strone pogrubimy a pozostale beda linkami z odpowiednim adresem */
  54. if ($pokaz_strone==$x){echo "<span class=\"current\"> $x </span>";} else {echo "<a href=\"galeria.php?pokaz_strone=$x\" class=\"page1\"> $x </a>";}
  55. }
  56. /* Z wybranych elementow rusyjemy tabelke */
  57. for ($x=$start;$x<$stop;$x++){
  58. /* Jesli osiagnieto ustalona liczbe kolumn przechodzimy do nastepnego wiersza */
  59. if (!($x % KOLUMN)) echo "</div></tr><br><br><tr width=\"200\" valign=\"top\">";
  60. /* Tworzymy obrazek ktory wygenerowany zostanie przez skrypt mini.php na podstawie przekazanej nazwy pliku */
  61. echo "<td valign=\"top\" width=\"200\" height=\"150\" style=\"padding-left: 8px\"><a href=\"".$album[$x]."\" class=\"thickbox\"><img style=\"border-color: #496C87\" border=\"1\" src=\"mini.php?fotka="."{$album[$x]}\"></a>";
  62. /* Ponizsze linie sprawdzaja czy w katalogu ze zdjeciem istnieje taki sam plik z roszerzeniem .txt. Jesli tak, wyswietla jego zawartosc pod zdjeciem */
  63. list($info)=explode('.',basename($album[$x]));
  64. if(file_exists(KATALOG_OPIS.$info.".txt")){
  65. $plik=fopen(KATALOG_OPIS.$info.".txt","r");
  66. $opis=fgets($plik);
  67. fclose($plik);
  68. echo "<br>$opis";
  69. }
  70. echo "</td>";
  71. }
  72. echo "</tr></table>";
  73.  
  74. /* Jesli mamy wiecej niz jedna strone wyswietlimy ich liste */
  75. if ($stron>1){
  76. echo "<br>";
  77. }
  78. ?>
maly_swd
Chyba sie nie zrozumielismy:)

podaj lokalizacje pliku, ktory chesz obrobic ta funkcja $orginal=imagecreatefromjpeg($_GET['fotka']);
Fargo17
galeria/DSC00918.jpg

pełen adres http://pinea.waw.pl/galeria/DSC00918.jpg
maly_swd
To ile wazy plik nie ma tu znaczenia, poniewaz GD musi go obrobic w formie nieskompresowanej. A Ty dajesz mu bardzo duzy plik
3056x4592 smile.gif
Do tego potrzebne Ci minimum 128MB (tak z moich obliczen).

Pozdrawiam
Fargo17
Czy istnieje możliwość przerobienia skryptu tak by robił miniaturki bez względu na rozmiar zdjęcia ?
ucho
exec/system + mogrify z pakietu imagemagick. Jeśli nie możesz uruchamiać zewnętrznych programów lub nie ma takiego oprogramowania na serwerze to nic nie zrobisz
maly_swd
da sie:)
zrob tak:
1. $orginal=imagecreatefromjpeg($_GET['fotka']); wywolaj to i powiedz ile wyswietli ze mu zabraklo pamieci..

jak juz bedziesz wiedzial to daj znac.
Zobacz tak czy przechodzi

  1. <?php
  2. header('Content-type: image/jpeg');
  3.  define ('SZEROKOSC',130);
  4.  define ('WYSOKOSC',100);
  5. //  $orginal=imagecreatefromjpeg($_GET['fotka']); to powinno o polowe zmniejszyc zapotrzebowanie, ale na 100% nie mam pewnosci jak operuje GD na pamieci.
  6.    list($org_szer,$org_wys)=getimagesize($_GET['fotka']);
  7.     $minitaturka=imagecreatetruecolor(SZEROKOSC,WYSOKOSC);
  8.     imagecopyresized($minitaturka, imagecreatefromjpeg($_GET['fotka']), 0, 0, 0, 0, SZEROKOSC, WYSOKOSC, 20, 20, $org_szer, $org_wys);
  9.     imagejpeg($minitaturka, NULL, 50);
  10. ?>
Fargo17
W oryginalnej wersji:

PHP Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 12224 bytes) in /home/pineawaw/public_html/mini.php on line 5

Po podmienieniu na

  1. <?php
  2. header('Content-type: image/jpeg');
  3.  define ('SZEROKOSC',130);
  4.  define ('WYSOKOSC',100);
  5. //   $orginal=imagecreatefromjpeg($_GET['fotka']); to powinno o polowe  zmniejszyc zapotrzebowanie, ale na 100% nie mam pewnosci jak operuje GD  na pamieci.
  6.    list($org_szer,$org_wys)=getimagesize($_GET['fotka']);
  7.     $minitaturka=imagecreatetruecolor(SZEROKOSC,WYSOKOSC);
  8.     imagecopyresized($minitaturka, imagecreatefromjpeg($_GET['fotka']), 0, 0, 0, 0, SZEROKOSC, WYSOKOSC, 20, 20, $org_szer, $org_wys);
  9.     imagejpeg($minitaturka, NULL, 50);
  10. ?>


PHP Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 18368 bytes) in /home/pineawaw/public_html/mini.php on line 8
maly_swd
Pobawilem sie troche... i ten obrazek da sie obrobic przy 70mb

i zastanawia mnie jakim cudem dzialalo Ci imagecopyresized z 12 parametrami:) powinno byc z 10.


  1. <?php
  2. header('Content-type: image/jpeg');
  3. ini_set('memory_limit', '70M');
  4. define ('SZEROKOSC',130);
  5. define ('WYSOKOSC',100);
  6.  
  7.   list($org_szer,$org_wys)=getimagesize("http://pinea.waw.pl/galeria/DSC00918.jpg");
  8.    $minitaturka=imagecreatetruecolor(SZEROKOSC,WYSOKOSC);
  9.   // imagecopyresized($minitaturka, imagecreatefromjpeg("http://pinea.waw.pl/galeria/DSC00918.jpg"), 0, 0, 0, 0, SZEROKOSC, WYSOKOSC, 20, 20, $org_szer, $org_wys);
  10. imagecopyresampled($minitaturka, imagecreatefromjpeg("http://pinea.waw.pl/galeria/DSC00918.jpg"), 0, 0, 0, 0, SZEROKOSC, WYSOKOSC,$org_szer, $org_wys);
  11.    imagejpeg($minitaturka);
  12. ?>
Fargo17
Poproszę w takim razie administrację firmy hostingowej o zwiększenie limitu do 80M, jeśli tak sądzisz maly_swd, sprawdzę, jeśli jednak będzie inaczej chyba trzeba będzie zmniejszyć rozmiar zdjęć. Dzięki serdeczne za pomoc, odezwę się jak tylko będę coś więcej wiedział.
maly_swd
Sprawdz czy Ci nie dziala z tym co dopisane masz w 3 linie set_ini... A jak bedziesz prosil to zwieksz sobie do 128mb tak dla pewnosci:)
Fargo17
ok sprawa załatwiona, zwiększony limit z 32M do 128M i skrypt działa w pierwotnej wersji. Dzięki za pomoc.
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.