2012-08-04 41 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