php多进程读写同一个文件锁的问题

时间:2021-09-08 14:44:24

php是原生支持多进程编程的,可以利用pcntl_fork()在当前位置产生一个子进程,那么就可能存在多个进程读写同一个文件的问题,比如多进程程序读写同一个日志文件,这样就有必要解决读写同一个文件时加锁的问题,php已经内置了一个读写的文件锁方法flock,,官方的解释是轻便的文件咨询锁定,这很官方。


还是先看一个栗子吧:

<?php

$fp = fopen("logs/app.log", "a+");

if (flock($fp, LOCK_EX)) { // 进行排它型锁定
fwrite($fp, "Write something here\n");
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "文件正在被其他程序占用";
}

fclose($fp);

?>

flock的第一个参数是一个文件句柄,第二个参数可以设置锁定方式,有几个常量可以设置,下面一一介绍。

LOCK_SH : 取得共享锁定(读取的程序)也就是常说的共享锁,该进程只能读不能写,其他进程还是能读取该文件的。

LOCK_EX:取得独占锁定(写入的程序)常说的独占锁,该进程能读写该文件,其他进程则不能读写。

LOCK_UN:释放锁定(无论共享或独占)也就是释放上述两种锁。

LOCK_NB:配合LOCK_SH和LOCK_EX使用,使得在加锁时程序非阻塞。


下面用几个示例简单说明下: