2013-03-08 34 views
4

在我的php代码中,我想创建一个读写器代码。所以会有一个php代码会读取或写入的文件。只能有一个作家,或者可以有很多读者,但是你可以同时书写和阅读。如何在PHP中使用群集?

这怎么可以在PHP中完成?我相信你需要使用flock的代码?

+2

你想知道什么不在第一个例子涵盖http://au1.php.net/manual/en/function.flock.php – Danack 2013-03-08 23:51:39

回答

8

我与Danack's comment - 的flock()php documentation包含一个很好的例子:

$fp = fopen("/tmp/lock.txt", "r+"); 

if (flock($fp, LOCK_EX)) { // exclusive lock will blocking wait until obtained 

    fwrite($fp, "Write something here\n"); 

    // or ... 

    execute_code_that_shouldnt_run_twice_at_the_same_time(); 

    flock($fp, LOCK_UN); // unlock 
} else { 
    echo "failed to obtain lock"; 
} 

fclose($fp); 

注意flock()在默认模式下会阻塞等待,直到它可以获得锁。如果其他进程当前获得锁定,则情况就是这样。


但是,不要指望从flock()功能太多。它正在使用所谓的咨询锁,这可以被其他进程忽略。在Linux例如PHP的flock()正在使用内核函数flock()man 2 flock解释它是如何工作的:

羊群()只放在咨询锁;给予 文件的适当权限,进程可以忽略使用flock()并在文件上执行 上的I/O。

含义flock()只会给其他进程的建议。如果他们不关心他们可以读取甚至写入,而不管锁(或锁的类型)如何。然而,手册页是关于Linux的其他系统可能会以不同的方式处理。 (实际情况并非如此)

但是,由于您是进程的编码器,因此每次访问文件时都可以使用flock()来关注锁定。但是你不能确定另一个进程 - 如文本编辑器 - 不会覆盖你的文件

+0

这个代码是否允许多人从文件在同一时间?另外,如何在开始写入之前检测文件是否正在读取? – omega 2013-03-08 23:58:44

+0

@omega是的,允许其他进程读写文件(!)。他们可能无法获得锁定。以前不知道 – hek2mgl 2013-03-09 00:16:38

+0

@omega检查我的更新 – hek2mgl 2013-03-09 00:27:54

0

如果你想同时读写,那么你不能。这是不安全的行为。只需使用独占锁来写入,并且您的读者(使用共享锁)将在等待读取时阻塞。这样他们永远无法从零件完成的文件中读取数据,但总是能够最终读取。

哦,不要锁定文件的时间超过您的需要。如果您要进行长时间的更改(例如等待网络活动),请锁定它,更新,解锁,等待,直到获得更多数据,锁定它,更新,解锁。或者更好的是,内部缓冲数据并一次写入。