荆轲刺秦王
条件:
- 当需要一个脚本操作而需要阻塞另外的脚本操作时,需要用到文件锁。
锁操作流程:
- 先加锁,检测锁是否加成功,如果成功再使用!
operation
- LOCK_SH 取得共享锁(读取的程序)
- LOCK_EX 取得独占锁(写入的程序)
- LOCK_UN 释放锁定 (无论共享或独占)
- LOCK_NB 在flock()锁定时不阻塞
解锁:在 PHP 5.3.2版本之前,锁也会被 fclose() 释放(在脚本结束后会自动调用),现在只能通过 flock( $handle, LOCK_UN ); 手动解锁
例子:
function tailFile( $file, $lines )
{
$handle = fopen($file, "r");
if( flock( $handle, LOCK_SH ) )
{
$linecounter = $lines;
$pos = -2;
$beginning = false;
$text = [];
while ($linecounter > 0) {
$t = " ";
while ($t != "\n") {
if (fseek($handle, $pos, SEEK_END) == -1) {
$beginning = true;
break;
}
$t = fgetc($handle);
$pos--;
}
$linecounter--;
if ($beginning) {
rewind($handle);
}
$text[$lines - $linecounter - 1] = fgets($handle);
if ($beginning) {
break;
}
}
flock( $handle, LOCK_UN );
}
fclose($handle);
//return array_reverse($text); // 5,6,7,8,9
return $text;
}
两种情况:
1.阻塞(等待)模式:(只要有其他进程已经加锁文件,当前进程会一直等其他进程解锁文件)
if( flock( $fp, LOCK_EX ) ) {}
2.非阻塞(等待)模式:(只要有其他进程已经加锁文件,当前进程不会等其他进程解锁文件直接返回)
if( flock( $fp, LOCK_EX | LOCK_NB ) )