Symfony i zapytania doctrine w pętli - optymalizacja kodu

0

Witam,

W Symfony3 utworzyłem serwis do czyszczenia plików które znajdują się na serwerze ale ich instancja nie istnieje w bazie danych. Pliki w moim systemie ładowane są za pomocą jQuerowego uploadera (Bootstrap File Input Demo - © Kartik - Krajee JQuery Plugins - udało mi się zaimplementować to z Symfony3), stąd użytkownik może wysłać kilkanaście plików na serwer a na koniec wypełniania formularza zmienić zdanie i utworzyć wpis tylko z jednym plikiem.

Stąd niezbędny jest serwis do czyszczenia "niewykorzystywanych plików":

namespace Bagsiur\AdminBundle\Services;

use Doctrine\ORM\EntityManager;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Filesystem\Filesystem;

class FilesManager
{

    protected $em;
    protected $finder;
    protected $fs;
    protected $uploadDirectory;

    public function __construct(EntityManager $entityManager, Finder $finder, Filesystem $fs, $uploadDirectory)
    {
        $this->em = $entityManager;
        $this->finder = $finder;
        $this->fs = $fs;
        $this->uploadDirectory = $uploadDirectory;
    }
    
    public function ClearTemporaryFiles($userId, $database){

        $this->finder->name($database.'__'.$userId.'__*');
        $this->finder->files()->in($this->uploadDirectory);
        
        $toRemoveArray = array();
        
        foreach ($this->finder as $file) {

            $fileName = $file->getRelativePathname();
            $db = $this->em->getRepository('BagsiurAdminBundle:'.ucfirst($database))->findFile($fileName);

            if(!$db){
                $toRemoveArray[] = $this->uploadDirectory.$fileName;
            }

        }
        
        $this->fs->remove($toRemoveArray);
        
    }
    
}

Jednak jak widać w pętli foreach "strzelam" sporą ilością zapytań do bazy... czy idzie to jakoś zoptymalizować i utworzyć bardziej wydajny kod?

Pozdrawiam i dziękuję za odpowiedź ;)

0

Wczytaj listę wszystkich plików do tablicy (jedno zapytanie) i w pętli wykorzystaj in_array.
Jeśli plików w bazie masz miliony, najlepiej pamięciowo oraz wydajnościowo będzie wykorzystać Twoje aktualne podejście, tyle że sprawdzając paczki plików (na przykład po tysiąc naraz), wykorzystując SQLowe in.

1 użytkowników online, w tym zalogowanych: 0, gości: 1