Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak sobie poradzić z przesyłaniem dużych plików?
Forum PHP.pl > Forum > PHP
deha21
Mam problem ze skryptem. Przez 5 inputów ładuję 5 plików, powiedzmy po 3MB - chodzi o JPG. Skrypt ma zadanie przerobić je jeżeli są większe od 800x600 i zmniejszyć, po czym dorobić miniaturkę. Jeżeli wgram np. tylko dwa obrazki z pięciu możliwych to skrypt normalnie wchodzi. Jeśli natomiast wgram te 5 to skrypt się sypie i wgrywa np. tylko jeden albo nic. Memory_limit mam ustawiony na 128MB - myślałem że to pomoże ale nic. Przy okazji czyści mi inne zmienne które były w tym formularzu. Nie wyskakuje żaden błąd, mimo włączonych opcji ich pokazywania. WTF, że tak się zapytam.

Kod zmniejszania (funkcje resize i resize2):
  1. <?php
  2. ini_set("display_errors",1);
  3. ini_set("memory_limit","128M");
  4.  
  5. function resize($filef, $new_width, $new_height, $thumb, $quality) {
  6. $info = getimagesize($filef);
  7. if ($info === false)
  8. return false;
  9. $img = null;
  10. $img = imagecreatefromjpeg($filef);
  11. $th = imagecreatetruecolor($new_width, $new_height);
  12.  
  13. imagecopyresampled($th, $img, 0, 0, 0, 0, $new_width, $new_height, $info[0], $info[1]);
  14. imagejpeg($th, $filef, $quality);
  15. imagedestroy($th);
  16. imagedestroy($img);
  17. return true;
  18.  
  19. }
  20.  
  21. function resize2($filef, $new_width, $new_height, $thumb, $quality) {
  22. $info = getimagesize($filef);
  23. if ($info === false)
  24. return false;
  25. $img = null;
  26. $img = imagecreatefromjpeg($filef);
  27. $th = imagecreatetruecolor(80, 80);
  28.  
  29. imagecopyresampled($th, $img, 0, 0, 0, 0, $new_width, $new_height, $info[0], $info[1]);
  30. imagejpeg($th, $filef, $quality);
  31. imagedestroy($th);
  32. imagedestroy($img);
  33. return true;
  34.  
  35. }
  36.  
  37. ?>


Kod wgrywania (funkcja uruchamiana kilkakrotnie w przypadku kilku plików):
  1. function adpic($id,$arg,$position) {
  2.  
  3. $path="../pliki/".$id;
  4. if (!file_exists($path)) { mkdir($path); chmod($path, 0777); }
  5. $newimage=uniqid().".jpg";
  6. move_uploaded_file($_FILES[$arg]["tmp_name"],$path."/".$newimage);
  7. $info = getimagesize($path."/".$newimage);
  8.  
  9. if ($info[0]>$info[1]) {
  10. if ($info[0]>625) {
  11. $height=(625/$info[0])*$info[1];
  12. resize($path."/".$newimage, 625, $height, $path."/".$newimage, 75);
  13. }
  14. } elseif ($info[0]<$info[1]) {
  15. if ($info[1]>450) {
  16. $width=(450*$info[0])/$info[1];
  17. resize($path."/".$newimage, $width, 450, $path."/".$newimage, 75);
  18. }
  19. }
  20.  
  21. if ($info[0]<=$info[1]) {
  22. copy($path."/".$newimage,$path."/thumb_".$newimage);
  23. $thumb_height = (80/$info[0])*$info[1];
  24. resize2($path."/thumb_".$newimage, 80, $thumb_height, $path."/thumb_".$newimage, 80);
  25. } elseif ($info[0]>$info[1]) {
  26. copy($path."/".$newimage,$path."/thumb_".$newimage);
  27. $thumb_width=(80*$info[0])/$info[1];
  28. resize2($path."/thumb_".$newimage, $thumb_width, 80, $path."/thumb_".$newimage, 80);
  29. }
  30.  
  31. $pic=mysql_query("INSERT INTO zdjecie values ('','".$id."','".$newimage."','".$position."')");
  32. }
Pilsener
Cytat
Przez 5 inputów ładuję 5 plików
- i obrabiasz je w locie GD? I sprawdzasz jakoś te pliki i poszczególne czynności? Ja bym rozbił to na 5 etapów lub dał jakiś flash/js loader tak, żeby po kolei można było wrzucać te pliki, dzisiaj są jakieś fajne wynalazki, pasek postępu pokazuje i tak dalej. I trzeba sprawdzać, czy plik został przesłany, czy zapisany w _temp, czy wszystko z nim ok i tak dalej.

Prawdopodobnie masz problem ze zbyt długim czasem wykonywania się skryptu - ale ciężko powiedzieć bo nigdzie nie sprawdzasz czy dana operacja się powiodła i w ten sposób nigdy się nie dowiesz, gdzie jest problem, wykonujesz jakąś funkcję i masz nadzieję, że to zadziała - funkcja powinna chociaż true zwrócić jeśli operacja się powiodła a by to stwierdzić trzeba podzielić to na etapy i sprawdzać za każdym razem.

Dlatego powinno się wrzucać pliki po kolei a potem obrabiać - jeśli coś pójdzie nie tak to pliki zostaną usunięte, bo są tymczasowe lub user będzie mógł próbować ponownie załadować plik na którym skończył.
Sinevar
Może popróbuj z tym:

  1. set_time_limit(60 * 10);
  2. echo ini_get('max_execution_time');


A w ogóle to polecam zapoznać się z http://www.plupload.com/
deha21
Kurcze, właśnie chciałbym to zrobić jak najprościej bez zewnętrznych skryptów. Zależy mi właśnie na tym żeby były "zwykłe inputy" do zdjęć. Nie ma jakiegoś sposoby na to żeby kolejny skrypt wykonał się dopiero po wykonaniu poprzedniego? coś a'la "break until sie zrobi poprzedni" ;p
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.