使用PHP开发,对于单机应用,面对普通的并发请求,可以使用文件锁flock()对文件进行加锁,实现按顺序执行。
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
- handle: 已打开的文件句柄
- operation: 操作类型
LOCK_SH取得共享锁定(读取的程序)
LOCK_EX 取得独占锁定(写入的程序)
LOCK_UN 释放锁定(无论共享或独占)
LOCK_NB 如果不希望 flock() 在锁定时堵塞(Windows 上还不支持)
- wouldblock: 设置为true的时候,锁定文件时,会阻止其他进程(Windows 上不支持)
阻塞模式(后面的进程会一直等待前面的进程执行完毕)
function doSomething()
{
$file = fopen('/path/to/lock.txt', 'w+');
//加锁
if (flock($file, LOCK_EX)) {
//TODO 执行业务代码
flock($file, LOCK_UN);//解锁
}
//关闭文件
fclose($file);
}
非阻塞模式(只要当前文件有锁存在,那么直接返回)
function doSomething()
{
$file = fopen('/path/to/lock.txt', 'w+');
//加锁
if (flock($file, LOCK_EX | LOCK_NB)) {
//TODO 执行业务代码
flock($file, LOCK_UN);//解锁
} else {
//TODO 执行其他业务代码
}
//关闭文件
fclose($file);
}
Categories: PHP