Funkce flock()
7 příspěvků
Archiv diskusního fóra
Fórum je uzavřené a slouží pouze ke čtení. Některé informace mohou být zastaralé.
-
Přeji dobrý den, soubor, který budu načítat skriptem, bude na severu pravidelně aktualizován prostřednictví FTP. Jak je realná možnost kolize čtení ze souboru a kopírování aktualizované verze? Je možné ošetřit tuto situaci pomocí funkce flock()?
-
IMHO ano: http://www.webzdarma.cz/forum/read.php?f=2&i=20897&t=20872
-
Akorát si dej pozor na varování z manuálu: "Na většině operačních systémů je funkce flock() implementována na úrovni procesů. Při použití multithreadového serverového API (jako je ISAPI) nemůžete spoléhat na ochranu souborů proti jiným PHP skriptům běžícím v paralelních vláknech stejné instance serveru!" http://us2.php.net/flock
-
flock neni 100% uplne nejlepsi je zapisovat do souboru v rezimu append a pak jej (pokud to potrebujeme) pri vypisu obratit resp. nechat ho zobrazit od konce napr. $my_file = file("nejaky soubor"); $my_file = array_reverse($my_file); echo $my_file;
-
Děkuji za reakce, to s tím "Na většině operačních systémů je funkce flock() implementována na úrovni procesů..." jsem v manuálu PHP také četl. Já chci soubor pouze číst a to asi dělá situaci jednodušší. Pokud by ke kolizi mělo dojít, tak ne s jiným PHP skriptem ale s procesem, který prostředníctvím FTP zapisuje novou verzi čteného souboru, a které běží na nějakém paralelním vlákně (asi ?).Možná to ani problém není a ve fs serveru je to nějak ošetřeno
-
Flock je v tomto případě zbytečný, viz man flock: flock(2) places advisory locks only; given suitable per- missions on a file, a process is free to ignore the use of flock(2) and perform I/O on the file. S dodatkem, že ftp server bude flock vytvořený na souboru pomocí PHP při updatu souboru téměř jistě ignorovat. Na druhou stranu bych si s tím zas tak nelámal hlavu, protože u read/write kolize nemůže dojít ke ztrátě/zničení dat.
-
Asi ano, setkal jsem se s názorem, že FTP soubory při aktualizaci nezamyká a výsledek kolize bude načtení části souboru a tak asi bude stačit, když budu testovat jestli se něco jako konec souboru