Trop de redirections

lux
Eléphant du PHP | 372 Messages

12 oct. 2008, 11:31

Bonjour !

J'ai un petit problème. Je suis chez 1and1, et le temps d'exécution est limité à 30 secondes. Je suis en train de créer une galerie, et donc quand mon script redimensionne les images, il va bien lui falloir 5-10 minutes.

Donc, en creusant un peu, j'ai découpé mon script, avec un paramètre time(). Si je dépasse 20 secondes d'éxécution, je fais un header("Location:galerie.php"); et je reprends le script la ou ça s'était arrêté.

Ça marche très bien, je suis à 5 minutes d'exécution sans m'arrêter ! Mais problème, après ces 5 minutes, c'est le browser qui ne veut plus. Que ce soit Safari ou Firefox, ils me disent :
Trop de redirections sont survenues en tentant d’ouvrir « galerie.php ». Ceci peut se produire lorsque vous ouvrez une page qui est redirigée vers une autre page laquelle se redirige à son tour vers la page originale.
Et la je coince, comment pourrais-je contourner cette limitation ? Lui dire que je recharge bien la page et que tout va bien ?

Si qqn à une idée ? Merci d'avance ! :wink:

ViPHP
ViPHP | 4674 Messages

12 oct. 2008, 13:18

Hey :),

Ta solution est une sorte de grosse bidouille bien crade :roll:. Je pense qu'il existe un paramètre dans le php.ini qui te permet justement de modifier le temps d'exécution de ta page. Tu devrais y jeter un œil :).

Note, encore faut-il que tu aies accès à ton php.ini …
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

lux
Eléphant du PHP | 372 Messages

12 oct. 2008, 13:24

Note d'après leur FAQ
Due to resource limits on our Shared Hosting machines, it is not possible to allocate more than 20M
of memory to PHP, although phpinfo() may report a higher number. You will be unable to increase
the memory usage limit with a php.ini file.
Même chose pour le timelimit, j'ai essayé de le changer, après 30 secondes il plante en erreur 500.

Donc c'est le seul moyen que j'ai trouvé, sinon y a encore au moins 8 mois d'abonnement sur ce serveur, ça me ferait chier de devoir juste changer à cause de ça.

Et oui c'est vrai c'est une bidouille bien crade :P

ViPHP
ViPHP | 4674 Messages

12 oct. 2008, 13:33

Aïe, si tu es limité, ce n'est pas simple.
Ta solution n'est pas la bonne à mon avis car c'est le navigateur qui va décider s'il y a trop de redirections ou non. Tu ne peux pas trop y faire grand chose (ça ne reste que mon avis).

Si tu ne peux pas modifier la durée d'exécution des scripts, ni la mémoire, je pense que tu es coincé. Soit tu délègues le travail à une application tierce, mais si tu ne peux pas modifier le php.ini, je doute fortement que tu puisses installer des applications tierces sur la machine :P. Soit … bah je ne vois pas. J'ai déjà du mal à voir comment tu arrives à refaire prendre le traitement de ton script là où il s'était arrêter. On peut voir ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

lux
Eléphant du PHP | 372 Messages

12 oct. 2008, 13:41

:P

Il est bien long mon code, car pour chaque image, je permets l'ajout d'un titre, et une description, tout ça en 3 langues pour chaque image, plus redimensionnement de l'image et du thumbnail. (les images sont uploadées par FTP avant l'exécution).

Pour savoir comment j'ai fait, c'est pas dur :

J'ai un array qui contient les images, je fais un foreach. Au debut du foreach, je déclare un time(). Dans chaque boucle du foreach je vérifie si la différence de temps n'a pas dépassé 20 secondes. Si elle dépasse, je fais un header("Location:galerie.php?pause=do");exit; et je mets toutes les données dans une SESSION (array, et surtout le $i (compteur)).

Je reprends le script sur la même page, juste en reprenant les données dans la SESSION, donc je récupère l'endroit ou je m'arrêtais, et je relance le foreach au bon endroit. Rien de bien compliqué, ça me permets de faire 5 minutes d'exécution au lieu de 30 secondes.

Bon, je dois encore optimiser légèrement les accès à la BDD, mais c'est surtout le redimensionnement des images qui ralentit le truc ... Je sais que je peux encore optimiser, mais je sais que si je dois traiter 300 photos, même en optimisant, je dépasserai facilement les 5 minutes. :wink: :wink:

ViPHP
ViPHP | 4674 Messages

12 oct. 2008, 13:53

Quelles sont les contraintes ?
Est-ce que l'utilisateur doit voir ses photos de suite ? Est-ce que tu as des tâches crons ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

lux
Eléphant du PHP | 372 Messages

12 oct. 2008, 14:00

Alors, heu, bah ce serait bien que une fois qu'il lance le script, la galerie mette pas 2 jours à être faire :P .

Sinon, je n'ai pas accès aux cron-jobs, c'est l'Hosting "Beginner" :P

(P.S. le site est pas pour moi, sur mon serveur infomaniak ça tourne aux petits oignons sans cette bidouille).

Au passage, j'ai retesté plusieurs fois, le serveur n'a pas l'air super stable non plus, il plante après 2-3 minutes aléatoirement ... :?

FJA
Invité n'ayant pas de compte PHPfrance

12 oct. 2008, 18:47

Humm… je pense que si tu passe par AJAX pour gérer ton script ca devrai être bon :
  • Tu envoie un 1ere requete avec le nombre d'image à traiter
  • Et ensuite tu envoie un requete pour demander le traitement d'une image
  • Ensuite tu récupère le message comme quoi l'image a fini d'être traité
  • Tu envoie une requete pour passer à l'image suivante
  • et ainsi de suite
L'avantage c'est que tu peut avoir un aprecu direct de l'évolution du traitement et que le script PHP ne fonctionne que pendant la durée d'une image

ViPHP
ViPHP | 4674 Messages

12 oct. 2008, 21:01

L'avantage c'est que si le client n'a pas Javascript, il ne pourra jamais traiter les images, c'est bien aussi remarque.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

lux
Eléphant du PHP | 372 Messages

12 oct. 2008, 21:06

Ha non, pas de bagarre Javascript-Pas Javascript ici, je vous l'interdis ! :P

Perso je préférerai une solutions sans, mais la je vois vraiment pas d'alternative.

Mammouth du PHP | 2937 Messages

13 oct. 2008, 14:13

Ton script est-il suffisamment optimisé pour libérer de la ressource mémoire ?

ViPHP
ViPHP | 3300 Messages

13 oct. 2008, 14:15

J'ai un array qui contient les images, je fais un foreach. Au debut du foreach, je déclare un time(). Dans chaque boucle du foreach je vérifie si la différence de temps n'a pas dépassé 20 secondes. Si elle dépasse, je fais un header("Location:galerie.php?pause=do");exit; et je mets toutes les données dans une SESSION (array, et surtout le $i (compteur)).

Je reprends le script sur la même page, juste en reprenant les données dans la SESSION, donc je récupère l'endroit ou je m'arrêtais, et je relance le foreach au bon endroit. Rien de bien compliqué, ça me permets de faire 5 minutes d'exécution au lieu de 30 secondes.

Bon, je dois encore optimiser légèrement les accès à la BDD, mais c'est surtout le redimensionnement des images qui ralentit le truc ... Je sais que je peux encore optimiser, mais je sais que si je dois traiter 300 photos, même en optimisant, je dépasserai facilement les 5 minutes. :wink: :wink:
un array trop gros en php -> mangeage de ram pertes dramatiques de perf. met ton code directement dans le while($res = mysqli_fetch_assoc($qry)) que tu dois avoir quelquepart et je te parie que tu va beaucoup gagner en temps et en ram.
Fait du php depuis que ca existe ou presque :)

lux
Eléphant du PHP | 372 Messages

13 oct. 2008, 16:46

Heu j'ai aucun while, je lis pas des données de ma base de donnée.

Je liste dans un array les chemins vers toutes les photos dans un dossier FTP, et je boucle dessus avec foreach. Pour chaque lien je crée un thumbnail et je redimensionne la photo.
Juste ces 2 opérations, avec 70 photos, il me faut 5 minutes.

(et la j'ai pas encore traité les données relatives à chaque texte associées à une photo (donc insert en bdd).

ViPHP
ViPHP | 4674 Messages

13 oct. 2008, 18:37

C'est là le problème : il ne faut pas traiter les 70 photos d'un coup ; même Photoshop a du mal, alors PHP …

Il faut que — dans ton contexte — tu trouves un moyen de traiter des paquets (ou lots) d'images plus petits, i.e. en plus petites quantités à la fois.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

lux
Eléphant du PHP | 372 Messages

13 oct. 2008, 18:53

Ce que j'essayais de faire justement, en découpant le script en petits bouts.

Mais bon je crois que je vais me pencher sur la solution Ajax, c'est pour une partie Admin, donc je préciserai bien au client qu'il faut activer Javascript :P