[PHP] Problème Boucle redimensionner plusieurs images ...

Eléphanteau du PHP | 12 Messages

04 avr. 2007, 20:07

Bonjour,

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

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...

Mammouth du PHP | 804 Messages

04 avr. 2007, 21:05

je pense que ton serveur est limité sur les requete d'une page

Eléphanteau du PHP | 12 Messages

04 avr. 2007, 21:29

peut-être ...

mais je ne comprend pas pourquoi ce script fonctionne,
<?php
set_time_limit(1);
for($i=0; $i<11; $i++)
{
sleep(1);
}
?>

set_time_limit() fixe le délai d'expiration d'un script, en secondes. Si cette limite est atteinte, le script s'interrompt, et renvoie une erreur fatale.

Ce qui veut dire que sleep() arrête aussi le temps ... mais ce n'est pas précisé: sleep(x) retarde l'exécution du programme pendant x secondes...

++

Mammouth du PHP | 804 Messages

05 avr. 2007, 00:21

set_time_limit(0);

tu as essayé ?? je te dis peu être une bêtise mais ca te donne pas le no limite ? et ne devrais tu pas la mettre au debut de ton code ?

de plus ca fonctionne que avec le safe mode , l'as tu ?

Eléphanteau du PHP | 12 Messages

05 avr. 2007, 09:42

set_time_limit(0); revient à ne pas donner de limite au temps d'execution de la boucle, je préfère donc limiter à 600 sec au cas où...

cette fonction marche très bien puisque si je l'enlève j'ai une erreur fatale au bout de 30 sec. et puis la mettre en début de code revient au même.

Le safe_mode a été supprimé à partir de PHP 6.0.0.

ce qui est étrange c'est que lorsque l'appli fonctionne (pour environ 100 photos 800x600) mon script s'éxécute jusqu'au bout.
alors que quand il échoue, la page ne retourne pas d'erreur (pourtant je n'ai pas d'@ devant mes fonctions) ... la page se recharge mais conserve l'URI de l'étape précédente... donc l'affichage n'est pas correcte...

ce que je ne comprend pas c'est pourquoi sans le set_time_limit(); l'appli bloque au bout de 30sec (comme prévu par défaut) alors que lorsque j'intègre des " echo(date("i:s")); " à chaque itération ... la boucle tourne pendant 37 sec...

Mammouth du PHP | 505 Messages

05 avr. 2007, 10:54

Peut etre un pb de limite mémoire...
Check les log d'erreur apache, php et system..
t 'as ptet tout simplemetn un segfault....

Eléphanteau du PHP | 12 Messages

05 avr. 2007, 11:05

[code]Peut etre un pb de limite mémoire...
Check les log d'erreur apache, php et system..
t 'as ptet tout simplemetn un segfault....[/code]

je ne vois pas trop comment faire...

avec des fonctions php qui interroge les logs d'apache etc... ???

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

05 avr. 2007, 11:36

je pense aussi que c'est un problème de bufferisation, essaye de cadencer l'envoi du buffer de sortie dans ta boucle en utilisant les commandes ob_start et flush
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 505 Messages

05 avr. 2007, 11:53

bah non :) perso j'utilise less, more ou tail mais tu peux utiliser ce que tu veux...
le but c'est de trouver pourquoi ca s'arrete brutalement. Ca se fait via un shell, pas en php...

En revanche sous php, tu peux déjà soit mettre dans le php ini implicit_flush = On ou a la fin de chaque boucle, appeler un flush() histoire de voir au moins ce qui s'est passé jusque là.

Eléphant du PHP | 170 Messages

05 avr. 2007, 12:00

Ce qui veut dire que sleep() arrête aussi le temps ... mais ce n'est pas précisé: sleep(x) retarde l'exécution du programme pendant x secondes...
La fonction sleep n'agit pas sur le timeout()
Le timeout est une directive qui stipule une limite raisonnable au-delà de laquelle un script est sensé avoir été correctement exécuté, ceci pour éviter les surcharge sur le serveur.
Benjamin Franklin a dit :
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends

Eléphanteau du PHP | 12 Messages

06 avr. 2007, 13:56

j'ai regardé les logs ... rien d'anormal ... alors peut-être que je ne les ai pas bien interprétés, ou que je n'ai pas tout de disponible...

pour la bufferisation. je ne connaissais pas. j'ai regardé le manuel php, j'ai essayé selon vos indications mais rien à faire... l'erreur est toujours la même... le script bloque toujours au bout d'environs 70 itérations ou 150 si je retire la création des 'thumbs', et toujours sur la première ligne de la fonction 'imagecopyresampled' ...

en bloquant les ressources de mémoire, ini_set("memory_limit" , "16K");, idem...

donc je ne vois pas ... peut-être pouvez-vous me dire comment vous voyez le script avec les flush();

++

merci

Eléphanteau du PHP | 12 Messages

06 avr. 2007, 15:29

ca ne viendrait pas de la capacité du dossier temporaire du ftp ...
je sais qu'on imagedestroy à chaque itération... mais il faut quand même du temps au serveur pour éxécuter les opérations ftp demandée par apache

j'ai envoyé un mail à ovh j'attends d'en savoir plus ...

Eléphant du PHP | 170 Messages

06 avr. 2007, 17:55

Pour info je suis sur un 90plan de chez OVH
Et tu penses vraiment qu'avec du mutalisé, OVH va te laisser faire ce que tu veux sur la config ???? 8-)
Ne rêves pas, c'est pas avec 3,71€/mois que tu vas pouvoir bénéficier d'une config le permettant, du moins je ne le penses pas.

En fait tu veux rouler en Porche alors que tu as juste les moyens pour un scooter. :wink:

Tiens juste par curiosité, quelle valeur pour les directives :
max_execution_time
safe_mode
sur ton plan ovh ? :?
Benjamin Franklin a dit :
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends

Invité
Invité n'ayant pas de compte PHPfrance

06 avr. 2007, 20:23

En fait tu veux rouler en Porche alors que tu as juste les moyens pour un scooter.
:lol:
... par expérience ce n'est pas forcément avec les services onéreux qu'on obtient le meilleur résultat ... on tourne 100 fois mieux avec ce pack à moins de 4€, qu'avec l'ancien dédié d'Amen qui était 25 fois plus cher ... mais bon je comprends ce que tu veux dire ...

ça ne me dérange pas de passer à une gamme haut dessus ... mais si on peut résoudre le problème autrement ça m'éviterait pas mal de boulot superflu...

safe_mode : off
max_execution_time : 30
valeurs par défaut d'après la doc...

c'est une version PHP 4.4.4 (j'espère que le pb ne vient tout simplement pas de là ?!?)

Eléphant du PHP | 170 Messages

07 avr. 2007, 00:00

... par expérience ce n'est pas forcément avec les services onéreux qu'on obtient le meilleur résultat ...
Ce n'est pas ce que j'ai dit !
Je veux juste te signaler qu'OVH ne va pas te donner les privilèges d'un serveur dédié à moins de 4 €/mois.

De plus, je te l'ai dit ton script est gourmand en ressource, d'autres que toi font pareil, à tous les points de vue.
Je vois mal OVH accepter cela.
Je penses donc que tu es face à une config bridée de manière à ne pas permettre des modifs intempestives réalisée à la volée par les possesseurs de plan A, B ou C :wink:
Benjamin Franklin a dit :
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends