ugrás a tartalomhoz

set_time_limit()

sUTy · 2007. Dec. 17. (H), 13.02
Sziasztok!

Az extra.hu-n van egy oldalam, ahol képeket kell feltölteni és átméretezni, esetleg forgatni. (Ez utóbbiról letettem, inkább feltöltés elött megteszem. Sajnos tiltva van az imagerotate() függvény az extán.)
A baj ott van, hogy egyszerre 4-500 fájl feltöltéséről van szó. Ha egyesével töltögetem fel, akkor el is végzi a képmanipulációkat (bélyegkép és kb 600px magas képek elkészítése és az eredeti kép törlése), de ez időigényes és monoton. Ha feltöltöm ftp-n és utána küldöm rá a progit, akkor kiakad, mert sajna a set_time_limit() függvény is tiltva van.

Tud valaki a set_time_limit() helyett valami megoldást?
Próbáltam, hogy esetleg kisebb csoportonként készítem el a bélyegképeket, de kettő után fatális hibát okozott. Így ez sem megoldás.
 
1

Kattogtasd meg a böngészőt ;)

ppshungary · 2007. Dec. 17. (H), 13.47
Ha mindenképpen web-en akarod megoldani (nem parancssorból) akkor a már meglévő átméretező scripted elé
írj egy könvytárolvasó scripted, ami ajax-hívásokkal a file-névvel és elérési úttal meghívogatja az átméretező scriptet. Mozillával akár egyszerre több thread-en is tudod csinálni.
2

Miért szerveren?

s_volenszki · 2007. Dec. 17. (H), 13.51
Miért a szerveren kell ezt csinálni? Csak egy alűr vagy ok?

Egy egyszerű fényképszerkesztő program is tud kötegelt fájl átméretezést és elforgatást.

s_volenszki
3

muszály szerveren

sUTy · 2007. Dec. 17. (H), 15.50
Köszönöm a gyors válaszokat!

Sajnos muszály szerveren, mert a megbízómnak külön kérése volt, hogy ne kelljen neki hetente 4-500 képpel molyolni és egyesével feltöltögetni.

Az AJAX-hoz (egyelőre) lövésem sincs. Tudnátok esetleg félkész - kész megoldást könyvtár olvasó és hivogató scriptre?
4

Akkor ez azt jelenti...

s_volenszki · 2007. Dec. 17. (H), 16.07
Akkor ez azt jelenti, hogy a "megbízód" fel FTP-zi a képeket egy célkönyvtárba és utána ráereszti a feldolgozó hadműveletet?

s_volenszki
6

A megfelelő eszközt a megfelelő feladatra

zila · 2007. Dec. 17. (H), 17.12
A megfelelő eszközt a megfelelő feladatra avagy nem mindent php-ban, weboldalon kell megoldani.
Hát én írnék neki egy kis perl/tk scriptet, becsomagolnám egy imagemagick-kel együtt, feltelepíteném az ügyfél gépére és megtanítanám, hogy dobja rá a képeit a kis script ablakára/válassza ki a képek mappáját a saját gépén, és ebben a scriptben méretezném át a képeket. Még azt is bele lehet építeni, hogy automágikusan ftp-vel feltöltse az átméretezett/elforgatott képeket a tárhelyre.
7

Nézd csak!

s_volenszki · 2007. Dec. 17. (H), 17.44
Ehun egy freeware win32 alkalmazás, ami kötegelt képátméretezést tud, és beállítható célnak FTP szerver is!

bimp-batch-image-processor

:)

s_volenszki

szerk:

Bocsi, az a link nem műxik, de ezek jók:
bimp-batch-image-processor
bimp-batch-image-processor

szerk2:

Nagyon komoly! Kipróbáltam, ez nekem is jól jön! :)
8

Hívogató script

ppshungary · 2007. Dec. 17. (H), 17.55
Sokmindent lehet rajta pofozni de nincs időm ilyenekre, majd te megcsinálod.
Ha a picture.php ad valamit kimenetként pl.: "SUCCES ".$_GET["filename"] akkor még jól is néz ki ;)
A http://www.ajaxtoolbox.com/request/compact/AjaxRequest.js
címen található scriptet töltsd le és írd át az elérési útját a kódban, mert így még függ a programod az ő szerverüktől, a biztonságról meg már ne is beszéljek... EZ LEGYEN AZ ELSŐ DOLGOD!
Ja és tanulj meg AJAX-ul érdemes. Bár ezt a problémát semmiféleképpen sem így oldottam volna meg.
  1. <?php  
  2. $ftp_directory="uploaded_files";  
  3. $picture_script="picture.php";  
  4. $jstombnev="filetmb";  
  5. $files="var ".$jstombnev."= new Array();\n";  
  6.   
  7. if ($k_azon = opendir($ftp_directory))  
  8.         {  
  9.         while (false !== ($fajl = readdir($k_azon)))  
  10.                 {  
  11.                 if ($fajl != "." && $fajl != "..")  
  12.                         {  
  13.                         $files.=$jstombnev.".push('".$ftp_directory."/".$fajl."');\n";  
  14.                         }  
  15.                 }  
  16.         closedir($k_azon);  
  17.         }  
  18.   
  19. $output="  
  20. <html>  
  21. <head>  
  22. <script src='http://www.ajaxtoolbox.com/request/compact/AjaxRequest.js'></script>  
  23. <script>  
  24.   
  25. function simple_send(item)  
  26. {  
  27. AjaxRequest.get(  
  28.         {  
  29.         'url':'".$picture_script."',  
  30.         'parameters':{'filename':item},  
  31.         'onSuccess':function(req)  
  32.                 {  
  33.                 document.getElementById('output_div').innerHTML+=req.responseText+'<br>';  
  34.                 },  
  35.         'onError':function(req)  
  36.                 {  
  37.                 document.getElementById('output_div').innerHTML+='ERROR: '+item+'<br>';  
  38.                 }  
  39.         });  
  40. }  
  41.   
  42. function allfiles(files)  
  43. {  
  44. for(var i=0;i<files.length;i++)  
  45.         {  
  46.         simple_send(files[i]);  
  47.         }  
  48. }  
  49.   
  50. ".$files."  
  51.   
  52. </script>  
  53. </head>  
  54. <body onload='javascript:allfiles(filetmb);'>  
  55. <div id='output_div'>Kimenet:<br></div>  
  56. </body>  
  57. </html>";  
  58. die($output);  
  59. ?>  
Csak leírok egy értelmes megoldást...
1. írj egy cron jobot, ami figyeli az ftp-logot. Ha a megrendelőd usernevét találod benne, meg azt a könyvtárat ahova a képeket tölti, akkor 2-lépés.
2. írj egy scriptet (bármilyen nyelven) ami tud parancssori futtatást, és paraméterezd fel a GIMP-et.
3. Élvezd a minőséget!
9

extra.hu

zila · 2007. Dec. 17. (H), 17.58
Teljesen egyetértek (én mondjuk nem gimpet paraméterezgetnék, hanem imagemagick-et, de ez lényegtelen) csakhogy a kérdező mindezt az extra.hu-n szeretné megoldani. Nem hiszem, hogy ott ftp-logokhoz, cron-hoz, gimp-hez hozzáférne...
10

Nem fér hozzá...

janoszen · 2007. Dec. 17. (H), 19.53
Mondd másképp: egész biztos hogy nem fér hozzá. :) Vegyen tárhelyet, nem olyan drága, akkor majd hozzáfér.
11

Két dolog biztos

zila · 2007. Dec. 17. (H), 20.49
a halál és az adó :)
De ebben az esetben kívételt tehetünk :)
12

Nem akarja...

sUTy · 2007. Dec. 19. (Sze), 13.17
Úgy látszik, nagyon fakezű vagyok.
Kipróbáltam ppshungary által beírt dolgot, de nem akar működni.
Átirogattam a változókat, letöltöttem az AjaxRequest.js-t és így sem csinál semmit.
Vagyis legalább nincs hibaüzi, de csak azt írja ki, hogy "Kimenet:".
A $picture_script változóban meghatározott .php oldalt nem akarja meghívni (mégy egyszer sem).

beszúrom a vátozásokat és a $picture_script változóban meghatározott .php oldalt:
  1. <?php    
  2. $ftp_directory"kepek/nyerskepek/".$_POST["eztnyit"];     
  3. $picture_script = "admin/picture_manipulate.php";     
  4. $jstombnev = "filetmb";     
  5. $files = "var ".$jstombnev."= new Array();\n";     
  6.   
  7. $k_azon = opendir($ftp_directory);     
  8.            
  9.         while (false !== ($kep_fajl = readdir($k_azon)))     
  10.                 {     
  11.                 if ($kep_fajl != "." && $kep_fajl != ".." && $kep_fajl != "tn" && $kep_fajl != "norm")     
  12.                         {     
  13.                         $files.=$jstombnev.".push('".$ftp_directory."/".$kep_fajl."');\n";     
  14.                         }     
  15.                 }     
  16.         closedir($k_azon);     
  17.              
  18.     
  19. $output$files."    
  20. <html>    
  21. <head>    
  22. <script src='js/AjaxRequest.js'></script>    
  23. <script>    
  24.    
  25. function simple_send(item)    
  26. {    
  27. AjaxRequest.get(    
  28.         {    
  29.         'url':'".$picture_script."',    
  30.         'parameters':{'filename':item},    
  31.         'onSuccess':function(req)    
  32.                 {    
  33.                 document.getElementById('output_div').innerHTML+=req.responseText+'<br>';    
  34.                 },    
  35.         'onError':function(req)    
  36.                 {    
  37.                 document.getElementById('output_div').innerHTML+='ERROR: '+item+'<br>';    
  38.                 }    
  39.         });    
  40. }    
  41.    
  42. function allfiles(files)    
  43. {    
  44. for(var i=0;i<files.length;i++)    
  45.         {    
  46.         simple_send(files[i]);    
  47.         }    
  48. }    
  49.    
  50. ".$files."    
  51.    
  52. </script>    
  53. </head>    
  54. <body onload='javascript:allfiles(filetmb);'>    
  55. <div id='output_div'>Kimenet:<br></div>    
  56.   
  57. </body>    
  58. </html>";   
  59. die($output);    
  60. ?>    
és a picture_manipulate.php:
  1. <?  
  2. $hova = "kepek/nyerskepek/".$_POST["eztnyit"];  
  3. $fajl = $_POST["filename"];  
  4.                   
  5. /////// méret lekérdezése ///////  
  6. $size = getimagesize($hova."/".$fajl);  
  7. $x = $size[0];  
  8. $y = $size[1];  
  9.   
  10. /////// bélyegkép elkészítése ///////  
  11.           
  12. $create_1 = imagecreatefromjpeg($hova."/".$fajl);  
  13. $arany_1 = $y/150;  
  14. $new_x_1 = ceil($x/$arany_1);  
  15. $new_y_1 = ceil($y/$arany_1);  
  16. $x_1 = $x;  
  17. $y_1 = $y;  
  18.   
  19. $tn = $hova."/tn/tn_".strtolower($fajl);  
  20. $tn_kep = imagecreatetruecolor($new_x_1,$new_y_1);  
  21.   
  22. imagecopyresampled($tn_kep$create_1, 0, 0, 0, 0, $new_x_1$new_y_1$x_1$y_1);  
  23. imagejpeg($tn_kep,$tn,75);  
  24. imagedestroy($create_1);  
  25.   
  26. /////// normál kép elkészítése ///////  
  27.       
  28. $create_2 = imagecreatefromjpeg($hova."/".$fajl);  
  29. $arany_2 = $y/600;  
  30. $new_x_2 = ceil($x/$arany_2);  
  31. $new_y_2 = ceil($y/$arany_2);  
  32. $x_2 = $x;  
  33. $y_2 = $y;  
  34.               
  35. $norm = $hova."/norm/".strtolower($fajl);  
  36. $norm_kep = imagecreatetruecolor($new_x_2,$new_y_2);  
  37.       
  38. imagecopyresampled($norm_kep$create_2, 0, 0, 0, 0, $new_x_2$new_y_2$x_2$y_2);  
  39. imagejpeg($norm_kep,$norm,75);  
  40. imagedestroy($create_2);  
  41.   
  42. /////// vízjel elkészítése ///////  
  43.   
  44. $img = $hova."/norm/".$fajl;  
  45. $norm = $hova."/norm/".strtolower($fajl);  
  46. $watermark = imagecreatefrompng('watermark/watermark_2.png');    
  47. $watermark_width = imagesx($watermark);    
  48. $watermark_height = imagesy($watermark);    
  49. $image = imagecreatetruecolor($watermark_width$watermark_height);    
  50. $image = imagecreatefromjpeg($img);    
  51. $size = getimagesize($img);    
  52. $dest_x = $size[0] - $watermark_width;    
  53. $dest_y = $size[1] - $watermark_height;    
  54. $felirat_x = 15;  
  55. $felirat_y = $size[1] - 18;  
  56. $font_size = 20  
  57. $textcolor = imagecolorallocatealpha($image, 221, 221, 221, 10);   
  58. imagecopymerge($image$watermark$dest_x$dest_y, 0, 0, $watermark_width$watermark_height, 50);   
  59. imagettftext ( $image$font_size, 0, $felirat_x$felirat_y$textcolor"watermark/alap.ttf""oldal címe ".date("Y") );  
  60.           
  61.   
  62. imagedestroy($image);    
  63. imagedestroy($watermark);  
  64.   
  65. unlink($hova."/".$fajl);  
  66. ?>         
Kizárólag álló formátumú képekről van szó.

Ha valaki tudna segíteni, nagyon megköszönném.
13

GET!=POST

ppshungary · 2007. Dec. 19. (Sze), 14.17
Nem vagy fakezű, csak egy kicsit félreértetted a kódot.

Ez a script azt csinálja, hogy:
1. az $ftp_directory -ban meghatározott könyvtárban található fileokat (azok neveit) kivéve a (.) és a (..) beolvassa.
2. a $picture_script -ben meghatározott scriptet meghívja minden egyes file-névvel így: admin/picture_manipulate.php?filename=xy
3. A $picture_script -ben meghatározott script által visszadott kimenetet hozzáírja az output_div -id-jű HTML tartalmához

Egy konkrét példa:
az $ftp_directory-ban meghatározott könyvtár tartalma:
.
..
kiskacsa.jpg
mikulas.jpg
lopisztoly.jpg


A script az oldalbetöltés után ezt fogja csinálni:
GET => admin/picture_manipulate.php?filename=kiskacsa.jpg
GET => admin/picture_manipulate.php?filename=mikulas.jpg
GET => admin/picture_manipulate.php?filename=lopisztoly.jpg

A lírtakat figyelembe véve hibák az általad írt kódban:
1. A forrás könyvtár és a célkönyvtár azonos (honnan olvas, hova ír)
2. A picture_manipulate.php $fajl = $_POST["filename"]; sorát írd át így: $fajl = $_GET["filename"]; (03. sor)
vagy
Az általam írt script AjaxRequest.get( sorát írd át AjaxRequest.post( -ra (27. sor)

3. A $_POST["eztnyit"] nem lesz értelmezhető a picture_manipulate.php-ban (akkor se, ha átírod POST metódusra az AjaxRequest-et, mindaddig, amíg a paraméter listába fel nem veszed)

Ha kész vagy válaszolj, kíváncsi vagyok a végeredményre ;)

Ja és mégvalami: picture_manipulate.php -be az utolsó sorba írd mád be légyszi azt hogy :

echo("SUCCESS: ".$fajl." => ".date("Y-m-d H:i:s"));
14

szenvedek...

sUTy · 2007. Dec. 20. (Cs), 10.43
Helló!

Elvégeztem a változtatásokat, de így sem akarja az igazságot.
Nemtom, mi lehet a baj.
15

Szimpla php

anton · 2007. Dec. 20. (Cs), 11.05
Véleményem szerint azt kellene csinálnod, hogy ellenőrzöd a bélyegkép meglétét...
Tehát amikor az oldalnak szüksége lenne a képre, de az nincs, akkor hozza létre.
Így a lapnak csak 1-2 képet kell legenerálni, ami belefér az időbe.
16

sok volna

sUTy · 2007. Dec. 20. (Cs), 11.43
az a baj, hogy egyszerre 4-500 képről van szó és egyszerre kb 1-2 bélyegképet készít el, utána fatal error a set_time_limit() miatt,
17

MŰKÖDIK EZT MÁSOLD BE

ppshungary · 2007. Dec. 20. (Cs), 11.54
legyen egy ilyen könyvtárstruktúra:

kepek/ide_fogja_a_program_masolni_a_manipulalt_kepeket
kepek/ide_tolti_fel_ftp_vel_a_megrendelo_a_kepeket

picture_manipulate.php //egy kicsit módosítva
  1. <?php  
  2. $honnan = "kepek/ide_tolti_fel_ftp_vel_a_megrendelo_a_kepeket/";  
  3. $hova ="kepek/ide_fogja_a_program_masolni_a_manipulalt_kepeket/";  
  4. $fajl = $_GET["filename"];  
  5.   
  6. /////// méret lekérdezése ///////  
  7. $size = getimagesize($honnan.$fajl);  
  8. $x = $size[0];  
  9. $y = $size[1];  
  10.   
  11. /////// bélyegkép elkészítése ///////  
  12.   
  13. $create_1 = imagecreatefromjpeg($honnan.$fajl);  
  14. $arany_1 = $y/150;  
  15. $new_x_1 = ceil($x/$arany_1);  
  16. $new_y_1 = ceil($y/$arany_1);  
  17. $x_1 = $x;  
  18. $y_1 = $y;  
  19.   
  20. $tn = $hova."_".strtolower($fajl);  
  21. $tn_kep = imagecreatetruecolor($new_x_1,$new_y_1);  
  22.   
  23. imagecopyresampled($tn_kep$create_1, 0, 0, 0, 0, $new_x_1$new_y_1$x_1$y_1);  
  24. imagejpeg($tn_kep,$tn,75);  
  25. imagedestroy($create_1);  
  26.   
  27. echo("SUCCESS: ".$tn."<br>");  
  28. ?>  
test.php //egy kicsit módosítva
  1. <?php  
  2. $ftp_directory="kepek/ide_tolti_fel_ftp_vel_a_megrendelo_a_kepeket";  
  3. $picture_script="picture_manipulate.php";  
  4. $jstombnev="filetmb";  
  5. $files="var ".$jstombnev."= new Array();\n";  
  6.   
  7. if ($k_azon = opendir($ftp_directory))  
  8.         {  
  9.         while (false !== ($fajl = readdir($k_azon)))  
  10.                 {  
  11.                 if ($fajl != "." && $fajl != "..")  
  12.                         {  
  13.                         $files.=$jstombnev.".push('".$fajl."');\n";  
  14.                         }  
  15.                 }  
  16.         closedir($k_azon);  
  17.         }  
  18.   
  19. $output="  
  20. <html>  
  21. <head>  
  22. <script src='http://www.ajaxtoolbox.com/request/compact/AjaxRequest.js'></script>  
  23. <script>  
  24.   
  25. function simple_send(item)  
  26. {  
  27. AjaxRequest.get(  
  28.         {  
  29.         'url':'".$picture_script."',  
  30.         'parameters':{'filename':item},  
  31.         'onSuccess':function(req)  
  32.                 {  
  33.                 document.getElementById('output_div').innerHTML+=req.responseText+'<br>';  
  34.                 },  
  35.         'onError':function(req)  
  36.                 {  
  37.                 document.getElementById('output_div').innerHTML+='ERROR: '+item+'<br>';  
  38.                 }  
  39.         });  
  40. }  
  41.   
  42. function allfiles(files)  
  43. {  
  44. for(var i=0;i<files.length;i++)  
  45.         {  
  46.         simple_send(files[i]);  
  47.         }  
  48. }  
  49.   
  50. ".$files."  
  51.   
  52. </script>  
  53. </head>  
  54. <body onload='javascript:allfiles(filetmb);'>  
  55. <div id='output_div'>Kimenet:<br></div>  
  56. </body>  
  57. </html>";  
  58. die($output);  
  59. ?>  
18

Köszi!

sUTy · 2008. Jan. 11. (P), 10.12
Kedves ppshungary!

Köszönöm a segítséget! Működik.
Bocsánat, hogy csak most válaszolok. Volt menet közben egy téli szünet és egy betegállomány, csak most tudtam a dologgal foglalkozni.

Üdv: suty
5

Forward

sajt · 2007. Dec. 17. (H), 16.24
Ezt ugy lehet megoldani, hogy minden kep utan ujratolteted vele az oldalt.