Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Images > GD
GD Forum d'entraide pour l'extension GD permettant de manipuler des images en PHP. Avant de poster -> tutoriels GD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/04/2007, 20h16   #1
Membre à l'essai
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 22
Points : 22
Par défaut Problème de boucle pour redimensionner plusieurs images ...

Bonjour,

voici ma boucle qui traite tous les fichiers du tableau $tab_online:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
 
for($i=0; $i<count($tab_online); $i++) 
{ 
 
$src = "http://mon.site.com/".str_replace(" ", "%20", $tab_online[$i]); 
 
if (substr($src, -3) == "jpg") 
{ 
 
$img = imagecreatefromjpeg($src); 
$size = getimagesize($src); 
 
$max_width = 800; 
$max_height = 600; 
 
$width = $size[0]; 
$height = $size[1]; 
 
if ( $width > $height ) 
{ 
 
$dst_height = $height * $max_width / $width; 
$dst_width = $max_width; 
 
} 
else 
{ 
 
$dst_width = $width * $max_height / $height; 
$dst_height = $max_height; 
} 
 
$dst = imagecreatetruecolor(round($dst_width), round($dst_height)); 
$dst_thumbs = imagecreatetruecolor(round($dst_width * 25 / 100), round($dst_height * 25 / 100)); 
 
imagecopyresampled($dst, $img, 0, 0, 0, 0, round($dst_width), round($dst_height), $width, $height); 
 
imagecopyresampled($dst_thumbs, $img, 0, 0, 0, 0, round($dst_width * 25 / 100), round($dst_height * 25 / 100), $width, $height); 
 
imagejpeg($dst, "../../photos/".$new_dir."/".$i.".jpg"); 
imagejpeg($dst_thumbs, "../../photos/".$new_dir."/thumbs/".$i.".jpg"); 
 
imagedestroy($img); 
imagedestroy($dst); 
imagedestroy($dst_thumbs); 
 
}
Si je la laisse comme ça, le serveur me retourne:
Fatal error: Maximum execution time of 30 seconds exceeded in /home ...
et une partie des photos n'est pas traitée.

Si j'ajoute set_time_limit(300); pour repousser le timeout à 5 min, l'erreur ne s'affiche pas mais l'opération n'aboutie pas non plus...

En isolant avec des 'echo' avant et après les fonctions, puis en chronométrant la vitesse d'éxécution des fonctions: il se trouve que l'application bloque au niveau de "imagecopyresampled" mais jamais sur la même image. Ce qui exclu le problème de la source.

J'ai essayé de mettre un sleep(1); dans la boucle pour ralentir l'éxécution au càs où le problème viendrait du fait que l'appli s'emballerait.
J'ai aussi essayé avec une "function" ...

Rien à faire...

Ce que je ne comprend pas c'est le timeout...
avec une simple boucle
for($i=0; $i<100; $i++)
{
sleep(1); // pause d'1sec à chaque itération
}

l'application doit donc durer 100 sec. Eh bien là, pas de Fatal error: Maximum execution time of 30 seconds exceeded in /home ...


Pour info je suis sur un 90plan de chez OVH

Merci pour les infos...
jimmyneutron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2007, 01h08   #2
Membre chevronné
 
Inscription : mai 2005
Messages : 657
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 657
Points : 722
Points : 722
Salut,

Citation:
l'application doit donc durer 100 sec. Eh bien là, pas de Fatal error: Maximum execution time of 30 seconds exceeded in /home ...
L'explication est simple :
La fonction set_time_limit() et la directive de configuration max_execution_time n'affectent que le temps d'exécution du script lui-même. Tout temps passé en dehors du script, comme un appel système utilisant system(), des opérations sur les flux, les requêtes sur base de données, etc. n'est pas pris en compte lors du calcul de la durée maximale d'exécution du script. (cf. http://www.php.net/set_time_limit)

Or sleep() n'est pas considéré comme du temps d'exécution je pense


Pour ton script, une solution serait de diviser l'exécution entre plusieurs appels, puisque apparement ça passe bien avec une seule image.
Taum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2007, 09h53   #3
Membre à l'essai
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 22
Points : 22
Citation:
sleep() n'est pas considéré comme du temps d'exécution je pense
c'est aussi ce que je pense... alors que pourtant le faite de faire une pause ne peut-être considéré comme un échange de flux ou une opération effectuée en dehors du script...

Citation:
Pour ton script, une solution serait de diviser l'exécution entre plusieurs appels, puisque apparement ça passe bien avec une seule image
c'est ce que j'ai essayé de faire avec 2 ex:
1) avec sleep() je pensais que l'appli ne serait pas surchargé... et prendrait le temps... queneni !
2) avec un appel à une fonction et une boucle avec un sleep() pour faire comme au dessus mais en plus léger... queneni !

je ne vois pas comment faire autrement ... si je bloque à 100 photos 800x600 ça marche... mais je ne vois pas comment passer les autres facilement, sans action de l'utilisateur...

ce qui me gonfle c'est que le page s'arrête sans erreur (à condition d'avoir un set_time_limit(300);

vu que imagecopyresampled reourne true ou false je me suis dit que je pourrais mettre:

while(!imagecopyresampled($dst, $img, 0, 0, 0, 0, round($dst_width), round($dst_height), $width, $height))
{
sleep(1);
}

ca ne fait rien de plus...

et même :

imagecopyresampled($dst, $img, 0, 0, 0, 0, round($dst_width), round($dst_height), $width, $height) or die ("Error");

ne retourne rien...

on dirait que le serveur abandonne l'opération en cours de route...
jimmyneutron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2007, 17h46   #4
Membre à l'essai
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 22
Points : 22
réponse de la hotline:

Bonjour,

dans notre environnement cette variable n'a pas d'effet, nous avons des robots qui check en continu l'execution des scripts.

(au sujet du set_time_limit(); )

donc solution découper le programme en plusieurs partie pour retailler de 50 images en 50 ou moins ...

++
jimmyneutron est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h26.


 
 
 
 
Partenaires

Hébergement Web