Statická kopie webu

Co se starým webem? Nechce se vám ho dál provozovat, ale připadá vám škoda ho jen tak zavřít? Zkuste ho zamrazit a vystavit...

Když jsem před lety skončil s Neškodným, nechtěl jsem, aby stránky, kterým jsme s White Dogem věnovali spoustu práce a které, chca nechca, poměrně výrazně zasáhly do historie českých blogů, jen tak prostě zmizely. Na druhou stranu se mi ani nechtělo udržovat dál databázi a hosting a všechny ty věci okolo kvůli neaktivním stránkám. Takže padlo rozhodnutí: Zmrazit aktuální stav a vystavit jako "statický" archiv.
(Slovo "statický" je v uvozovkách schválně. Někteří hnidopiši mohou totiž namítat, že statické stránky jsou přeci čisté HTML, a tohle je "uvnitř" poháněné PHPčkem. Proto když píšu "statický", mám na mysli "s obsahem, který se už nebude měnit".)
Neškodného jsem si stáhnul z webu nástrojem na "offline prohlížení". Používám WinHTTrack. Zadám mu adresu webu, on si stáhne úvodní stránku, najde všechny odkazy, stáhne další stránky, v nich najde další odkazy... atakdále, dokud nestáhne vše, co na webu najde. Celé to uloží do určeného adresáře tak, aby to bylo použitelné i pro "offline prohlížení". Tedy změní cesty k obrázkům, uloží soubory ne jako PHP, ale jako ".html", změní odkazy na ně... Zkrátka vezme aktuální stav webu tak, jak je vystaven, a udělá z něj statickou kopii.
Teď by teoreticky stačilo tuhle statickou kopii nakopírovat zpět na web. S Neškodným jsem to chtěl udělat zrovna tak, ale kdo jste kdy zkoušel nahrát na web několik tisíc malých souborů pomocí FTP, tak víte, jak je to prudná práce. Nakonec jsem to tedy nějak překousl, ale řekl jsem si: Už nikdy víc!
Včera jsem zavřel a zamrazil dev::info. Když jsem ho celé stáhnul, zjistil jsem, že lokální kopie čítá 48 MB, rozházených do několika tisíc souborů s průměrnou velikostí dvacet kilo. Nejsem blázen, abych tohle kopíroval celý den... I když bych to mohl zaZIPovat, uploadnout a na serveru rozbalit... ovšem to se mi zas nechtělo.
A tak jsem si udělal jednoduché skripty, které dělají následující:

  • První vezme všechny soubory v adresáři ./data, jeden po druhém zapakuje GZIPem a uloží je do jednoho velkého souboru (v podstatě takový primitivní tar)
  • Druhý se postará o to, aby v tom velkém archivu našel požadovaný soubor a poslal ho zpět.

Zní to jednoduše, že? A ono to taky jednoduché je. Výsledek je ten, že místo osmačtyřiceti mega v bambiliónu malých souborů mám pouhé tři soubory, které nahraju na web - .htaccess, handler.php a šestimegový (!) data.web - takže upload nezabral hodinu, ale jen pár minut.
Když použiju tenhle fígl, tak můžu handler.php a data.web spojit do jednoho souboru.
Pro zájemce tu mám vše potřebné v ZIP archivu. Vytvořte si adresář a do něj rozbalte obsah ZIPu. Vytvořte v něm podadresář "data" a do něho zkopírujte obsah stažený HTTrackem. Pak spusťte skript "packer.php" (předpokládám, že máte lokálně nainstalovaný PHP5 a víte jak spustit PHP z příkazové řádky). Ve skriptu najdete konstantu, která určí, jestli výsledkem mají být dva soubory (handler a data) nebo jeden spojený, a rovněž tam najdete připravený HTML filtr. V souboru stub.txt (pojmenovaný na počest paní Štubové) je pak vzor "rozbalovacího" skriptu.
Výsledkem běhu packer.php jsou dva soubory (handler.php a data.web), resp. jeden spojený handler.php. Nakopírujte na web spolu s .htaccess - pokud váš hostér nepovoluje mod_rewrite, můžete použít handler jako obsluhu chyby 404 (chce to pak handler trošku upravit, aby vracel HTTP stav 200 OK).
Skripty můžete použít či upravit, pro jejich šíření platí BSD licence ("dělejte si s tím co chcete"), pro jejich používání licence DPL.
PS: Upravil jsem soubory v ZIPu podle pánů Ptáčka a Vrány, děkuji za jejich leteckou podporu.

Komentáře

Velmi dobrá práce

Díky, velmi dobrá práce, myslím, že se to ve světě rozhodně neztratí;-)...

Pekne, ale pozor na diakritiku v odkazech

Na dev::info hned druhy odkaz vyhodi 404... jedna se o "Slevový kupón na Web 2.0 Expo Berlín"...

Jojo, já vím... Bohužel je to

Jojo, já vím... Bohužel je to tak, ale nepovažoval jsem to za tak důležité, abych to řešil. Obecně je diakritika v URL spíš nestandardní, takže doporučuju tenhle problém vyřešit "jinak". Přejmenováním před stažením, například... :)

Pěkné. Ten fígl s halt

Pěkné. Ten fígl s halt compiler je zajímavý, neznal jsem. Díky za zveřejnění.

Díky, bugfix

Díky moc za skvělou práci, každopádně mám tu jeden bugfix - v souboru stub.txt (i v tom base64 encodnutym) je:

/---code php
$index = fread($fp, 20248);
\---code

přičemž by tam mělo být:
/---code php
$index = fread($fp, ***INDEXLEN***);
\---code

Pak vše jede jak má :)
Zároveň bych doplnil do stejného souboru (řádek 22):
/---code php
// Pokud file obsahuje otaznik, odstranime cokoliv co je za nim, pac HTTrack nam na to kasle :)
list($file, $rest) = explode('?', $file, 2);
\---code

Funguje bezvadně a rychle.

Díky, bug jsem opravil, řádek

Díky, bug jsem opravil, řádek jsem přidal, nově jsem to publikoval.

Ukončení __halt_compiler

U `__halt_compiler` doporučuji využít toho, že příkaz lze v PHP ukončit nejen středníkem, ale i uzavírací značkou volitelně následovanou koncem řádku. Takže místo nevzhledného
/---code
__halt_compiler();data zde
\---code
lze vytvořit krásné
/---code
__halt_compiler() ?>
data zde
\---code
Navíc se s tím dobře vypořádají zvýrazňovače kódu, které konstrukci neznají.

Díky za připomínku, pozměnil

Díky za připomínku, pozměnil jsem to.

To opravdu nejde vyřešit ten

To opravdu nejde vyřešit ten hromadný upload nějak jinak, jednodušeji..? :-(

Jasně že jde. Jde to zabalit,

Jasně že jde. Jde to zabalit, uploadnout na server a tam zas rozbalit... pokud tedy máte na serveru tu možnost, což v případě webhostingů nebývá vždy splněno.

Volby prohlížení komentářů

Vyberte si, jak chcete zobrazovat komentáře a klikněte na „Uložit změny“.