PHP: Výsledky srovnání funkcí file_(get)put_contents & f(read/write/flush)

Jiné řešení pro případ vzkazníku mě napadlo.

Odesílatel odešle zprávu do složky uživateli, ale ta se nezpracuje automaticky. Ta zpráva tam bude čekat jako samostatný soubor, dokud si uživatel nepřečte všechny zprávy (které se mu zařadí do souboru teprve až navštíví svojischránku). Tím pádem jde o stoprocentní atomicitu, protože jediný skript, který bude zapisovat data do souboru je ten jeho. Nevýhoda je že při velkém množství zpráv se může uchovávat velké množství souborů, které na linuxu mohou zabírat nevím kolik.


Mimo téma - Aneb jak to v reálu dopadne
10/2019 - Autor otázky vymyslí úžasnou funkci über cool atomickou
12/2019 - Předání zákazníkovi
01/2020 - První uživatelé začínají používat SW
02/2020 - Zákazník si začíná stěžovat na pomalost, "někdy" se stane, že vůbec nic nefunguje
03/2020 - Autor otázky dumá jak to "někdy" nasimulovat
04/2020 - Po neschopnosti nasimulovat SW přebírá jiný programátor... Se zděšením kouká co původní autor vymyslel, přepisuje s prstem v nose na file_put_contents
05/2020 - Zákazník je happy


Mimo téma - Aneb jak to v reálu dopadne
10/2019 - Autor otázky vymyslí úžasnou funkci über cool atomickou
12/2019 - Předání zákazníkovi
01/2020 - První uživatelé začínají používat SW
02/2020 - Zákazník si začíná stěžovat na pomalost, "někdy" se stane, že vůbec nic nefunguje
03/2020 - Autor otázky dumá jak to "někdy" nasimulovat
04/2020 - Po neschopnosti nasimulovat SW přebírá jiný programátor... Se zděšením kouká co původní autor vymyslel, přepisuje s prstem v nose na file_put_contents
05/2020 - Zákazník je happy

Blbost. Nepíšu nic pro žádné klienty, programuju sám pro sebe a ne za peníze. Navíc jsem žádnou funkci nevymyslel, protože očividně žádná vymyslet nejde. Jak jsem už psal, žádná z těch funkcí není spolehlivá, no a pokud by použil file_put_contents na neatomické operace tak to by byl pěkný debil.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Jiné řešení pro případ vzkazníku mě napadlo.

Odesílatel odešle zprávu do složky uživateli, ale ta se nezpracuje automaticky. Ta zpráva tam bude čekat jako samostatný soubor, dokud si uživatel nepřečte všechny zprávy (které se mu zařadí do souboru teprve až navštíví svojischránku). Tím pádem jde o stoprocentní atomicitu, protože jediný skript, který bude zapisovat data do souboru je ten jeho. Nevýhoda je že při velkém množství zpráv se může uchovávat velké množství souborů, které na linuxu mohou zabírat nevím kolik.

Tohle řešení se jmenuje Maildir a skutečně se používá. Při správné volbě souborového systému to funguje skvěle i pro velké množství souborů. Funkce file_put_contents() zde bude namístě bez rizika kolize, neboť názvy souborů se generují přes UUID.

Alternativní a doporučenou variantou je použití databáze, která ti zajistí nejen atomicitu, ale i eliminuje riziko kolizí a polovičních souborů. Takže až vyřešíš problémy se zamykáním souborů, přejdi na databázi.

Flock sice spolehlivý je, ale nezaručuje že mezi otevřením a flockem se k souboru, nedostane jiný proces.
To je naprosto normální, takhle se budou chovat všechny synchronizační mechanismy. Vždy je to založené na tom, že se pokusíte udělat nějakou exkluzivní akci, vyhodnotíte výsledek a zjistíte, zda se podařila, nebo zda perníček loupe i někdo jiný a musíte chvilku počkat a zkusit to znovu.

flock neselhal ani jednou, vždy byl výsledek true.
Když chcete jako programátor řešit paralelní přístup k datům, tohle nemůžete nikdy napsat. To, že se vám nepodařilo nějaký souběh nasimulovat, vůbec neznamená, že nenastane hned při prvním spuštění na produkci.

A co takhle zkusit vyrobit jiný typ zámku, který by byl spolehlivější.
Dám vám dobrou radu. Nepokoušejte se vymýšlet vlastní zámky, v tuto chvíli na to nemáte znalosti. Použijte nějakou běžně používanou databázi, která už má tyhle nízkoúrovňové věci vyřešené. Tam můžete studovat třeba to, jak fungují ACID transakce, jak jsou od sebe izolované – a na základě toho si začnete pomalu budovat představu o tom, co se může dít, když se stejnými daty pracuje několik programů nebo vláken souběžně.

Takže až vyřešíš problémy se zamykáním souborů, přejdi na databázi.
Takhle to nebude fungovat, jedině opačně – nejprve se naučit používat prostředky databáze, které jsou jednodušší, a teprve pak se případně dostat k souborům.


Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Takže až vyřešíš problémy se zamykáním souborů, přejdi na databázi.
Takhle to nebude fungovat, jedině opačně – nejprve se naučit používat prostředky databáze, které jsou jednodušší, a teprve pak se případně dostat k souborům.

To měl být sarkasmus.

Kit: do databáze by se mi nevešlo všechno to co chci uložit. Ta databáze na freehostingu má jen 20 mB. Teď jsem to počítal, kdybych udělal malou stránečku, seznamku pro úzkou komunitu lidí (nebudu zde veřejně blíže mluvit detaily o jakou komunitu se jedná). Můj nápad je udělat tu komunitu pouze pro určitou oblast, tím se to ještě víc omezí. Tak dejme tomu počet uživatelů 100 lidí jako maximum (odhad). Na souborovém systému, počítám-li na linux 4kb na prázdnou složku/soubor ... na jednoho uživatele tedy 1 složka a 10 souborů dělá dohromady 3,9MB jen na prázdných souborech, 0,4MB na prázdných složkách a 443 MB jen na datech. Na datech jsem při tom počítal: 1MB na příchozí poštu, 1MB na odchozí poštu (za předpokladu, že se to bude např. jednou za 2-3 měsíce mazat). 0,1MB rejstřík (on asi nebude zabírat tolik, ale dal jsem rezervu, no pokud posunu čárku o jedno místo tak 410MB celkem. Vše se musí zálohovat, takže je to tam dvakrát. Tudíž vidíš sám že do 20MB databáze se tohle nemůže vejít. A jednalo by se o nekomerční tedy neziskový projekt, takže proto pojede na hostingu zdarma. No možná mi doporučíš nějaký hosting zdarma kde mají větší databázi nebo prostor na disku, ale celkově je problém v tom, že já nevěřím těmhle hostingům co poskytují velký prostor "zdarma", bylo tu Moxo, co ukradlo uživatelům stránky a osobní data, tedy ne ono, ale nějaký chlap kterého vlastně ani nikdo přesně neznal a nejspíš to byl cizinec, takže jakmile získal co chtěl, tak zbalil kufry a odešel. Nikdy nevíš kdo se vlastně za takovou službou skrývá, zvlášť pokud je zahraniční a nabízí svůj prostor a služby a co se s nimi pak děje, komu je nabízí?
« Poslední změna: 14. 10. 2019, 19:26:45 od exkalibr »

flock neselhal ani jednou, vždy byl výsledek true.
Když chcete jako programátor řešit paralelní přístup k datům, tohle nemůžete nikdy napsat. To, že se vám nepodařilo nějaký souběh nasimulovat, vůbec neznamená, že nenastane hned při prvním spuštění na produkci.

Na jaké produkci? Já nejsem produkční studio! (Pozn. vykřičníky u mě neznamenají attack, ale překvapení nebo důraz).

Jak jsem psal, databázi určitě použiju, to jsem si už vyjasnil, ale rozhodně ne na ptákoviny jako je registrace a loginy, to zvládnu přes soubory. Taková databáze musí být mega jednoduchá, takže jedna tabulka na ukládání výsledků ankety a to bude vše. Nechci strávit zbytek život psaním www stránek. Tenhle druh programování pokládám za hrozně omezující, protože člověk musí brát ohled na ty paralalení operace, bezpečnost, možnost uživatelů úmyslně chtít hatit provoz stránky... Když se rozhodnu napsat binární program, který dělá tu samou věc ale bez uživatelů mám to napsané za tři až sedm dnů, podle úrovně detailů... Tady jednu kravinu abych programoval dva tři měsíce. To je hrůza.

Jo k té databázi, styčí když k tomu použiju příkazy mysql_? Učit se za něco nového jako PDO se mi nechce.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Kit: do databáze by se mi nevešlo všechno to co chci uložit. Ta databáze na freehostingu má jen 20 mB.

Použij SQLite. Budeš omezen jen velikostí diskového prostoru na webhostingu a ušetříš hromadu místa.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Jo k té databázi, styčí když k tomu použiju příkazy mysql_? Učit se za něco nového jako PDO se mi nechce.

Práce s PDO je jednodušší než s mysql_* a navíc získáš ošetření proti SQL injection - tedy pokud použiješ prepared statemnts.

Na jaké produkci? Já nejsem produkční studio!
„Produkce“ je v IT slangové označení pro „produkční prostředí“, nebo také „ostré prostředí“ – prostředí, kde aplikace běží „na ostro“, připojují se k ní reální uživatelé, má reálná data atd. Tedy např. i ta vaše aplikace na free webhostingu. Vedle toho pak mohou existovat různá nedůležitá nebo méně důležitá prostředí – vývojová, testovací, integrační, akceptační apod.

Zrovna problémy s konkurenčním přístupem se často vyskytují až od určitého množství současně pracujících uživatelů. Pokud řešíte webhosting zdarma, asi nebudete mít testovací prostředí, kde byste věrohodně simuloval souběžnou práci většího množství uživatelů. Takže na problémy se špatně napsaným konkurenčním přístupem můžete narazit až na ostrém serveru – až se vám začnou ztrácet data nebo se vám datový soubor poškodí.

Jak jsem psal, databázi určitě použiju, to jsem si už vyjasnil, ale rozhodně ne na ptákoviny jako je registrace a loginy, to zvládnu přes soubory […] Tady jednu kravinu abych programoval dva tři měsíce.
Pokud si pro prkotiny jako registrace a loginy budete programovat vlastní databázi, opravdu vám to bude trvat dva tři měsíce, klidně i déle. Pokud se na tom budete metodou pokusu a omylu učit, jak se pracuje se soubory při konkurenčním přístupu a jak se zamykají, bude vám to trvat podstatně déle, než tři měsíce. A možná nakonec zjistíte, že když budete zamykat celé soubory, už s malým množstvím uživatelů na freehostingu narazíte na limity v počtu souběžně otevřených souborů nebo doby zpracování skriptu.

A k tomu hostingu zdarma – slušný webhosting seženete už okolo 50 Kč za měsíc. Už jenom psaním těch podivuhodných testů jste propálil tolik času, že byste za to tu aplikaci provozoval několik let.

Na jaké produkci? Já nejsem produkční studio!
„Produkce“ je v IT slangové označení pro „produkční prostředí“, nebo také „ostré prostředí“ – prostředí, kde aplikace běží „na ostro“, připojují se k ní reální uživatelé, má reálná data atd. Tedy např. i ta vaše aplikace na free webhostingu. Vedle toho pak mohou existovat různá nedůležitá nebo méně důležitá prostředí – vývojová, testovací, integrační, akceptační apod.

Zrovna problémy s konkurenčním přístupem se často vyskytují až od určitého množství současně pracujících uživatelů. Pokud řešíte webhosting zdarma, asi nebudete mít testovací prostředí, kde byste věrohodně simuloval souběžnou práci většího množství uživatelů. Takže na problémy se špatně napsaným konkurenčním přístupem můžete narazit až na ostrém serveru – až se vám začnou ztrácet data nebo se vám datový soubor poškodí.

Jak jsem psal, databázi určitě použiju, to jsem si už vyjasnil, ale rozhodně ne na ptákoviny jako je registrace a loginy, to zvládnu přes soubory […] Tady jednu kravinu abych programoval dva tři měsíce.
Pokud si pro prkotiny jako registrace a loginy budete programovat vlastní databázi, opravdu vám to bude trvat dva tři měsíce, klidně i déle. Pokud se na tom budete metodou pokusu a omylu učit, jak se pracuje se soubory při konkurenčním přístupu a jak se zamykají, bude vám to trvat podstatně déle, než tři měsíce. A možná nakonec zjistíte, že když budete zamykat celé soubory, už s malým množstvím uživatelů na freehostingu narazíte na limity v počtu souběžně otevřených souborů nebo doby zpracování skriptu.

A k tomu hostingu zdarma – slušný webhosting seženete už okolo 50 Kč za měsíc. Už jenom psaním těch podivuhodných testů jste propálil tolik času, že byste za to tu aplikaci provozoval několik let.

To je blbost, registraci si napíšu za týden.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
To je blbost, registraci si napíšu za týden.

Proč ne za hodinu?

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Který freehosting používáš, ať mohu porovnat parametry?