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 - A. F.

Stran: 1 2 3 [4]
46
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 02. 07. 2018, 13:26:46 »
Výsledek je stejný.
V tom případě jste nezkoušel tu variantu s posix_get_last_error()...

Jestli on tazatel nemyslí, že výsledek je stejný, tedy i s touto implementací mu došlo na disku místo ;-)

Tak já myslím, že se od Filipa Jirsáka kromě siláckých řečí nic zajímavého nedozvím. Všechno mu to musím vysvětlovat po lopatě a nic z toho.

Tak jsem tam zatím jen upravil hlášku, kontroluju místo na disku pomocí disk_free_space(). Nic lepšího asi nevymyslíme.

Kdyby někoho ještě napadl nějaký způsob, třeba nějaká zahrabaná globální proměnná, nebo tak něco.

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

Výsledek je stejný.

48
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 23:01:00 »
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.
Máte ho hned v mém prvním příspěvku.

49
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 22:51:35 »
A jak zjistím, jaká je to chyba?
Zkusil bych error_get_last() nebo posix_get_last_error().
To jsem zkoušel. To mi vrací success.

50
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 22:39:28 »
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.
A jak zjistím, jaká je to chyba?

51
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 22:27:16 »
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. 0 jako korektní hodnota je nesmysl, protože vždycky se musí něco zapsat. V případě, že by došlo k blokování a je nastaven NONBLOCK, vrací se chyba EAGAIN. Předpokládám, že v rámci "kompatibility" je dobré ošetřít false a 0 stejně :-)

V tom kódu je třeba zpracovat error_get_last na místě, kde se vyhazuje výjimka, tam se vrátí asi finální chyba. Kromě toho jsou tam k opravě následující:
  • loop while writte != 0 místo jednoho if (i když technicky vzato běžné OS zapíšou všechno co jde, pokud jde o normální soubor, jinak je to u pipe, socket apod)/li]
    • nevím, jak je to u php s konverzí znakových sad a DOS/UNIX konverzí, soubor musí být v každém případě otevřen jako binary.
    • ... a podobně jako v předchozím - viz poslední argument, který vypíná magic chování, které rovněž může ovlivnit délku zápisu.
Tak v mém případě se jedná o normální soubor, takže předpokládám, že netřeba to prožívat.

A já mám právě problém v tom, že mi to žádnou chybu nevrátí. To je to co řeším.[/list]

52
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 21:25:40 »
Mimo špatného "algoritmu", je $handle globalní proměnná, která v té funkci write není vidět, takže by to nemělo fungovat vůbec a případně ještě řvát.

Jinak je v PHP taky funkce file_put_contents, která tě takového šaškování zbaví.
To jsem to jen špatně přepsal.

file_put_contents se mi nehodí, protože pracuji s tím handle. A pokud je to tak jak píše BoneFlute, že stejně jen vypíše chybovku na výstup, tak se mi to nehodí už vůbec a nebudu to tedy přepisovat.

53
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 19:04:23 »
Opakování zápisu je použito už v tom kódu
Ne, není. Jak jste přišel na to, že při druhém volání se zapíše vše? Volání se musí opakovat tak dlouho, dokud nejsou zapsaná všechna data. Používají se k tomu cykly.
Doufám @andreaw.fean, že tě nenapadne se jeho radou řídit :-)
Udělat si tam cyklus? Nejsem blbej.

Problém skutečně byl v tom nedostatku místa.
Přidal jsem si tam test pomocí funkce disk_free_space. Problém to nevyřeší, ale budu vědět co je to za problém.

54
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 17:32:11 »
Kód: [Vybrat]
$len = strlen($s);
$wrote = fwrite($handle, $s, $len);
To by bylo hloupé, ale zkusím to.

Klidně to zkuste, ale ničemu to nepomůže, protože třetí parametr funkce fwrite je nepovinný, a pokud není uveden, zapisuje se celý řetězec. Tedy uvedený kód je ekvivaletní s tímhle:

Kód: [Vybrat]
$wrote = fwrite($handle, $s);
Nebývá špatné přečíst si dokumentaci, pak se nemusíte ptát na věci, které jsou tam napsané.

Děkuji za příspěvek. Stále nechápu jak by mi mohl alespoň vzdáleně pomoci s mým problémem. Opakování zápisu je použito už v tom kódu, nevím tedy proč mi to doporučujete. Cožpak jste ten kód nečetl, než jste psal svou radu?

55
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 16:50:39 »
Kód: [Vybrat]
$len = strlen($s);
$wrote = fwrite($handle, $s, $len);
To by bylo hloupé, ale zkusím to.

56
Vývoj / Re:Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 16:38:19 »
Funkce fwrite negarantuje, že zapíše všechny znaky. Musíte si posouvat ukazatel v řetězci a opakovat funkci tak dlouho, dokud nezapíše vše. Pokud by došlo k chybě, vrací fwrite FALSE.

Nechápu, jak to souvisí s mojí otázkou?

57
Vývoj / Zjištění chyby při neúspěchu fwrite()
« kdy: 30. 06. 2018, 15:18:47 »
Ahoj.

Načítám celkem velký objem dat (několik giga) po kouskách o velikosti typicky 2096 bajtů. A následně ho zapisuju do souboru v tempu:
Kód: [Vybrat]
$tmpdir = sys_get_temp_dir();
$tmpname = tempnam($tmpdir, 'app-');
$handle = fopen($tmpname, 'a');
 
// velikost $s je obvykle 2096 bajtů
function write($s)
{
    $len = strlen($s);
    $wrote = fwrite($handle, $s);
    if ($len !== $wrote) {
        echo "\n\nERROR: Nesedí počet zapsaných bytů. C1 {$wrote} ~ {$len}\n\n"; // "419 ~ 2096"
        var_dump(error_get_last()); // nic
 
        $wrote2 = fwrite($handle, substr($s, $wrote));
        if ($wrote2 !== ($len - $wrote)) {
            echo "\n\n{$s}\n\n"; // zde vidím, že to není poslední záznam. Je to uřízlé uprostřed textu.
            throw new RuntimeException('Nesedí počet zapsaných bytů. C2 ' . "{$wrote2} ~ " . ($len - $wrote) ); // "0 ~ 1677"
        }
    }
}

Celé mi to chcípne na tom, že nesedí počet zapsaných bajtů. Je možné, že mi třeba došlo místo v tempu, nebo tak něco. Ale vadí mi, že mi to nevypíše žádnou chybu.

Otázka tedy zní, jak zjistím, co se stalo?

Děkuji za odpověď.

58
Vývoj / Rozdíl mezi „type“ vs. „data type“
« kdy: 07. 02. 2017, 15:13:27 »
Ahoj.

Při čtení https://en.wikipedia.org/wiki/First-class_citizen jsem narazil na rozlišení "first-class type" a "first-class data type". Nic moc jsem o tom dál nedočetl. Můžete mi vysvětlit jaký je v tom rozdíl? Jaký je vlastně rozdíl mezi "type" versus "data type"?

Díky.

Stran: 1 2 3 [4]