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 - Filip Jirsák

Stran: 1 ... 207 208 [209] 210 211 ... 375
3121
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 01. 07. 2018, 07:43:01 »
Výsledek je stejný.
V tom případě jste nezkoušel tu variantu s posix_get_last_error(), protože ta funkce vrací číslo, takže nemůže být výsledek stejný, jako když zavoláte variantu s funkcí error_get_last(), která vrací pole.

Pokud by vám i posix_get_last_error() vracela, že k žádné chybě nedošlo, máte smůlu, protože PHP mezitím zavolalo nějakou jinou POSIXovou funkci, která výsledek volání write() překryla.

3122
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 23:26:03 »
Radši vám ten opravený kód napíšu, jinak to bude na dlouho…

Kód: [Vybrat]
$tmpdir = sys_get_temp_dir();
$tmpname = tempnam($tmpdir, 'app-');
$handle = fopen($tmpname, 'a');
 
// velikost $s je obvykle 2096 bajtů
function write($handle, $s)
{
    $len = strlen($s);
    while ( $len > 0 )
    {
        $wrote = fwrite($handle, $s);

        if ( $wrote === false || $wrote == 0 )
        {
            var_dump(error_get_last());
            var_dump(posix_get_last_error());
            throw new RuntimeException('Zápis do souboru skončil chybou.');
        }

        $s = substr($s, $wrote)
        $len = strlen($s);
    }
}

3123
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 23:08:59 »
Máte ho hned v mém prvním příspěvku.
Ano, ale ten kód je špatně, tam netestujete, zda došlo k chybě. A nevolá se tam ani error_get_last() nebo posix_get_last_error().

3124
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 23:07:26 »
POSIX také specifikuje, za jakých okolností je možné zapsat méně než požadovaný počet bajtů
Kde to specifikuje?

3125
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 22:56:16 »
To jsem zkoušel. To mi vrací success.
Obě dvě? Voláte je až po té, co vám fwrite() vrátí false nebo 0? Bylo by lepší, kdybyste sem dal kód, který zkoušíte.

3126
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 22:48:23 »
A jak zjistím, jaká je to chyba?
Zkusil bych error_get_last() nebo posix_get_last_error().

3127
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 22:36:13 »
A já mám právě problém v tom, že mi to žádnou chybu nevrátí. To je to co řeším.
Že došlo k chybě zjistíte tak, že otestujete výsledek volání fwrite(), zda je to FALSE nebo 0. Když funkce vrátí hodnotu větší než nula, opakujete její volání v cyklu a zapíšete další část.

3128
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 22:16:49 »
fwrite v PHP při záporné návratovce write vrací nulu. Šlo by si s tím hrát, ale prakticky nemá smysl to hned vyhodnodit jako konečnou chybu.
Díky, konečně někdo napsal, jak to je, ne jen nějaké dohady.

Předpokládám, že to byl překlep, a že jste chtěl napsat, že 0 jako návratová hodnota PHP fwrite() by měla být hned vyhodnocena jako chyba.

Každopádně mi to teda připadá jako dost zásadní chyba v dokumentaci PHP. Jednoduché porovnání fwrite() == FALSE sice bude fungovat díky automatickému přetypování, ale třeba už to, co je tam uvedené jako příklad, kvůli === fungovat nebude.

3129
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 21:58:53 »
POSIXový write() může vrátit 0 v případě, že velikost zapisovaných dat byla 0. Pokud OS nemůže nic zapsat v případě neprázdných argumentů, má vrátit chybu EAGAIN, aby program mohl počkat přes select() (nebo podobnou funkci) na to, až zápis bude možný. Kdyby vracel 0, tak by to skončilo bez kontroly v busy loop.
POSIXový write může vrátit 0 i v případě, že je požadován zápis nenulového počtu bajtů. A znamená to jen, že bylo zapsáno nula bajtů – není to chyba.

Citace
On success, the number of bytes written is returned (zero indicates nothing was written).  It is not an error if this number is smaller than the number of bytes requested; this may happen for example because the disk device was filled.  See also NOTES.

On error, -1 is returned, and errno is set appropriately.

Vrácení 0 by měl být výjimečný případ, ale počítá se mezi úspěšné výsledky volání. Nekonečnému cyklu zabrání to, že takový stav by byl jen dočasný, a v některém z příštích cyklů by write mělo něco zapsat nebo skončit chybou.

3130
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 21:35:04 »
Pokud je plnej disk, tak to fwrite() neeviduje jako chybu.
Takže pokračuje v zápisu za konec disku? Nebo co přesně fwrite() vrátí, když je plnýdisk?

A jako vůbec, von se tu dotyčný táže, jak zjistit že je nějaká chyba, a vy mu radíte, že má blbě algoritmus, kterej nakonec opravíte do ještě horšího stavu. To myslíte vážně?
Ne, ten algoritmus byl špatně a tvrdil, že došlo k chybě, i když to není pravda. Když se bude volat fwrite() v cyklu a testovat, zda se něco zapsalo nebo došlo k chybě, bude to fungovat správně.

Vy už byste se k tomu měl přestat vyjadřovat, když je pro vás nepochopitelný i obyčejný cyklus, nemáte k tomu co říci.

3131
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 21:26:48 »
Děti ve školce znají věc jako zacyklení. Ty ne?
K zacyklení dojde jedině tehdy, pokud v cyklu není nikdy splněna podmínka, která by cyklus ukončila.

Teda „programátor“, který se bojí používat cykly, protože neumí napsat ukončovací podmínku, to je fakt něco.

Takže doporučuješ kód, který v případě, že dojde místo na disku, tak se zacyklí?
Z mých komentářů nic takového neplyne. Pokud funkce fwrite() v PHP je implementovaná tak, jak je popsaná v dokumentaci, vrátí v případě zaplnění disku FALSE. I kdyby fungovala jinak a v případě chyby mohla vracet i nulu, pořád se akorát ten test na úspěch funkce upraví tak, zda vrátila hodnotu větší než nula.

Furt lepší, než co navrhuješ ty.
Ne, kód, který občas náhodně nefunguje, není lepší.

3132
Vývoj / Re:Pomoc při sestavení XPath v HTML DOM
« kdy: 30. 06. 2018, 21:07:38 »
Např. b[1]/following-sibling::text()[1] (první textový uzel, který je následujícím sourozencem prvního elementu b) nebo br[1]/preceding-sibling::text()[1] (první textový uzel, který je předchozím sourozencem prvního elementu br).

3133
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 21:02:02 »
Nemůžeš tu podmínku hodit do cyklu.
Nízkoúrovňové čtení nebo zápis z/do streamnů (soubory, sokety apod.) vždy může zpracovat menší množství dat, než bylo požadováno, proto se musí opakovat v cyklu. To snad vědí programátoři už ve školce.

Musíš testovat, zda návratová hodnota je větší jak 0 - jak píše @kvr kvr, pak teprve můžeš zkusit zapsat znova.
U toho nízkoúrovňového zápisu představuje chybu jen záporná hodnota. Je možné, že PHP to má zařízené tak, aby se vždy zapsal alespoň jeden bajt, a nula také znamená chybu, ale pak je vážná chyba v dokumentaci, že to tam není napsané.

@andreaw.fean zvolil opačnou strategii, a při neúspěchu prostě končí - což je v pořádku.
V pořádku ovšem není, že končí chybou i v případě úspěšného (částečného) zápisu.

Ty posixový funkce nefungují.
Jasně, vy jste expert na všechno a chyba je v Linuxu nebo jakou implementaci POSIXu myslíte. To sedí od někoho, kdo ani neví, jak zkopírovat data z jednoho souboru do druhého.

Sečteno a podtrženo problém je v tom, že tvá rada byla úplně špatná.
Že vám programování moc nejde jsem pochopil už v sousední diskusi. Že nezvládnete ani takovéhle základy a nechápete, v čem je problém, to mne překvapilo. Vaše hodnocení mých rad je mi tím pádem úplně jedno.

3134
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 19:37:47 »
fwrite() return values jsou docela zmatené, obojí false a 0 znamenají chybu. false je chyba v parametrech, zatímco 0 je chyba provádění (typicky chyba vrácená OS - out of space apod.). Více detailů první komentář v dokumentaci.
Ten komentář je 8 let starý, chování se mohlo změnit. Připadá mi divné, že by se za 8 let tak zásadní chyba v dokumentaci neopravila. Ale neověřoval jsem to.

0 jako korektní hodnota je nesmysl, protože vždycky se musí něco zapsat.
Je možné, že nadstavba PHP chování mění, ale standardní POSIXový write může vrátit i nulu jako normální hodnotu – zapsat se nic nemusí. Při nedostatku místa OS vrátí -1 a v errno bude ENOSPC.

Při zápisu do souboru se bude OS snažit zapsat vše, ale nemusí se mu to podařit. O to je to horší, že to bude skoro vždy fungovat, ale pak se někdy „nepochopitelně“ zapíše jen část.

3135
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 18:54:27 »
Doufám @andreaw.fean, že tě nenapadne se jeho radou řídit :-)
Bacha na to, povídat si sám se sebou, to už je nemoc…

Stran: 1 ... 207 208 [209] 210 211 ... 375