php的文件锁
PHP中文网
PHP中文网 2017-04-10 17:59:43
0
1
799

在PHP中使用flock给文件加锁,如果直接加锁可以成功,

$fp = fopen('/tmp/test.pid', 'a');
if (flock($fp, LOCK_EX | LOCK_NB)) {
    $pid = posix_getpid();
    ftruncate($fp, 0);
    fwrite($fp, $pid);
    fflush($fp);
    echo '加锁成功';
    sleep(10);
} else {
    echo '加锁失败';
}

运行上面的代码会出现预期的情况,在第一个进程没有退出的时候,第二个进程会加锁失败。
但是如果把加锁的操作放到函数中,加锁操作会一直成功

function lock()
{
    $fp = fopen('/tmp/test.pid', 'a');
    if (flock($fp, LOCK_EX | LOCK_NB)) {
        $pid = posix_getpid();
        ftruncate($fp, 0);
        fwrite($fp, $pid);
        fflush($fp);
        return true;
    } else {
        return false;
    }
}
if (lock) {
    echo '加锁成功';
    sleep(10);
} else {
    echo '加锁失败';
}

谁能解释一下这是为什么吗

PHP中文网
PHP中文网

认证0级讲师

reply all(1)
大家讲道理

因为$fp变量没有引用了,所以被回收了。回收时触发洗狗函数。解锁了文件

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!