flock()

1. 定义

该函数为解决多进程对同一文件的读写冲突操作而产生(即使PHP多线程的支持度几乎为0)。它对一个文件进行简单的锁定/释放操作,当其他进程对这个文件加了flock锁,那么当前进程在不对该文件进行flock锁检测时,可以对这个文件直接操作。这个过程是非强制性、需要进程相互确认的,故也称为“咨询锁”,只影响调用了该函数的进程。 其参数可以选择加锁过程是“共享锁”还是“独占锁”,也可以释放锁定。

成功时返回TRUE,失败则返回FALSE。

2. 语法

flock ( resource $handle , int $operation [, int &$wouldblock ] ) : bool

3. 参数说明

参数 可选性 数据类型 描述
$handle 必需 资源类型 文件句柄,通过fopen()函数打开的文件资源
$operation 必需 整型或者常量名称 锁定操作选项
&$wouldblock 可选 整型 锁定阻塞时可选(Windows下不支持该选项),可被设置为TRUE

其中$operation参数可以是以下值:

  • LOCK_EX:EXCLUSIVE LOCK,独占锁定,不允许其他进程访问文件
  • LOCK_SH:SHARED LOCK,共享锁定,允许其他进程访问文件
  • LOCK_UN:释放锁定(解除锁定)
  • LOCK_NB:在非Windows系统下可用,设置文件在锁定时不阻塞

4. 示例

<?php

// flock()
// 对一个文件进行简单的锁定/释放操作

$handle = fopen(__DIR__.'/test.txt', 'a+');

fwrite($handle, date('Y-m-d H:i:s')." 加锁之前\n");

if(flock($handle, LOCK_SH)) {
    echo '文件锁定成功!',"\n";
} else {
    echo '文件锁定失败!',"\n";
}

// 进行排它型锁定:LOCK_EX
if (flock($handle, LOCK_EX)) {
    fwrite($handle, date('Y-m-d H:i:s')." 添加:排他锁/互斥锁:LOCK_EX\n");
    fflush($handle);

    flock($handle, LOCK_UN);// 释放锁定:必须手动执行!
    fwrite($handle, date('Y-m-d H:i:s')." 释放锁\n");
} else {
    echo "无法获取锁定!";
}

// 进行共享型锁定:LOCK_SH
if(flock($handle, LOCK_SH)) {
    fwrite($handle, date('Y-m-d H:i:s')." 添加:共享锁:LOCK_SH\n");
    fflush($handle);
    // flock($handle, LOCK_UN);// 释放锁定
} else {
    echo "无法获取锁定!";
}

fwrite($handle, date('Y-m-d H:i:s')." 未进行锁咨询\n");
fwrite($handle, "============================================\n");

flock($handle, LOCK_UN);// 释放锁定:必须手动执行!
fclose($handle);

/* 此时的 test.txt 文件中的内容:
2019-12-30 14:19:15 加锁之前
2019-12-30 14:19:15 添加:排他锁/互斥锁:LOCK_EX
2019-12-30 14:19:15 释放锁
2019-12-30 14:19:15 添加:共享锁:LOCK_SH
2019-12-30 14:19:15 未进行锁咨询
============================================
*/