Kom ihåg mig?
Home Menu

Menu


PHP låst fil går att ta bort och data försvinner

Ämnesverktyg Visningsalternativ
Oläst 2007-02-12, 11:32 #1
Blackexs avatar
Blackex Blackex är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 238
Blackex Blackex är inte uppkopplad
Medlem
Blackexs avatar
 
Reg.datum: Jun 2006
Inlägg: 238
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?
Blackex är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-02-12, 12:50 #2
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
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()).
hnn är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-02-12, 16:40 #3
wedges avatar
wedge wedge är inte uppkopplad
Medlem
 
Reg.datum: Mar 2004
Inlägg: 180
wedge wedge är inte uppkopplad
Medlem
wedges avatar
 
Reg.datum: Mar 2004
Inlägg: 180
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.
wedge är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-02-12, 16:48 #4
Blackexs avatar
Blackex Blackex är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 238
Blackex Blackex är inte uppkopplad
Medlem
Blackexs avatar
 
Reg.datum: Jun 2006
Inlägg: 238
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?
Blackex är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-02-12, 17:02 #5
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
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...
hnn är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-02-12, 17:13 #6
wedges avatar
wedge wedge är inte uppkopplad
Medlem
 
Reg.datum: Mar 2004
Inlägg: 180
wedge wedge är inte uppkopplad
Medlem
wedges avatar
 
Reg.datum: Mar 2004
Inlägg: 180
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.
wedge är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-02-12, 17:16 #7
Blackexs avatar
Blackex Blackex är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 238
Blackex Blackex är inte uppkopplad
Medlem
Blackexs avatar
 
Reg.datum: Jun 2006
Inlägg: 238
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.
Blackex är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 05:50.

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