Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> upload zdjęć + skalowanie, problem z zapisem
wude
post
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 19.08.2010

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


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.

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
ActivePlayer
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


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





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 19.08.2010

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


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





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


Ale dlaczego nie zwalniasz zasobu po zapisaniu, tylko dalej trzymasz w buforze? Służy temu funkcja imagedestroy()


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
wude
post
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 19.08.2010

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


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





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


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?


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
wude
post
Post #7





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 19.08.2010

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


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

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

 



RSS Aktualny czas: 20.08.2025 - 17:40