Php : bonne méthode pour redimensionner des photos par lot

Bonjour,

Pour un site web écrit en php j’ai besoins de redimensionner des photos par lot pour en faire des miniatures.
J’utilise pour celà imagick (bibliothèque image magick pour php) de la manière suivante :

$image = new Imagick($path]); $image->thumbnailImage($width, $height); $image->writeImage($path_preview); $image->destroy();

Si je rentre ces lignes de code telles quelles dans mon script pour une image à redimensionner ça marche parfaitement, mais, mon script scanne le contenu d’un répertoire et doit redimensionner toutes les images qui s’y trouvent pour en faire une galerie. Il peut y en avoir jusqu’à 100. J’ai essayé de faire une boucle pour chaque image trouvée. Le problème c’est que l’exécution se lance dans un seul thread, dure très longtemps (une dizaine de minute) ce qui n’est pas compatible avec le temps maximum d’exécution d’un script php. J’ai modifié en local mon php.ini mais si je veux distribuer mon logiciel ça ne sera pas possible pour tout le monde. De plus avec cette méthode si le client est déconnecté la génération des aperçus s’arrête, ce qui n’est pas le comportement souhaité.

Partant de ça j’ai essayé de lancer chaque redimensionnement dans un nohup, toujours en bouclant sur les résultats du scan du dossier :

Là plus de problème de temps d’exécution du script, mais je me retrouve avec autant de thread lancés que d’images, et il faut croire que 70 threads la machine n’a pas aimée, même avec le nice (freeze complet de l’interface, j’ai du forcer le reboot au bout de 30 minutes…).

J’ai pensé aussi à lancer les requêtes de redimensionnement en ajax depuis le client mais je me retrouve toujours avec le problème si le client est déconnecté.

Avez vous une idée de la bonne méthode pour redimensionner ces images par lot, sans surcharger le serveur et sans craindre les déconnections du client ?

Merci à vous.

PS: Excusez la longueur du post, je commence seulement à développer et j’ai du mal à tout exprimer de manière concise.

Bonjour,

je ne comprends pas très bien ton problème, et j’ai l’impression qu’en fait tu viens de rendre compliqué quelque chose de relativement simple à la base.
Alors déjà, moi je vais déjà te parler du côté “performances” de la chose : envoyer un thread par image, c’est beaucoup trop.

Je pense que la meilleure solution est d’effectuer le redimensionnement en PHP, et si tu n’as pas envie d’utiliser la librairie Imagick, c’est très simple de faire cela soi-même. Voici un exemple : http://www.xxxx///Lien cassé///xxxx.com
Sur le site internet, dans les produits, tu pourras voir des photos miniatures des produits. Chaque miniature est redimensionnée et coupée en PHP pour qu’elles forment un carré.

Tu pourras trouver un exemple de redimensionnement / cropping à cette adresse : http://stackoverflow.com/questions/1855996/crop-image-in-php

J’espère que cela t’aura aidé!

Edit de LOL: Lien commercial viré.

Tu as tout à fait raison. Pour gérer cela il faut commencer à découper ton appli en 2 parties : un frontend pour l’affichage et un backend pour les traitement lourd/utilisateur déconnecté.

Je maitrise bien les techno java pour faire et moins les autres, mais je sais que tu as pas mal de choix. Il faut commencer par te créer des contraintes (pour pouvoir choisir) :

  • est-ce que tu veut une barre de chargement ?
  • préfères-tu utiliser PHP des deux cotés ou plutôt passer par un autre langage pour ton backend ?
  • as-tu un accès root au serveur ?

Après les solutions vont de 0mq à redis (via un publish/subscribe) par exemple. L’idée étant que ton front envoie un message au back qui déclenchera les traitements (tu peut les paralléliser comme tu le souhaite ensuite). C’est du boulot, mais je pense que c’est intéressant. Je te laisse chercher ce que tu préfère (maintenant que tu sais que tu as besoin d’un backend).

N’hésite pas à venir nous expliquer la solution que tu as choisi.

Tu fais du placement commercial ?

Salut,

Merci, lien dégagé. :006