PHP自带了文件锁函数:

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

$handle 是打开的文件指针;

$operation 可以是

“LOCK_SH”,共享锁定;“LOCK_EX”,独占锁定;“LOCK_UN”,释放锁定;“LOCK_NB”,防止flock锁定时堵塞。

这里主要说说“LOCK_EX”和“LOCK_NB”。

比如我们有两个文件,如下。

flocka.php

?​View Code PHP

1

2345678910

    $file = 'temp.txt';

    $fp = fopen($file,'a');


    for($i = 0;$i < 5;$i++)

    {

        fwrite($fp, "11111111\n");

        sleep(1);

    }


    fclose($fp);

flockb.php

?​View Code PHP

1

23456789

    $file = 'temp.txt';

    $fp = fopen($file,'a');


    for($i = 0;$i < 5;$i++)

    {

        fwrite($fp, "22222222\n");

    }


    fclose($fp);

先运行flocka.php,然后马上运行flockb.php。

结果:

11111111

22222222

22222222

22222222

22222222

22222222

11111111

11111111

11111111

11111111

说明不加文件锁时,两个文件会同时对txt文件进行写入操作。

下面修改一下两个php文件的代码。

flocka.php

?​View Code PHP

1

2345678910111213

    $file = 'temp.txt';

    $fp = fopen($file,'a');


    if(flock($fp,LOCK_EX))

    {

        for($i = 0;$i < 5;$i++)

        {

            fwrite($fp, "11111111\n");

            sleep(1);

        }

        flock($fp,LOCK_UN);

    }

    fclose($fp);

flockb.php

?​View Code PHP

1

2345678910111213

    $file = 'temp.txt';

    $fp = fopen($file,'a');


    if(flock($fp,LOCK_EX))

    {

        for($i = 0;$i < 5;$i++)

        {

            fwrite($fp, "22222222\n");

        }

         flock($fp,LOCK_UN);

    }


    fclose($fp);

同样先运行flocka.php,然后马上运行flockb.php。

会发现在flocka.php运行结束前,flockb.php一直处于等待状态,只有当flocka.php运行结束后,flockb.php才会继续执行。

输出结果:

11111111

11111111

11111111

11111111

11111111

22222222

22222222

22222222

22222222

22222222

另外,在执行flock时,文件锁会自动释放。