Bonjour,

Je suis en fin de dev. d'un module ou je pourrais ajouter des voitures a vendre.
Chaque voitures peut avoir X images..

Les liens entre les models sont fait et ok.

Le code fonctionne a un point pret...

L'upload d'une ou plusieurs petites images ce passe tres bien. La page est rechargé en quelques petites secondes, les images sont redimensionnées en 2 tailles, dans leurs bons répertoires, etc...

Mon probleme est que, des que j'envoi une image en .jpg de 4Mo (et non, pas possible de redimensionner avant), le tout ce passe bien MAIIIIISSSSSS, le traitement prend entre 20 et 30 secondes par image, minimum...

L'idée est de pouvoir traiter plusieurs images en même temps.
J'ai testé avec 20 images... On arrive a plus de 10minutes avant que je site soit accessible.
(test chronometré :) )

Pour ce faire, j'utilise:

  • Laravel 5.4
  • Intervension Image
  • Apache
  • Un serveur KIMSUFI avec Debian

Pour aider a la compréhension, voici le code...

Le controller -> Update

    public function update(updateAgence $request, $id)
    {
        $voiture = Agence::findOrFail($id);
        $requestVoiture = $request->except('_token', 'images');
        $voiture->update($requestVoiture);

        // Gestion des uploads et sauvegarde en base
        $requestImages = $request->file('images');
        if ( $requestImages ){
            $this->uploadImage($requestImages, $voiture);
        }

        $message= ['erreur', 'Un problème est survenu lors des modifications'];
        if( $requestVoiture  ){
            $message = ['succes', "Modifications effectuées"];
        }

        return redirect()->route('agence.edit', $voiture)->with($message);
    }

La function d'upload d'image(s) et sauvegarde en base

private function uploadImage($requestImages, $voiture)
    {
        $chemin = public_path() . "/img/agence/$voiture->id/";
        $cheminMin = public_path() . "/img/agence/$voiture->id/thumbs/";

        // Créer répertoires si besoin
        if (!File::exists(public_path("/img/agence/$voiture->id/thumbs/"))) {
            File::makeDirectory(public_path("/img/agence/$voiture->id/thumbs/"), 0777, true);
        }

        // Boucle sur les images postées
        foreach ($requestImages as $requestImage) {

            $image = $requestImage;

            // Récupérer l'extension de l'image
            $ext = $image->getClientOriginalExtension();

            //Créer un nom via un id unique pour l'image
            $imageNom = uniqid();

            ImageStatic::make($image->getRealPath())
                ->fit(180, 120)
                ->save($cheminMin . $imageNom . '.' . $ext);

            ImageStatic::make($image->getRealPath())
                ->fit(428, 285)
                ->save($chemin . $imageNom . '.' . $ext);

            // Sauvegarde en base
            $newImage = new Image();
            $newImage->nom = $imageNom . '.' . $ext;
            $newImage->agence_id = $voiture->id;

            // Vérifier si il existe déja une image principale et traitement
            $newImage->principale = 0;

            if( Image::where('agence_id', $voiture->id)->where('principale', true)->count()  == 0 ){
                $newImage->principale = true;
            }
            $voiture->images()->save($newImage);

        }

        return true;
    }

Oui, je sais, la ligne " $image = $requestImage; " ne sert a rien.. je modifierai ca une fois que j'aurai trouvé une solution :)

Je comprends bien que l'envoi des images sur le serveur peut prendre du temps mais, de la a attendre aussi longtemps pour le traitement, j'imagine qu'il y a un soucis quelque part que j'ai pas vu....

Enfin, merci d'avance :)

7 réponses


Salut,

Est-ce que cela ne viendrait-il pas tout simplement de ta bande passante ? Car si tu as une connexion aux fraises, c'est normal que l'upload soit lent ;)
De plus, il se peut que ton serveur bride la bande passante, il faudrait que tu regardes aussi de ce côté ;)

ifabe
Auteur

Hello betaWeb :)
La connexion en elle meme est correcte..

Par contre, je sais pas du tout si la bande passante du serveur est bridée...
Tu as déja eu le probleme? (Tu sais ou regarder ? :) )

ifabe
Auteur

Apparement, le serveur a une connexion "normale" d'apres un speedtest ...

Je sais pas bien quoi penser...

Si chaque image fait ~4Mo et que tu en envoies 20, ça fait 20 * 4 = 80Mo à envoyer, et à traiter derrière, c'est pas étonnant que ça prenne du temps, surtout si le traitement demandé est gourmand en ressources.

Fais un htop sur ton serveur pendant l'action est en cours voir si ton proc' et ta mémoires ne sont pas full.

Quelle est la config' de ton KIMSUFI ?

Regarde du côté des queues, ça pourrait t'aider je pense ;)

ifabe
Auteur

Hello :)
Désolé du temps de réponse, la fin de semaine a été chargée :)

Pour la config, c'est pas une machine de guerre, on est d'accord...

processorName AtomN2800
numberOfProcessors 1
coresPerProcessor 2
processorArchitecture x86_64
memorySize 2048 MB

Je viens de faire un test, pour un
envoi de 10 images (de 4Mo), avec comme actions:

  • Création des répertoires
  • redimension en 2 formats (600px et 250px) et save dans les répertoires fraichements crées
  • insertion en base (mysql)
    Il a fallu 1m55 pour le tout...

Histoire de trouver d'ou pouvait venir les lenteurs, j'ai essayé de supprimer des actions...

Test 2
Les mêmes 10 images avec

  • Création des répertoires
  • Redimension en un format (petit ou grand, ca change pas)
  • insertion en base
    Temps total: 1m52...

Test 3
Les mêmes 10 images avec

  • Création des répertoires
  • Redimension en deux formats
  • SANS insertion en base
    Temps total: 1m52...

Tout ca en comptant que Chrome me signal un temps de transfert qui prends en moyenne 1m05

J'ai vraiment du mal a trouver d'ou ca vient..
Sans compter que la personne pour qui le projet est réalisé a une connexion moins bonne que moi et qu'il a fait des test qui ont prix plus de 10minutes pour une 15aines de photos :/

Merci :)

C'est tout à fait normal que ça prenne du temps si les photos sont lourdes, y'a pas de magie.. Et ta config n'est pas terrible (Intel Atom, quelle blague des proc'), donc le traitement par image est gourmand.

Tu vas lui filer le projet tel quel en local ou ça sera sur un serveur ?
Tu devrais vraiment regarder du côté des files d'attentes ;)

ifabe
Auteur

Si c'était destiné a un serv. en local, j'aurai pas eu l'occasion de poster ce soucis :p
En local, ca passait tres bien :) (un peu lent mais bon.... )

Mais, oui, je pense que je vais creuser les files d'attentes :) (déja regardé mais jamais eu besoin... )

Merci betaWeb :)