Nejdřív jsi se tu točil na nějakém částečném zápisu, což ale problém vůbec nebyl. Ono totiž PHP, jak se zdá, tu smyčku dělá už interně ve funkci, kterou volá ten fwrite(): https://github.com/php/php-src/blob/master/main/streams/streams.c#L1080
Normální je programovat proti specifikaci funkce, ne proti tomu, jak je aktuálně naimplementovaná. Když je zdokumentováno, že funkce vrací počet zapsaných bajtů, plyne z toho, že nemusí zapsat vše (zvlášť když je to obvyklé chování funkcí zapisujících do streamu). Když si někdo zjistí, že zrovna v jeho verzi ta funkce zapíše vše nebo vrátí chybu, naprogramuje podle toho svůj kód, a pak se chování funkce změní (ale bude pořád v souladu s dokumentací), bude mít v programu chybu, v tomto případě navíc těžko odhalitelnou (protože bude nastávat jen někdy).
Že ta PHP funkce
fwrite() funguje úplně jinak, než je popsáno v dokumentaci, je dost zásadní chyba. Pokud to tazatel věděl, měl to napsat. Jinak bývá dobrým zvykem hledat chybu nejprve ve svém kódu a teprve pak v knihovnách. A ten kód andreaw.fean je špatně, a to i v případě, když bude počítat s tím, že tu smyčku dělá
fwrite() interně.
Kdybys měl alespoň trochu ánunk o tom, o čem píšeš, tak by ti došlo, že posix_get_last_error() je z POSIX modulu, tedy funguje jen pro jeho funkce. Ty se vyznačují tím, že mají prefix posix_. No a jak si můžeš všimnout, funkce fwrite() ten prefix nemá. Takže na ni posix_get_last_error() logicky nefunguje a tedy to co jsi psal, je totální hovadina.
Dalo se předpokládat, že
fwrite() interně volá nativní funkci
write(), která je definovaná POSIX standardem, a která v případě neúspěchu ukládá chybový kód do
errno. Funkce
posix_get_last_error() mohl být způsob, jak
errno přečíst.
Hele a tohle jsi v praxi ověřoval? Řek bych že ne a zase jen plácáš ty svoje neověřený teoretický nesmysly. PHP prostě žádný chybový kód nenastaví. Ani při prvním, ani při jakémkoli dalším volání.
Ten kód, tak jak je napsaný, nejdřív předpokládá, že když se nezapíše vše, je to hned chyba, a vzápětí se pokusí zapsat ještě zbytek. Při jaké konstelaci tenhle kód dává smysl?
Ověřit to chování měl andreaw.fean, on měl prostředí, kde k nějaké chybě docházelo. Když se mně nepodaří nasimulovat případ, že by
fwrite() vrátilo menší počet zapsaných bajtů, než byl počet bajtů k zápisu, v žádném případě to neznamená, že mám počítat s tím, že to nemůže nikdy nastat. Přesně na základě takovýchto předpokladů vznikají programy, které pak různě náhodně padají.
To, že PHP žádný chybový kód nenastaví bylo potřeba zjistit – buď zkoumáním zdrojáků, nebo testem. Ten test je ovšem potřeba provést tak, aby vůbec byla šance, že tu chybu nastaví. Tvrdit, že funkce
fwrite() chybu nenastavuje, na základě kódu, který nastavení chyby neumí zjistit, je dost
odvážné. A nic na tom nemění fakt, že se nakonec (úplně jiným způsobem) ukázalo, že
fwrite() opravdu chybu nenastavuje.
Kdyby se funkce
fwrite() chovala tak, jak je popsané v dokumentaci, ten kód andreaw.fean by se choval přesně tak, jak popisoval – tj. žádnou chybu by to nevypsalo. Stačilo by ten kód opravit. Že se nakonec
fwrite() chová úplně jinak je dost problém, a vzhledem k této diskusi je to jen náhoda. Kdyby andreaw.fean ten svůj kód opravil, vzápětí by se přišlo na to, že
fwrite() funguje špatně – a mohlo by se to řešit. Místo toho se tu pořád dokola řešilo, že vlastně nikdo neví, jak vlastně ten kód funguje. Vždyť andreaw.fean ani nebyl schopen napsat, jestli mu to volání
fwrite() vrací
FALSE,
0 nebo nějakou kladnou hodnotu. To by hledání chyby značně urychlilo, protože kdyby opakovaně vracelo
0, bylo by jasné, že se to chová jinak, než je zdokumentováno.
Nakonec se tedy strašně dlouhou a klopotnou cestou skládání náhodných úryvků kódu dospělo k řešení, se kterým je andreaw.fean spokojen. Je ale velmi smutné, kolik lidí tady v diskusi vůbec nepochopilo, proč je ten původní kód špatně, a vlastně jim je úplně jedno, že to nechápou – prostě ten kód zkouší náhodnými výstřely měnit, a když jim to jednou udělá, co chtějí, jsou spokojení, a mají pocit, že je kód správně. A ještě mají pocit, jací jsou machři. Už se vůbec nedivím, že BoneFluteovi jednotkové testy vůbec nepomáhají – pokud testuje jenom to, co mu zrovna spadlo pod rukama, a vůbec nechápe, co jeho kód vlastně dělá a kde jsou potenciální chyby, jednotkové testy mu opravdu nijak nepomůžou.