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 - LarryLin

Stran: 1 ... 31 32 [33] 34 35 ... 44
481
Návštěvníkům, kteří zde zabloudí se asi nebude chtít vše pročítat, tak mohl bys k tomu grafu stručně napsat jaké z něj plyne tvé doporučení nebo závěr pro ostatní programátory PHP? Podle názvu této diskuze bude návštěvníky hlavně zajímat, kterou funkci (zámek) použít pro čtení/zápis souborů.

482
Ať si to platí sami.
Ano ať si to platí, ale to jim musíš říct ty a vysvětlit jim, že se s tím nebudeš drbat 10x déle jenom, aby ušetřili pár svých stokorun. Vzpomínám si na jednu reportáž jak "sběrači" kovů týden kopali měděné kabely a dostali za to 1000 Kč, pak se na ten hluboký výkop díval majitel stavební firmy a říká: "Kdyby se ti kopáči u mě nechali zaměstnat, tak si za to kopání vydělají 5000 Kč". Ale jestli tohle vše děláš kvůli učení a zkoumání, pak to beru.

Pokud se učí a zkoumá vlastnosti souborových systémů na hostingu, který neptá peníze, tak ho nechej být.
Pokud jde o zkoumání a učení se, pak proti tomu nic nemám. Ale i při učení platí efektivita, např. raději koupit učebnici za 500 Kč než brouzdat po netu a učením strávit o rok déle. Pokud mu freehosting pro jeho potřeby poskytne to samé co placený, tak ať vezme free, ale podle toho co Exkalibr napsal jsem měl pocit, že ho bude limitovat a výsledkem těch limitů bude o hodně více stráveného času. Ale jak říkám pokud zkoumá a učí se, tak nic proti.

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

Nedám ani korunu za web, který nevydělává, leda že by si za to návštěvníci ten hosting sami zaplatili. Ale u webu který nemá žádnou návštěvnost asi těžko. Navíc mě těmi svými blbými řečmi rozpalujete doběla. Soudíte druhé lidi podle sebe, jenže vy jste profík, můžete si dovolit strávit u počítače kolik času chcete. Vůbec jsem z těch vašich subjektivně laděných soudů znechucen. To je jak bavit se s blbým člověkem, už jsem vám říkal, že hosting placený nechci a ten neplacený má kapacitu jen 20MB. Taky jsem psal, že tu databázi použiju, ale rozhodně ne na registraci. A tento týden se databází rozhodně zabývat nebudu. To jakým tempem pracuju je moje věc, do toho vám nic není pane.
Myslím, že na Filipa útočíš neprávem. Snaží se ti slušně říct, že někdy je levnější za věci zaplatit než je mít zdarma. Až budeš starší příjdeš na to sám. Raději dát pár stovek ročně než přijít o několik víkendů kdy budeš řešit chyby v tom systému. Taky připočti častější výpadky na freehostingu ze kterého návštěvníci taky nebudou nadšeni. Existuje spousta koníčků a projektů co dělá člověk pro radost a nic na nich nevydělává.

Jestli použiješ databáze vs. soubory; freehosting vs. placený; vlastní systém vs. Wordpress; to všechno záleží na tobě, ale zaplatit trochu peněz za něco co ti ušetří hodně práce je obecně správný přístup, vyjímkou snad je pokud jsi hodně mladý a i těch pár korun je pro tebe dost peněz.

484
Podle mě flush() nezajistí zápis dat na disk (pořád data mohou být v bufferu filesystému), tudíž ani fstat() nemusí fungovat.

Pokud se ti nepovede spolehlivě zkontrolovat source a target soubor uvnitř PHP, tak to budeš muset vymyslet jinak vně (např. každý target soubor v PHP scriptu očísluješ a až pak je srovnáš nějakým nástrojem v linuxu), určitě na něco příjdeš.

Já se už rozloučím protože ten nový návrh na zámek mě vyděsil :). Čau.

485
A jsi si jistý, že je možné správně zjistit velikost souboru, když je soubor otevřený pro zápis?
Tím si jistý nejsem, to musíš vědět ty, je to tvůj domácí úkol :). Já jen vím, že zjišťování velikosti souboru, kdy do něj jiný proces zapisuje není správné, takže to vypadá, že nešlo o žádné skutečné chyby při zápisu, ale pouze jsi špatně srovnával velikost source a target souboru.

486
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 celý ten blok používáš až po lock_un, takže zjišťuješ velikost souboru ve chvíli kdy do něj zapisuje jiný proces.

487
... pak mám dojem, že příkaz "touch("$tname",$fsize,$p);" používáš ve chvíli kdy jiný proces může mít daný $tname soubor zamklý pomocí lock_ex.

488
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?
Viděl, ale je to pro mě nepřehledné a nechce se mi v tom vrtat, ale jen tak namátkou. V tom T7 co máš na stackoverflow.com vidím zhruba toto:

//read
fopen $sname
flock lock_sh
$s=fread
flock lock_un
fclose $sname
touch $sname

//write
fopen $tname
flock lock_ex
fwrite $s
fflush
flock lock_un
fclose

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!"?

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

V testech je naopak výhodné, pokud se ty procesy co nejvíc potlučou mezi sebou - proto jsou ty časové odstupy zbytečné a kontraproduktivní.
Ano souhlasím, jen jsem narážel na to, že tady Exkalibr pořád háže nějaké čísla s počtem chyb, které mají jen tu vypovídací hodnotu, že to má špatně zamknuté. Jestli je tam 1 chyba nebo 30 chyb, tak je to jedno.

490
Myslím, že flock není atomický - https://www.reddit.com/r/PHP/comments/9ec4tz/a_locking_file_cache_in_php/e6cqg19/
Začíná se mi pomalu vybavovat, proč jsem se tenkrát rozhodl využít pro zamykání mkdir ;)
V podstatě tam píší jen to, že mezi voláním fopen() a flock() si ten soubor může zamknout někdo jiný. Tedy nic, co by se nedalo ošetřit testem návratové hodnoty flock().
Zamykání přes mkdir() má nevýhodu v tom, že když ten proces spadne, kdo to po něm uklidí?
Ano uklízení po mkdir() musíš ošetřit ručně. Nevím jak je to přesně u flock(), ale předpokládám, že i tam se ti zámek může seknout a pak musíš mít nějakou vlastní funkci, která ji natvrdo odblokuje.

Nevýhodu vidím v tom, že testem návratové hodnoty flock() vytvoříš smyčku mezi flock() a fopen(). Pokud bys pustil vytěžující scripty (o což se Exkalibr snaží), tak by se smyčka nemusela stihnout dokončit do konce běhu PHP scriptu a script by spadl. Pokud si uděláš vlastní funkcí pomocí mkdir(), tak ji zavoláš ještě před fopen().

491
Myslím, že flock není atomický - https://www.reddit.com/r/PHP/comments/9ec4tz/a_locking_file_cache_in_php/e6cqg19/
Mohl byste to rozepsat? Atomicita znamená, že se daná funkce provede celá nebo vůbec a že nikdo nemůže vidět nějaký vnitřní mezistav té funkce. V případě zámků atomicita znamená, že na souboru nějaký zámek je nebo není – nemůže nastat stav, že by tam zámek byl tak trochu. Atomicita se ale samozřejmě posuzuje z hlediska jedné funkce – to, že se něco může stát před voláním flock() nemá na atomicitu funkce flock() vliv.
Myslel jsem to tak, jak se píše v tom odkazu, tzn. že mezi fopen a flock se může dostat jiný proces. Spolehlivější mně připadá zapisování s file_put_contents, který může mít parametr LOCK_EX. (To samozřejmě v praxi neřeší problém čtení, kde mezi čtením a zápisem může druhý PHP proces zapsat do čteného souboru - tím dojde ke ztrátě dat z tohoto druhé PHP procesu, protože daný soubor v zápětí přepíše ten první PHP proces. Tohle si musí programátor ošetřit ručně.)

Pokud bych to tedy měl říci přesně, tak flock() je atomická funkce, ale ke svému využití potřebuje fopen(), a spojení fopen()+flock() atomické není.


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

493
Myslím, že flock není atomický - https://www.reddit.com/r/PHP/comments/9ec4tz/a_locking_file_cache_in_php/e6cqg19/
Začíná se mi pomalu vybavovat, proč jsem se tenkrát rozhodl využít pro zamykání mkdir ;)

494
Ta prodleva je zdrojem problémů u T8. ... V praxi stejně ke kolizi dojde málokdy a když k ní dojde tak ověřením ji mohu obnovit ze zálohy.
Jestli se bavíme o situaci kdy máš soubor zamknutý, tak dokážeš ty "problémy" a "kolize" ke kterým dojde málokdy nějak jednoduše pojmenovat? Z toho co jsi psal před tím jsem to nepochopil. Jediný "problém" co mě napadá by měl být ten "maximum execution time" o kterém jsem psal. A pokud ti dochází k jiným kolizím při zamknutém souboru, tak bych řekl, že to zamykání máš špatně, např. kvůli tomu file_exists o kterém psal Kid.

495
@exkalibr: Tak teď jsem se v tom tvém testování úplně ztratil. Jak můžeš do toho grafu zahrnout test "mkdir"? Vždyť to je zase nový test, který je napsaný zase trochu jinak a nechápu jeho spojení s těmi předchozími testy. Už před tím když jsi psal "V posledním testu se to zdálo jako překážka, tak jsem to usleep v T7 odstranil" jsem nechápal jak můžeš takový test do grafu výsledků zahrnout, přece když odstraníš prodlevu, tak tím ovlivníš i výsledný počet sekund, které se pak objevily v tom grafu. Asi jsem na grafy už moc starý :)

Zatím jsem si z tvého grafu odnesl jen to, že na nějakém (nevím jakém) filesystému se určité I/O příkazy v PHP buferují. Myslím, že u jiného filesystému se ale buferovat nemusí.

Mně by dávalo smysl udělat test, který by obsahoval několik funkcí a každá by používala jiný způsob zamykání (mkdir, rename, flock, semafory, ...) a vyhodnotil bych jejich rychlost. Ten nejrychlejší bych pak používal. Pokud by bylo zamykání dobře udělané, tak by si 1. funkce zamkla soubor a ostaní funkce (třeba i z jiných procesů) by čekaly a jediná chyba, která by se mohla objevit by bylo překročení "maximum execution time" (u PHP defaultně 30 sekund).

Stran: 1 ... 31 32 [33] 34 35 ... 44