Page 1 sur 1

recherche de fichier

Posté : 15 avr. 2015, 09:54
par WENKz
Bonjour, j'ai un petit soucis j'ai créé un script qui recherche des images dans un dossier et qui les deplaces si elles sont trouvé. j'ai d'abord recuperer des references d'une base de données (~23k entrées) puis j'ai fait un scandir et un deux foreach pour parcourir les resultats de base et les comparer avec un pregmatch, il y a environs 2k images dans ce dossier j'ai lancé le script depuis hier et je ne suis cas 300 recherche que puis je faire pour optimiser mon code ? Je pensais enlever le foreach du scandir pour faire un array search ou un preg_grep mais pas moyen ;s voici mon code je vous donne uniquement la partie controller
public function startScript() {
        $skus = $this->recupDonnee();
        foreach ($skus as $val) {
            $this->verifImage($val['COL 1']);
        }
    }

    protected function recupDonnee() {
        $data = $this->ScriptModel->getSKU();
        return $data;
    }

    protected function verifImage($sku) {
        $chemin = "C:\Users\quentin\Desktop\\testimage\\";
        $contenu = scandir($chemin);
        foreach ($contenu as $val) {
            var_dump($val);

            $val = '\\' . $val;
            if (preg_match("#$sku#", $val)) {
                if (copy($chemin . $val, $chemin . "enligne" . $val)) {
                    echo "bien copié";
                    if (unlink($chemin . $val)) {
                        echo "bien effacé";
                    }
                }
            }
        }
    }

Re: recherche de fichier

Posté : 15 avr. 2015, 12:37
par tof73
voir si http://php.net/manual/fr/function.glob.php ne peut pas améliorer les choses.

Re: recherche de fichier

Posté : 15 avr. 2015, 13:16
par WENKz
tout d'abord merci de ta reponse, effectivement je me suis penché sur glob, mais je serai obligé la aussi de faire un foreach, et je mettrai toujours le meme temps, enfin je crois ^^ après j'ai sans doute une mauvaise utilisation de glob

Re: recherche de fichier

Posté : 15 avr. 2015, 16:01
par Saian
Pour optimiser tu pourrais faire le scandir une seule fois et stocker son retour.

Re: recherche de fichier

Posté : 15 avr. 2015, 16:39
par WENKz
le fait d'effectué le scandir une fois va t'il vraiment diminuer le temps d'exe ?

Re: recherche de fichier

Posté : 15 avr. 2015, 16:48
par Saian
A priori entre appelé 1 fois la fonction et l'appeler 23000 fois y aura forcément un impact. Sinon en regardant vite fait certains semblent dire que readdir est plus rapide. En tout cas le plus simple est de tester pour voir, ça ne demande pas une grosse refonte du code, suffit juste de stocker le retour dans un propriété et si la propriété est renseignée l'utiliser au lieu de refaire le scandir.

Et je pense que scandir et typiquement le genre de fonction gourmande en ressource (lire un répertoire de 2000 fichiers 23000 fois c'est forcément lourd, à moins qu'il y ait un système de cache magique ^^).

EDIT : et éventuellement, fait un rename plutôt qu'un copy et un unlink et tu seras au top de l'optimisation (le déplacement du fichier sera beaucoup plus rapide que la copie/suppression).

Re: recherche de fichier

Posté : 16 avr. 2015, 09:13
par WENKz
effectivement le fait de faire une seul fois mon scandir a augmenté la vitesse merci beaucoup :) je vais voir si en une journée le dossié sera traité :) je viens de lancé je suis deja a plus de 50 recherche les jours precedents il fallait 2h pour 30 ahah

Re: recherche de fichier

Posté : 16 avr. 2015, 09:28
par WENKz
je me suis réjouis trop vie je pense ahah après quelques boucles ça ralenti ;(

Re: recherche de fichier

Posté : 16 avr. 2015, 10:45
par Saian
Si tu l'as pas fait, teste de remplacer le copy/unlink par un rename. Je pense que ça devrait faire une grosse différence.