mohu pouzit SafeStream na ukladani obrazku ?
- dehtak
- Člen | 113
mohu pouzit SafeStream na ukladani obrazku ?
asi takhle ?
$image = Image::fromFile($bigImg);
$image->resize(249,364,Image::FILL);
$image->save('nette.safe://'.self::PUBLICDIR."/$imgName.webp", null, Image::WEBP);
Jednou za tyden se mi prez ftp nahrajou automaticky novy obrazky s xml
souborem. A ty obrazky jsou moc velky musim je zmensit. A nevim jestli to mam
ukladat normalne nebo radsi prez safe.
Jak mile nekdo zavola stranku tak si nete vsimne ze tam ma novy XML a obrazky a
zacne to zpracovavat. Ale bojim se aby to nedelalo bordel kdyz vlezou ve stejnej
moment na stranku 2–3 navstevnici.
- Marek Bartoš
- Nette Blogger | 1239
safe stream ti jen zajistí, že se nebudou vzájemně přepisovat a místo toho bude každý čekat, než ukládání dokončí ten předchozí, Ve finále tak budou jen déle čekat (při přepisování celého souboru afaik absence zámků nevadí)
Ty bys měl docílit toho, aby se ti zapisovalo pouze jednou. V případě čekání na uživatele můžeš použít symfony/lock. Pro soubor vytvoříš zámek a uvolníš ho, jakmile bude soubor vytvořen. Pokud potřebuješ, aby všichni uživatelé měli obrázek hned dostupný, tak potřebuješ použít store, který je blokující (například FlockStore). Pokud ne, tak při nezískání zámku stačí nedělat nic.
Lepší je však tyhle akce dělat na pozadí. V databázi si uděláš tabulku s frontou zpráv, do které vložíš požadavek na zpracování obrázku. Cron spouštěný každou minutu si pak záznam vybere pro zpracování (select for update, se skip locked), vygeneruje obrázek a při úspěchu zprávu smaže. Uživatelé nemusí na nic čekat a máš jistotu, že se obrázek vygeneruje jen jednou. Jen musíš počítat s variantou, že obrázek ještě nebude při requestu od uživatele dostupný.