Deduplikácia a integrita
Pri zapnutej deduplikácii sa rovnaké bajty na rovnakom (disk, visibility) uložia raz a zdieľajú sa referenciou, pokiaľ je zdieľaný súbor na disku stále prítomný — rovnako zdieľajú originál aj attach() a kópia na tom istom disku. Bezpečné zdieľanie zaručuje počítadlo referencií na uloženom súbore: fyzický originál sa odstráni — mazaním, presunom na iný disk či náhradou — len vtedy, keď na ten istý súbor (disk + cesta) už neukazuje žiadny iný riadok, vrátane soft-deleted riadkov, takže soft delete s následným obnovením nič nestratí ani pri zdieľanom súbore:
// Identical bytes on the same (disk, visibility) are stored once.
$a = MediaLibrary::for($userA)->add($path)->toBucket('docs'); // the source path is only read
$b = MediaLibrary::for($userB)->add($path)->toBucket('docs'); // same bytes -> shared storage
// Deleting $a keeps the file alive while $b still references it.
MediaLibrary::delete($a); // the original stays until the last reference is gone
$b->verifyIntegrity(); // bool — false on drift or a missing fileKontrolný súčet obsahu (predvolene sha256) je základom dedup aj voliteľnej kontroly integrity pri čítaní — nastavte verify_checksum_on_read, aby sa originál pri streame/sťahovaní prehašoval a pri nezhode vyhodil ChecksumMismatch. Každý súbor sa overí algoritmom, ktorým sa vypočítal jeho checksum, takže po zmene media.checksum_algorithm sa staršie médiá nikdy nenahlásia ako zmenené. Varianty sa nikdy nezdieľajú: každé médium si generuje vlastné. Zdieľaný originál sa ani neprepíše — náhrada pri jednom z riadkov zapíše nové bajty na vlastnú cestu — a adresáre sa upracú až vtedy, keď v nich nezostane nič, na čo ukazuje iný riadok.
Súbežné zápisy a rollbacky
Riadok, ktorý začne zdieľať súbor, je pre ostatné spojenia neviditeľný, kým sa nepotvrdí, takže samotné počítadlo referencií by ho mohlo prehliadnuť. Balík túto medzeru uzatvára zámkami riadkov a mazaním až po potvrdení transakcie:
- Každý spôsob, ako riadok začne zdieľať originál — deduplikované pridanie či náhrada, attach() aj kópia na tom istom disku —, ho uloží pod zámkom (SELECT … FOR UPDATE, vo vlastnej transakcii — vo vašej ako savepoint) na riadku, ktorý súbor už ukladá. Súbežné zmazanie či presun tohto riadku počká, kým sa nový riadok potvrdí, a potom ho uvidí. Stačí uzamknúť jeden riadok: kým súbor stále ukladá, kontrola žiadneho iného riadku ho neodstráni.
- Ak zdieľaný riadok po získaní zámku už neexistuje — alebo ukladá iné bajty —, deduplikované pridanie či náhrada si uloží vlastnú kópiu, zatiaľ čo attach() a copy() vyhodia ModelNotFoundException.
- Náhrada uzamkne vlastný riadok skôr, než sa rozhodne, či originál prepíše na mieste, takže nikdy neprepíše bajty, ktoré sa chystá zdieľať nový riadok.
- Force delete odstráni súbory až po potvrdení vonkajšej transakcie (bez transakcie hneď): rollback ich ponechá a počítadlo referencií potom vidí aj riadok, ktorý medzitým začal originál zdieľať v inom spojení. Rovnako uvoľňujú staré súbory aj presun, presun variantov, naviazanie draftu a náhrada.
- Na skutočnom databázovom engine môžu dva takéto toky skončiť v deadlocku — každý drží riadok, ktorý chce ten druhý. Databáza jeden z nich preruší chybou deadlocku a volajúci ho môže zopakovať.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.