Zjištění chyby při neúspěchu fwrite() rubrika: Programování: PHP

5 Andreaw Fean
položil/-a 30.6. 15:12

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:

$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ěď.

odkaz
5 Andreaw Fean
odpověděl/-a 3.7. 15:51

Tak jsem se dozvěděl, že to podle všeho nejde nijak zjistit. Pokud fwrite() nemůže zapsat, protože typicky došlo místo, tak vrátí 0, a nikde nic nenastaví. Žádnou chybovku, nic. Funkce error_get_last() mlčí.

Komentáře

  • rmaslo : Zkusit se před zápisem mrknout přes disk_free_space kolik je tam místa. Což samozřejmě nic nezaručí protože ho může spotřebovat nějaký paralelní proces... 3.7. 18:53

Pro zobrazení všech 2 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.