• PHP中文件锁定 flock() 函数


    flock — 轻便的咨询文件锁定

    说明

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

    flock() 允许执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是 Windows)。

    在 PHP 5.3.2版本之前,锁也会被 fclose() 释放(在脚本结束后会自动调用)。

    PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法。 默认情况下,这个函数会阻塞到获取锁;这可以通过下面文档中 LOCK_NB 选项来控制(在非 Windows 平台上)。


    参数
    handle
    文件系统指针,是典型地由 fopen() 创建的 resource(资源)。

    operation
    operation 可以是以下值之一:

    LOCK_SH 取得共享锁定(读取的程序)。
    LOCK_EX 取得独占锁定(写入的程序。
    LOCK_UN 释放锁定(无论共享或独占)。
    如果不希望 flock() 在锁定时堵塞,则是 LOCK_NB(Windows 上还不支持)。

    wouldblock
    如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),可选的第三个参数会被设置为 TRUE。(Windows 上不支持)


    这个函数一般用来处理并发事件的

    例子1

    $fp = fopen("/tmp/lock.txt", "r+");
    
    if (flock($fp, LOCK_EX)) { // 进行排它型锁定
    /**
    *这写需要执行的代码
    **/
    flock($fp, LOCK_UN); // 释放锁定
    } else {
    echo "Couldn't get the lock!";
    }
    
    fclose($fp);

    但是其中需要执行的代码在并发的情况下所有用户进程都会执行,这是一个大坑。
    所以 flock($fp, LOCK_EX) 要加上 flock($fp, LOCK_EX|LOCK_NB) 在锁定时阻塞,才不会出现多个进程都会执行,但这样也会导致,当一个进程执行程序时其它进程直接返回失败错误。


    例子2:

    <?php 
    $file = "./test1.txt";
    $f = fopen($file, 'a');
    if(flock($f, LOCK_EX)){#上锁,因为执行的是fwrite(即写入)所以是LOCK_EX
    fwrite($f, "hello world!");
    }
    flock($f,LOCK_UN);#释放
    fclose($f);
    ?>
  • 相关阅读:
    iperf使用
    性能工具--vtune
    Android广告轮播图实现
    自定义控件学习——下拉刷新ListView
    JVM读书笔记
    自定义控件学习——仿qq侧滑栏
    初步使用RecyclerView实现瀑布流
    自定义Toast
    自定义对话框加状态选择器
    自定义组合控件
  • 原文地址:https://www.cnblogs.com/zqifa/p/13045135.html
Copyright © 2020-2023  润新知