Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - exkalibr

Stran: 1 ... 20 21 [22] 23 24 25
316
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í?

317
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.

318
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.

319
Kód: [Vybrat]
    $locked = flock($fp, LOCK_EX);
    if ( $locked ) {  // acquire an exclusive lock
        $success = fwrite($fp, $s);
        if ( $success === false)
          echo "; w FAILED;";
        else
          if ( $_DEBUG_ )
                echo " $success B written; ";
        $success = fflush($fp);// flush output before releasing the lock
        if ( $success === false )
          echo "; flush FAILED; ";
        $success = flock($fp, LOCK_UN);    // release the lock
        if ( $success === false )
          echo "; release FAILED; ";
        $success = fclose($fp);
        if ( $success === false )
          echo "; fclose FAILED; ";
        clearstatcache(); // needed for filesize and touch
        $fsize = filesize($tname);
        if ($original_size>$fsize)
            {
            echo "; <b>WRITE FAILED, restoring</b>;";
            $original_fname = "$n";
            $result = copy($original_fname, $tname);
            if ($result == false )
              die(" <b>TOTAL FAILTURE: copy failed.</b>");
            else
              echo " <b>RESTORED</b>;";
            }
        else
        {
          if ($fsize === 0)
           echo "! THE FILE WAS NOT WRITTEN: data length: ".strlen($s)." fsize: $fsize RESOURCE: $fp<br>";   
          if ( $success )
              touch("$tname",$fsize,$p);
        }
      } else echo "Couldn't get the lock!";

320
Ten je o pár řádků výše, přece:

$locked = flock($fp, LOCK_EX);

Já jsem dával jen ukázku toho fstat, ne zámku

321
OK kit, tak jsem to udělal, ale ke kolizím stále dochází:

Kód: [Vybrat]
        $success = fflush($fp);// flush output before releasing the lock
        if ( $success === false )
          echo "; flush FAILED; ";
        $st = fstat($fp);
        if ($original_size>$st['size'])
            {
            echo "; <b>WRITE FAILED, restoring</b>;";

Je to tak nějak furt stejné.

322
A co takhle zkusit vyrobit jiný typ zámku, který by byl spolehlivější. Zkusím dát návrh. V tomto návrhu mi jde o vzkazník, kde každý uživatel má vlastní složku a v ní několik souborů s příchozí a odchozí poštou apod.

Chci přečíst a zapsat data pro příchozí poštu.

Krok 1) Kontrolní krok - zatím vynechám popis

Krok 2)

Zjistím jaký je aktuální mikročas. Zjistím jaké je aktuální číslo, zajímají mě poslední dvě číslice. Např. 99

Do složky data/username/rq si vytvořím nový prázdný soubor 99.

Nastavím hodnotu posledního přístupu podle toho s jakým souborem chci pracovat (prostě číslo souboru označuje určitý soubor v osobní složce).

Pak nastavím časovač něco jako
usleep( rand(1,500) );

Dále zkontroluju jestli v té složce mezitím nevznikly další požadavky na práci se stejným souborem. Pokud ano, mám možnost tu situaci řešit. Napadá mě třeba zapsat (APPEND) do toho souboru prioritu tohoto požadavku něco jako
99 94381315 1500... mikrosekundy + náhodně vygenerované číslo + čas čekání.
Pokud se tam objeví ještě jeden proces ve stejný čas, tak udělá to samé, zapíše svoje číslo něco jako
99 135485
ten kdo má vyšší prioritu, se provede jako první. Ten s nižším číslem bude čekat 1500 mikrosekund (přečte si předem vypočítaný čas).

Celkově ale dost pochybuju, že by se dva procesy spustily ve stejný čas během 99 mikrosekund.

Soubory starší 10 sekund by se smazaly.

323
Když ti více PHP procesů zároveň provede řádek "fopen $tname" a pak jeden proces přejde na řádek flock lock_ex, tak neskončí ti náhodou zbývající procesy hláškou "Couldn't get the lock!"?
Všechny chyby, které nastaly jsem už popsal, jednalo se tam o selhání zápisu nic víc. Všechny hlášky mám ošetřené. flock neselhal ani jednou, vždy byl výsledek true.
Jestli myslíš tím "selhání zápisu" tento blok:
Kód: [Vybrat]
$fsize = filesize($tname);
        if ($original_size>$fsize)
            {
            echo "; <b>WRITE FAILED, restoring</b>;";
            $original_fname = "$n";
            $result = copy($original_fname, $tname);
            if ($result == false )
              die(" <b>TOTAL FAILTURE: copy failed.</b>");
            else
              echo " <b>RESTORED</b>;";
            }
        else
...

tak $fsize používáš až po lock_un, takže zjišťuješ velikost souboru ve chvíli kdy do něj zapisuje jiný proces.

A jsi si jistý, že je možné správně zjistit velikost souboru, když je soubor otevřený pro zápis?

324
Kit, děláš mi to rozhodování čím dál těžší. Flock sice spolehlivý je, ale nezaručuje že mezi otevřením a flockem se k souboru, nedostane jiný proces.  :o

To vadí? Mně tedy ne.

Nabourává to ten script, takže není atomicitní.

325
Když ti více PHP procesů zároveň provede řádek "fopen $tname" a pak jeden proces přejde na řádek flock lock_ex, tak neskončí ti náhodou zbývající procesy hláškou "Couldn't get the lock!"?

Všechny chyby, které nastaly jsem už popsal, jednalo se tam o selhání zápisu nic víc. Všechny hlášky mám ošetřené. flock neselhal ani jednou, vždy byl výsledek true.

326
Kit, děláš mi to rozhodování čím dál těžší. Flock sice spolehlivý je, ale nezaručuje že mezi otevřením a flockem se k souboru, nedostane jiný proces.  :o

327
T8 mkdir, jinak

328
Správně se to dělá tak, že se proces nejprve pokusí zamknout všechny soubory, které bude potřebovat ke své práci. Pokud některý ze zámků selže, všechny odemkne, počká náhodnou dobu a pokusí se znovu nasadit všechny zámky.

Já bych ten soubor mohl mít jen jeden, ale pokud použiju rejstříky a indexy - další dva soubory pro urychlení parsování/hledání - tak to budou 3.

Co když ten skript spadne, soubor zůstane zamknut? Jak dlouho?

329
Pokud skript spadne, tak spadne. Obvykle to ničemu nevadí a je to zcela běžné. Klient si ho spustí znovu.

Pokud spadne tak tam zůstane ten vytvořený adresář, který nikdo nesmazal. Ten script pak nepůjde provést. Musel bych tam spouštět čas od času udržovací script, který by promazal ty staré adresáře - ale to je zase zátěž na víc a navíc to neřeší problém úplně. Protože nějakou dobu to spustit nepůjde.

330
Teď jsem opakoval T7 jen s 6 cyklama a jen ze dvou prohlížečů a přesto došlo ke 4 kolizím. Oproti tomu T8 s 10 cyklama ze čtyř firefoxů udělal jen 1 chybu ... za bez použití file_exists. Ale taky se dívám že výsledná doba čekání u toho selhání byla poměrně malá 0.864s.
Tohle testování je k ničemu. Pokud nemáš správně zámky, tak pořád testuješ nezamknuté soubory a vůbec není podstatné kolik je tam chyb. Pokud paralelní php scripty pustíš přesně ve stejný okamžik, tak tam těch chyb bude teoreticky více než když je spustíš s malým časovým odstupem - časový odstup u takového testu sníží riziko překřížení mezi jednotlivými PHP procesy.

Ale ty zámky jsou přece nastaveny správně, copak si neviděl kód?

Stran: 1 ... 20 21 [22] 23 24 25