WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   PHP låst fil går att ta bort och data försvinner (https://www.wn.se/forum/showthread.php?t=19280)

Blackex 2007-02-12 11:32

Kod:

if ($fp = @fopen($filename, 'a')) {
        if (flock($fp, LOCK_EX)) {
 
 # testar låset, detta borde inte fungera
 if (rename($filename, $filename.".old")) {
        echo "rename fungerade";
 }
 
 # skriver till filen
 if (fputcsv($fp, $minarray) === FALSE) {
        echo "skrivning fungerade inte";
 }
 flock($fp, LOCK_UN);
        }
        fclose($fp);
}

Det konstiga med ovanstående kod är

1) Låset fungerar inte! Jag lyckas flytta filen fastän det inte borde gå. Hur gör jag för att få rename att inte fungera om det finns ett lås?

2) Skrivningen till filen _verkar_ fungera. MEN, när jag kollar i filen så finns inget där. Anledningen är så klart att filen är flyttad. Men varför returnerar inte fputcsv FALSE?

hnn 2007-02-12 12:50

Ta bort alla @ och se vad den skriver ut...
Citat:

Originally posted by php.net@Feb 12 2007, 12:43
Not: Because flock() requires a file pointer, you may have to use a special lock file to protect access to a file that you intend to truncate by opening it in write mode (with a "w" or "w+" argument to fopen()).

wedge 2007-02-12 16:40

Tänk dig att filen är ett utedass.
Flock är nyckeln som hänger på väggen inne i stugan. För att få nyttja dasset tar man nyckeln och går dit. Finns inte nyckeln på väggen är dasset att betraktas som upptaget, och alla vet att då går man inte dit.
Oavsett var nyckeln befinner sig kan man jämna dasset med marken med en grävskopa.

I manualen står att läsa att flock är "advisory", och det fungerar endast då alla åtkomstförsök görs på samma sätt.
Flock är inte lösningen på att skydda filen från att bli omdöpt.

Blackex 2007-02-12 16:48

så om jag i ett annat program flockar filen innan jag använder rename, kan jag då vara säker på att ingen redan är på dass?

hnn 2007-02-12 17:02

wedge skrev ju det!

rename är grävskopan...
medans flock är nyckeln i stugan...

Sitter någon på dass, medans du kommer med grävskopan, så är bryr sig inte grävskopan om ifall det är tomt på dass eller inte... Den jämnar dasset med marken oavsett vem som är där inne...

wedge 2007-02-12 17:13

Förmodligen inte. Det kanske kan liknas vid att de nödiga är oerhört korkade, och när nyckeln återvänder springer de ut och sätter sig i den grop som grävskopan efterlämnat.

Flock vill ha en file handle, och det finns inget som hindrar att flera instanser samtidigt kör fopen mot samma fil. De har då redan hunnit med att öppna filen, men inte fått ett "riktigt lås".
Det borde gå om du kapslar in hela operationen med ytterligare ett lås som sätts på en dummyfil. Har du beviljats ett exklusivt lås på dummyfilen gör du som du vill med dasset. Filen, menar jag. Öppnar den eller byter namn på den eller whatever.
Det blir väl en sorts semaforimplementation, antar jag.

Blackex 2007-02-12 17:16

Jo jag förstod det. Det jag tänkte var att jag därför kan använda flock innan jag renemar. då borde jag vara säker på att ingen annan skriver till filen samtidigt. eller?

Kod:

if ($fp = @fopen($filename, 'a')) {
if (flock($fp, LOCK_EX)) {
 
 if (rename($filename, $filename.".old")) {
 echo "denna rename fungerade och jag är nu säker på att ingen annan skrev till filen samtidigt";
 }

 echo "släpper låset";
 flock($fp, LOCK_UN);
}
fclose($fp);
}

edit: wedge svarade samtidigt som mig. Ok. Så då får jag köra med ett extra lås helt enkelt, på en dummyfil.


Alla tider är GMT +2. Klockan är nu 16:17.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson