Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: upload zdjęć + skalowanie, problem z zapisem
Forum PHP.pl > Forum > PHP
wude
Witam,

Napisałem taki skrypt do uploadu zdjęć + skalowania do 4 formatów:

  1. $adres_katalogu = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'];
  2. $adres_zdj = $adres_katalogu.$zdj_ilosc.'.jpg';
  3.  
  4. //format oryginalny
  5. move_uploaded_file($plik_tmp,$adres_zdj);
  6.  
  7. $new_img=imagecreatefromjpeg($adres_zdj);
  8.  
  9. $watermark = imagecreatefrompng('../images/watermark.png');
  10. $zwX = imageSX($new_img) - imageSX($watermark);
  11. $zwY = imageSY($new_img) - imageSY($watermark);
  12. imagecopymerge($new_img, $watermark, $zwX, $zwY, 0, 0, imageSX($watermark), imageSY($watermark), 80);
  13.  
  14. imagejpeg($new_img, "$adres_zdj", 85);
  15.  
  16.  
  17. //format 20x16
  18. $adres_nowy = $adres_katalogu.$zdj_ilosc.'b.jpg';
  19.  
  20. $img=imagecreatefromjpeg($adres_zdj);
  21. $x = imagesx($img);
  22. $y = imagesy($img);
  23. $nx = 20;
  24. $ny = 16;
  25.  
  26. $new_img = imagecreatetruecolor($nx, $ny);
  27. imagecopyresampled($new_img, $img, 0, 0, 0, 0, $nx, $ny, $x, $y);
  28. imagejpeg($new_img, "$adres_nowy", 85);
  29.  
  30. //format max 180x100
  31. $adres_nowy = $adres_katalogu.$zdj_ilosc.'c.jpg';
  32.  
  33. $img=imagecreatefromjpeg($adres_zdj);
  34. $x = imagesx($img);
  35. $y = imagesy($img);
  36. if($x > 180){
  37. $nx = 180;
  38. $ny = 180 * ($y / $x);
  39. }elseif($x < 180){
  40. $nx = $x;
  41. $ny = $y;
  42. }else{
  43. $nx = $x;
  44. $ny = $y;
  45. }
  46. if($ny > 100){
  47. $nx2 = 100 * ($nx / $ny);
  48. $ny2 = 100;
  49. }elseif($ny < 100){
  50. $nx2 = $nx;
  51. $ny2 = $ny;
  52. }else{
  53. $nx2 = $nx;
  54. $ny2 = $ny;
  55. }
  56.  
  57. $new_img = imagecreatetruecolor($nx2, $ny2);
  58. imagecopyresampled($new_img, $img, 0, 0, 0, 0, $nx2, $ny2, $x, $y);
  59. imagejpeg($new_img, "$adres_nowy", 85);
  60.  
  61. //format max 310x240
  62. $adres_nowy = $adres_katalogu.$zdj_ilosc.'d.jpg';
  63.  
  64. $img=imagecreatefromjpeg($adres_zdj);
  65. $x = imagesx($img);
  66. $y = imagesy($img);
  67. if($x > 310){
  68. $nx = 310;
  69. $ny = 310 * ($y / $x);
  70. }elseif($x < 310){
  71. $nx = $x;
  72. $ny = $y;
  73. }else{
  74. $nx = $x;
  75. $ny = $y;
  76. }
  77. if($ny > 240){
  78. $nx2 = 240 * ($nx / $ny);
  79. $ny2 = 240;
  80. }elseif($ny < 240){
  81. $nx2 = $nx;
  82. $ny2 = $ny;
  83. }else{
  84. $nx2 = $nx;
  85. $ny2 = $ny;
  86. }
  87.  
  88. $new_img = imagecreatetruecolor($nx2, $ny2);
  89. imagecopyresampled($new_img, $img, 0, 0, 0, 0, $nx2, $ny2, $x, $y);
  90. imagejpeg($new_img, "$adres_nowy", 85);
  91.  
  92. //format max 780x*** + watermark
  93. $adres_nowy = $adres_katalogu.$zdj_ilosc.'e.jpg';
  94.  
  95. $img=imagecreatefromjpeg($adres_zdj);
  96. $x = imagesx($img);
  97. $y = imagesy($img);
  98. if($x > 780){
  99. $nx = 780;
  100. $ny = 780 * ($y / $x);
  101. }elseif($x < 780){
  102. $nx = $x;
  103. $ny = $y;
  104. }else{
  105. $nx = $x;
  106. $ny = $y;
  107. }
  108.  
  109.  
  110. $new_img = imagecreatetruecolor($nx, $ny);
  111. imagecopyresampled($new_img, $img, 0, 0, 0, 0, $nx, $ny, $x, $y);
  112.  
  113. $watermark = imagecreatefrompng('../images/watermark.png');
  114. $zwX = imageSX($new_img) - imageSX($watermark);
  115. $zwY = imageSY($new_img) - imageSY($watermark);
  116. imagecopymerge($new_img, $watermark, $zwX, $zwY, 0, 0, imageSX($watermark), imageSY($watermark), 80);
  117.  
  118. imagejpeg($new_img, "$adres_nowy", 85);


Wiem, że lepiej by to wyglądało obiektowo, ale chcę uruchomić skrypt na razie w takiej wersji.

Problem polega na tym, że nie wszystkie skalowane zdjęcia zapisują się na serwerze. Co gorsza po serii testów trudno określić logikę, jaką kieruje się PHP nie zapisując konkretnych zdjęć, np. dodałem ostatnio 5 zdjęć i:

- wszystkie 5 zdjęć zapisały się prawidłowo w pierwszych 3 formatach (oryginalny, 20x16, 180x100)
- żadne zdjęcie nie zapisało się w 4 formacie (310x240)
- pierwsze 3 zdjęcia zapisały się w ostatnim formacie (780x***)

Macie jakieś pomysły co do przyczyn? Czy istnieje możliwość, że zarzynam pamięć serwera (768mb)? Normalnie wykorzystuję 300mb, podczas testowania skryptów było to ponad 700mb.

ActivePlayer
włącz logi lub wyświetlanie błędów php'a i sprawdź co sie w nich zapisuje. Prawdopodobnie przyczyna będzie po stronie memory_limit
wude
Włączyłem logi i zresetowałem serwer. Wszystkie zdjęcia na razie prawidłowo się dodają, pewnie dlatego że zużywam tylko 550/768 mb pamięci. Na błędy PHP pewnie będziemy musieli poczekać do jutra, aż zwiększy się ruch w innym serwisie i będzie większe zużycie pamięci.

Przeraża mnie to, że jeden użytkownik dodając 5 zdjęć zużywa 300 mb pamięci... Czy istnieje jakiś sposób zwolnienia pamięci z tych zdjęć po ich dodaniu?
everth
Ale dlaczego nie zwalniasz zasobu po zapisaniu, tylko dalej trzymasz w buforze? Służy temu funkcja imagedestroy()
wude
Cytat(everth @ 11.09.2010, 21:53:46 ) *
Ale dlaczego nie zwalniasz zasobu po zapisaniu, tylko dalej trzymasz w buforze? Służy temu funkcja imagedestroy()


Zapomniałem o tej funkcji... Dodałem imagedestroy() i zaraz po dodaniu zdjęć pamięć jest zwalniana. Dzięki winksmiley.jpg

A macie jakieś pomysły na zwiększenie wydajności tego skryptu? Obecnie przy dodawaniu 5 zdjęć zjada 50-100 mb pamięci, przy większym ruchu w serwisie może być nieciekawie.
everth
Używasz GD - nie wiem, może jesteś ograniczony możliwościami serwera (choć moim zdaniem byłoby to trochę dziwne) - czemu nie użyjesz np. ImageMagick?
wude
Cytat(everth @ 12.09.2010, 18:54:52 ) *
Używasz GD - nie wiem, może jesteś ograniczony możliwościami serwera (choć moim zdaniem byłoby to trochę dziwne) - czemu nie użyjesz np. ImageMagick?


Szczerze mówiąc pierwszy raz słyszę o tej bibliotece. Ma ona jakieś zalety/wady w stostunku do GD (przede wszystkim jeśli chodzi o wydajność)?
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.