Menu Home

PHP 文件锁

使用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

Tagged as:

muzi