如何在PHP中使用flock?

ome*_*ega 5 php

在我的PHP代码中,我想创建一个读/写代码.因此,将会有一个PHP代码读取或写入的文件.只能有1位作者,或者可以有很多读者,但您可以同时进行书写和阅读.

如何在PHP中完成?我相信你需要使用flock代码?

hek*_*mgl 9

我与Danack的评论 -的PHP文件flock()包含一个很好的例子:

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) { // exclusive lock will blocking wait until obtained

    fwrite($fp, "Write something here\n");

    // or ...

    execute_code_that_shouldnt_run_twice_at_the_same_time();

    flock($fp, LOCK_UN); // unlock
} else {
    echo "failed to obtain lock";
}

fclose($fp);
Run Code Online (Sandbox Code Playgroud)

请注意,flock()在默认模式下,阻塞等待直到它可以获得锁定.如果其他进程当前获得锁定,则这是常规的.


但是不要期望太多flock()功能.它使用所谓的咨询锁,其他进程可以忽略它.以Linux为例,PHP flock()正在使用内核函数flock(),man 2 flock解释它是如何工作的:

flock()只放置咨询锁; 给定对文件的适当权限,进程可以自由地忽略flock()的使用并对文件执行I/O.

意思flock()只是给其他过程提供建议.如果他们不关心他们可以阅读甚至写,无论锁(或锁的类型).然而,手册页是关于Linux的,其他系统可能会以不同的方式处理它 (实际情况并非如此)

但是,无论您是进程的编码器,您都可以/并且应该在flock()每次访问文件时都关心锁定.但是你不能确定另一个进程 - 比如文本编辑器 - 不会覆盖你的文件