Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] skrypt uploadujący zdjecia na serwer
Forum PHP.pl > Forum > Przedszkole
kristoff
Witam. Posiadam taki skrypcik uploadujący na serwer zdjecia za pomocą formularza. Niestety chyba coś jest z nim nie tak a mianowicie z jakiegoś powodu zużywa zbyt dużo pamięci operacyjnej. Np. podczas uploadu 3 zdjeć po 1,4 mb każde, wychodzi błąd krytyczny z informacją że ponad 20 MB pamieci zostało żużyte:

Fatal error: Allowed memory size of 20971520 bytes exhausted (tried to allocate 6144 bytes) in...

Czy to normalne że skrypt zużywa tyle pamięci a jeśli nie to jak go zoptymalizować?
pozdrawiam


  1. <?php
  2. $zdjecia=array(1 => "zdjecie1", 2 => "zdjecie2", 3 => "zdjecie3");
  3. foreach($zdjecia as $war => $var)
  4. {
  5. if(is_uploaded_file($_FILES[$var]['tmp_name']))
  6. {
  7. $err_msg = false;
  8. do {
  9. if(!isset($_FILES[$var]))
  10. {
  11. $err_msg = 'Formularz nie został przesłany w całości';
  12. break;
  13. } else {
  14. $zdjecie = $_FILES[$var];
  15. }
  16.  
  17. switch ($zdjecie['error'])
  18. {
  19. case UPLOAD_ERR_INI_SIZE:
  20. $err_msg = "Rozmiar zdjęć jest zbyt duży. Zdjęcie nie moze przekraczać $max_rozmiar_zdj
    ecia MB"
    ;
  21. break 2;
  22. case UPLOAD_ERR_PARTIAL:
  23. $err_msg = "Podczas wgrywania pliku wystąpił błąd, proszę <a href='form.php'>spróbować ponownie</a>";
  24. break 2;
  25. }
  26.  
  27. if(!in_array($zdjecie['type'], array('image/jpeg', 'image/pjpeg', 'image/png')))
  28. {
  29. $err_msg = "Zdjęcia muszą być w formacie JPEG lub PNG";
  30. break;
  31. }
  32.  
  33. } while (0);
  34.  
  35. if($err_msg)
  36. {
  37. echo $err_msg;
  38. } else {
  39. $rozbita=explode(".", $_FILES[$var]['name']);
  40. move_uploaded_file($_FILES[$var]['tmp_name'],"$upload_dir" . "/$war." . end($rozbita)); 
  41. $plik=$upload_dir . "/$war." . end($rozbita);
  42. chmod("$plik", 0777);
  43. }
  44. // resamplowanie i kopiowanie oryginalnych zdjec na miniatury
  45. Header("Content-type: image/jpeg");
  46.  
  47. list($width, $height) = getimagesize($plik);
  48. $newwidth ='241';
  49. $newheight = '181';
  50.  
  51. switch($war)
  52. {
  53. case 1: $nazwa='a';
  54. break;
  55. case 2: $nazwa='b';
  56. break;
  57. case 3: $nazwa='c';
  58. break;
  59. }
  60.  
  61. $docelowy_obraz=$upload_dir . '/' . $nazwa . '.' . end($rozbita);
  62. $thumb = imagecreatetruecolor($newwidth, $newheight);
  63. $source = imagecreatefromjpeg($plik);
  64.  
  65. imagecopyresampled($thumb, $source, 0,0,0,0,$newwidth, $newheight, $width, $height);
  66.  
  67. imageJPEG($thumb, $docelowy_obraz, 90);
  68. imagedestroy($thumb);
  69.  
  70. // jesli mamy doczynienia z pierwszym zdjeciem tworzymy miniature na strone glowna
  71. if($war==1)
  72. {
  73. Header("Content-type: image/jpeg");
  74.  
  75. list($width, $height) = getimagesize($plik);
  76. $newwidth ='100';
  77. $newheight = '75';
  78.  
  79. $nazwa="waf";
  80. $docelowy_obraz=$upload_dir . '/' . $nazwa . '.' . end($rozbita);
  81. $thumb = imagecreatetruecolor($newwidth, $newheight);
  82. $source = imagecreatefromjpeg($plik);
  83.  
  84. imagecopyresampled($thumb, $source, 0,0,0,0,$newwidth, $newheight, $width, $height);
  85.  
  86. imageJPEG($thumb, $docelowy_obraz, 90);
  87. imagedestroy($thumb);
  88. }
  89.  
  90. }
  91. }
  92. ?>
sf
Jedynym rozsądnym rozwiązaniem będzie wgrywanie każdego zdjęcia osobno. Tak jak np. jest dołanczanie załączników na wp.pl. Innej rady raczej nie widzę.
joshrob
Cytat(sf @ 20.03.2007, 16:32:34 ) *
Jedynym rozsądnym rozwiązaniem będzie wgrywanie każdego zdjęcia osobno. Tak jak np. jest dołanczanie załączników na wp.pl. Innej rady raczej nie widzę.


Witam,

ja jednak sklonie sie do tego, ze petla nie ma tu nic do rzeczy. w kodzie widac czarno na bialym imagedestroy() wiec po kazdym przejsciu pamiec (przynajmniej teoretycznie) jest zwalniana.
kwestia jest tu w tym, ze jpg to format kompresowany, a php aby manipulowac na plikach musi dzialac na danych bez kompresji. pierwszy lepszy 800KB jpg z syfrowki canona 5Mpix jaki wzialem, po dekompresji ma 9MB.

to co mozesz zrobic to ograniczyc na oko (bo ilosc danych po dekompresji zalezec bedzie od ilosci szczegolow na zdjeciu) wielkosc uploadowanych plikow, albo wymusic ini_set()'em ilosc ramu dostepna dla skryptu http://pl.php.net/manual/en/ini.core.php#ini.memory-limit , http://pl.php.net/ini_set

pozdrawiam,
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.