2012-08-04 42 views
2

好吧,好吧..所以現在我嚇壞了。PHP文件同時訪問

index1.php

<? 
function write_file($filepath,$filecontent) { 
    $openedfile = fopen($filepath,"w+"); //replace with $openedfile = fopen($filepath,"a"); just in case 
    flock($openedfile, LOCK_EX); 
//add here fclose($openedfile); to work 
//add here $openedfile = fopen($filepath,"w+"); to work 
    fwrite($openedfile,$filecontent); 
    flock($openedfile, LOCK_UN); 
    fclose($openedfile); 
} 
function read_file($filepath) { 
    $openedfile = fopen($filepath,"r+"); 
    flock($openedfile, LOCK_SH); 
    sleep(10); 
    $filecontent = file_get_contents($filepath); 
    flock($openedfile, LOCK_UN); 
    fclose($openedfile); 
    return $filecontent; 
} 
write_file("Readme.txt","test 1"); 
$f1 = read_file("Readme.txt"); 
echo $f1; 
?> 

index2.php

<? 
function write_file($filepath,$filecontent) { 
    $openedfile = fopen($filepath,"w+"); //replace with $openedfile = fopen($filepath,"a"); to work 
    flock($openedfile, LOCK_EX); 
//add here fclose($openedfile); to work 
//add here $openedfile = fopen($filepath,"w+"); to work 
    fwrite($openedfile,$filecontent); 
    flock($openedfile, LOCK_UN); 
    fclose($openedfile); 
} 
function read_file($filepath) { 
    $openedfile = fopen($filepath,"r+"); 
    flock($openedfile, LOCK_SH); 
    $filecontent = file_get_contents($filepath); 
    flock($openedfile, LOCK_UN); 
    fclose($openedfile); 
    return $filecontent; 
} 
write_file("Readme.txt","test 2"); 
$f1 = read_file("Readme.txt"); 
echo $f1; 
?> 

我index1.php運行,然後2秒後我運行index2.php。 Index2.php等待index1.php如預期但index1.php示出了10秒後什麼都沒有,而index2.php顯示「測試2」。 發生了什麼事?

編輯:我想通了:d。我的第二個PHP改變

$openedfile = fopen($filepath,"w+"); 

$openedfile = fopen($filepath,"a"); 

而且不抹在index2.php執行readme.txt文件了。

+0

看起來你釋放鎖之前寫入文件。另見['fflush'](http://de.php.net/fflush)。 – hakre 2012-08-04 09:46:13

回答

1

這難道不是有做一些與事實的readme.txt文件實際上是空的時間很短的時間,當你打開它寫入文件?我認爲PHP拿出整個文本,而不是用整個文本+添加替換它。當index1.php想要讀取文件時,index2.php可能已經清除了它?順便說一下,你可以在apache日誌中檢查它。

編輯:另外,解鎖文件後立即,index2.php會控制它,覆蓋測試1測試2

+0

你說得對。我運行index2.php後再次檢查並且readme.txt爲空。我很想念引線,因爲年初的時候我通過FTP檢查readme.txt文件(服務器不在本地)被執行index2.php後,readme.txt文件中包含「測試1」。 FTP有一些緩存或一些東西? – user148823 2012-08-04 09:46:14

+0

FTP?在你的問題中沒有提到你提到這與FTP有關。是的,FTP做的事情不同於本地文件系統,因爲它只是一個協議和一個服務器與之交談。然後它依賴於FTP服務器,它的配置究竟發生了什麼。檢查您的FTP服務器的配置和文檔,以瞭解如何影響其行爲。 – hakre 2012-08-04 09:49:49

+0

不是我真的知道。但是,將readme.txt的內容放在數據庫中可能更簡單/更省錢!編輯和更改速度更快。 – 2012-08-04 09:49:54