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ź ;)