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.
<?php
$ftp_directory="uploaded_files";
$picture_script="picture.php";
$jstombnev="filetmb";
$files="var ".$jstombnev."= new Array();\n";

if ($k_azon = opendir($ftp_directory))
        {
        while (false !== ($fajl = readdir($k_azon)))
                {
                if ($fajl != "." && $fajl != "..")
                        {
                        $files.=$jstombnev.".push('".$ftp_directory."/".$fajl."');\n";
                        }
                }
        closedir($k_azon);
        }

$output="
<html>
<head>
<script src='http://www.ajaxtoolbox.com/request/compact/AjaxRequest.js'></script>
<script>

function simple_send(item)
{
AjaxRequest.get(
        {
        'url':'".$picture_script."',
        'parameters':{'filename':item},
        'onSuccess':function(req)
                {
                document.getElementById('output_div').innerHTML+=req.responseText+'<br>';
                },
        'onError':function(req)
                {
                document.getElementById('output_div').innerHTML+='ERROR: '+item+'<br>';
                }
        });
}

function allfiles(files)
{
for(var i=0;i<files.length;i++)
        {
        simple_send(files[i]);
        }
}

".$files."

</script>
</head>
<body onload='javascript:allfiles(filetmb);'>
<div id='output_div'>Kimenet:<br></div>
</body>
</html>";
die($output);
?>
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:

<?php  
$ftp_directory= "kepek/nyerskepek/".$_POST["eztnyit"];   
$picture_script = "admin/picture_manipulate.php";   
$jstombnev = "filetmb";   
$files = "var ".$jstombnev."= new Array();\n";   

$k_azon = opendir($ftp_directory);   
         
        while (false !== ($kep_fajl = readdir($k_azon)))   
                {   
                if ($kep_fajl != "." && $kep_fajl != ".." && $kep_fajl != "tn" && $kep_fajl != "norm")   
                        {   
                        $files.=$jstombnev.".push('".$ftp_directory."/".$kep_fajl."');\n";   
						}   
                }   
        closedir($k_azon);   
           
  
$output= $files."  
<html>  
<head>  
<script src='js/AjaxRequest.js'></script>  
<script>  
 
function simple_send(item)  
{  
AjaxRequest.get(  
        {  
        'url':'".$picture_script."',  
        'parameters':{'filename':item},  
        'onSuccess':function(req)  
                {  
                document.getElementById('output_div').innerHTML+=req.responseText+'<br>';  
                },  
        'onError':function(req)  
                {  
                document.getElementById('output_div').innerHTML+='ERROR: '+item+'<br>';  
                }  
        });  
}  
 
function allfiles(files)  
{  
for(var i=0;i<files.length;i++)  
        {  
        simple_send(files[i]);  
        }  
}  
 
".$files."  
 
</script>  
</head>  
<body onload='javascript:allfiles(filetmb);'>  
<div id='output_div'>Kimenet:<br></div>  

</body>  
</html>"; 
die($output);  
?>  
és a picture_manipulate.php:

<?
$hova = "kepek/nyerskepek/".$_POST["eztnyit"];
$fajl = $_POST["filename"];
				
/////// méret lekérdezése ///////
$size = getimagesize($hova."/".$fajl);
$x = $size[0];
$y = $size[1];

/////// bélyegkép elkészítése ///////
		
$create_1 = imagecreatefromjpeg($hova."/".$fajl);
$arany_1 = $y/150;
$new_x_1 = ceil($x/$arany_1);
$new_y_1 = ceil($y/$arany_1);
$x_1 = $x;
$y_1 = $y;

$tn = $hova."/tn/tn_".strtolower($fajl);
$tn_kep = imagecreatetruecolor($new_x_1,$new_y_1);

imagecopyresampled($tn_kep, $create_1, 0, 0, 0, 0, $new_x_1, $new_y_1, $x_1, $y_1);
imagejpeg($tn_kep,$tn,75);
imagedestroy($create_1);

/////// normál kép elkészítése ///////
	
$create_2 = imagecreatefromjpeg($hova."/".$fajl);
$arany_2 = $y/600;
$new_x_2 = ceil($x/$arany_2);
$new_y_2 = ceil($y/$arany_2);
$x_2 = $x;
$y_2 = $y;
			
$norm = $hova."/norm/".strtolower($fajl);
$norm_kep = imagecreatetruecolor($new_x_2,$new_y_2);
	
imagecopyresampled($norm_kep, $create_2, 0, 0, 0, 0, $new_x_2, $new_y_2, $x_2, $y_2);
imagejpeg($norm_kep,$norm,75);
imagedestroy($create_2);

/////// vízjel elkészítése ///////

$img = $hova."/norm/".$fajl;
$norm = $hova."/norm/".strtolower($fajl);
$watermark = imagecreatefrompng('watermark/watermark_2.png');  
$watermark_width = imagesx($watermark);  
$watermark_height = imagesy($watermark);  
$image = imagecreatetruecolor($watermark_width, $watermark_height);  
$image = imagecreatefromjpeg($img);  
$size = getimagesize($img);  
$dest_x = $size[0] - $watermark_width;  
$dest_y = $size[1] - $watermark_height;  
$felirat_x = 15;
$felirat_y = $size[1] - 18;
$font_size = 20
$textcolor = imagecolorallocatealpha($image, 221, 221, 221, 10); 
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 50); 
imagettftext ( $image, $font_size, 0, $felirat_x, $felirat_y, $textcolor, "watermark/alap.ttf", "oldal címe ".date("Y") );
		

imagedestroy($image);  
imagedestroy($watermark);

unlink($hova."/".$fajl);
?>		
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

<?php
$honnan = "kepek/ide_tolti_fel_ftp_vel_a_megrendelo_a_kepeket/";
$hova ="kepek/ide_fogja_a_program_masolni_a_manipulalt_kepeket/";
$fajl = $_GET["filename"];

/////// méret lekérdezése ///////
$size = getimagesize($honnan.$fajl);
$x = $size[0];
$y = $size[1];

/////// bélyegkép elkészítése ///////

$create_1 = imagecreatefromjpeg($honnan.$fajl);
$arany_1 = $y/150;
$new_x_1 = ceil($x/$arany_1);
$new_y_1 = ceil($y/$arany_1);
$x_1 = $x;
$y_1 = $y;

$tn = $hova."_".strtolower($fajl);
$tn_kep = imagecreatetruecolor($new_x_1,$new_y_1);

imagecopyresampled($tn_kep, $create_1, 0, 0, 0, 0, $new_x_1, $new_y_1, $x_1, $y_1);
imagejpeg($tn_kep,$tn,75);
imagedestroy($create_1);

echo("SUCCESS: ".$tn."<br>");
?>

test.php //egy kicsit módosítva


<?php
$ftp_directory="kepek/ide_tolti_fel_ftp_vel_a_megrendelo_a_kepeket";
$picture_script="picture_manipulate.php";
$jstombnev="filetmb";
$files="var ".$jstombnev."= new Array();\n";

if ($k_azon = opendir($ftp_directory))
        {
        while (false !== ($fajl = readdir($k_azon)))
                {
                if ($fajl != "." && $fajl != "..")
                        {
                        $files.=$jstombnev.".push('".$fajl."');\n";
                        }
                }
        closedir($k_azon);
        }

$output="
<html>
<head>
<script src='http://www.ajaxtoolbox.com/request/compact/AjaxRequest.js'></script>
<script>

function simple_send(item)
{
AjaxRequest.get(
        {
        'url':'".$picture_script."',
        'parameters':{'filename':item},
        'onSuccess':function(req)
                {
                document.getElementById('output_div').innerHTML+=req.responseText+'<br>';
                },
        'onError':function(req)
                {
                document.getElementById('output_div').innerHTML+='ERROR: '+item+'<br>';
                }
        });
}

function allfiles(files)
{
for(var i=0;i<files.length;i++)
        {
        simple_send(files[i]);
        }
}

".$files."

</script>
</head>
<body onload='javascript:allfiles(filetmb);'>
<div id='output_div'>Kimenet:<br></div>
</body>
</html>";
die($output);
?>




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.