Zajímalo mě jak je to s bezpečností funkcí file_get_contents/file_put_content vs flock/fread/fwrite/flush při hromadném přístupu k téže souboru. Jelikož jsem nikde na netu nenašel žádné informace, které by mi jednoznačně a definitivně vyloučili možnost selhání (např. vzniku vadného souboru, ztráty dat apod.) při čtení/zápisu pomocí prvních dvou zmíněných funkcí, tak jsem se újmul toho, že jsem udělal testy. Test jsem nahrál na vzdálený server a otestoval jsem stránku (skript): spustil jsem stejný požadavek 4x paralelně, abych zjistil jak rychle dokáže vzdálený server načítat a zapisovat data na pevný disk.
Kompletní popis testu a výsledků je v angličtině zde:
https://stackoverflow.com/questions/58351839/is-file-get-contents-file-put-contents-reliable-or-can-lead-to-loss-of-data-bgraf zde:
První tři testy T2, T3, T4 probíhaly s file_read_contents/file_write_contents, z toho jen T2 vykazuje takovou rychlost, která svědčí o faktickém čtení z disku (nikoliv z bufferu). T3 a T4 měly tak malé časy, že na grafu téměř nejsou vidět.
Pak je tam T5, T6 a T7 což je použití flock, fread, fflush + ověření správnosti zadaných dat, občas se selháním a následným obnovením souboru pomocí copy(). Všechny funkce měly smyčku s 50 cykly a prodlevu smyčky 50 microsekund. V posledním testu se to zdálo jako překážka, tak jsem to usleep v T7 odstranil.
Z výsledku mi vyplývá, že první dvě zmíněné funkce používají buffering a není na ně spoleh pokud jde o konkurenční zápis do spouboru. Při paralelním přístupu je třeba použít metodu flock, ffread, fflush, fwrite.
Zajímá mě, jestli mi tu můžete potvrdit správnost závěrů ke kterým jsem došel. Případně, pokud by byl zájem o zdrojáky testů, mohu poskytnout. Ale zajímá mě hlavně váš pohled na to, zda ten test má nějakou vypovýdající hodnotu. Jelikož jsem měl k dispozici 4 sady dat z každého testu, celkem 7*50*4 čísel, měl jsem dostatek čísel ke zhodnocení průměrů časů, odchylek, minimum a maxim, vytvoření grafů. Dělat další testy v oblasti prvních zmíněných funkcí mi už dál nepřipadalo užitečné, protože jsem nepřišel na to jak je donutit aby zapsaly celý obsah zásobníku do souboru (nebo aby si ten soubor skutečně přečetly z disku a ne z bufferu).