您的位置:首页 > 编程语言 > PHP开发

PHP文件的锁定机制

2017-05-09 10:30 190 查看
source: http://blog.csdn.net/looksunli/article/details/17841145

文件系统操作是在网络环境下完成的,可能有多个客户端用户在同一时刻读对服务器的同一个文件访问。如果有个用户正在向文件中写入数据,当还没有写完的时候,其他用户在这一时刻也向这个文件写入数据,这样就可能造成数据写入混乱。还有,当用户没有将数据写完时,其他用户读取这个文件的内容时,就会得到残缺的数据。

如何避免这样的情况发生,需要做到如下几点:

1)当有用户读取文件的时候,这个文件不能被写操作。可以同时多个用户对这个文件有读操作

2)当用户需要对这个文件进行写操作,不能读取这个文件。同时只能由一个用户对这个文件进行写操作。

PHP提供了flock()函数,可以对文件使用锁定操作,当一个进程访问一个文件的时会加上锁,只有等这个锁被释放之后,其他进程才可以对该文件进行访问。文件锁定有2种锁定类型:共享锁定和独占锁定。

共享锁定LOCK_SH:读文件的时候加的锁机制,同时有多个用户可以对这个文件加共享锁

独占锁定LOCK_EX:写数据的时候加的锁机制,只有这个文件所有的锁都被释放了才能加锁成功(即这个共享锁定和之前独占锁定都被释放),否则会出现锁定堵塞。

释放锁 LOCK_UN:释放锁定,无论是共享锁定还是独占锁定都用它释放。

读文件操作:

[php] view
plain copy

 





function readFileData($file)  

{  

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

  

    // 加入共享锁  

    flock($fp, LOCK_SH);  

  

    $buffer = '';  

  

    while(! feof($fp)) {  

        $buffer .= fread($fp, 1024);  

    }  

  

    // 关闭共享锁  

    flock($fp, LOCK_UN);  

  

    fclose($fp);  

  

    return $buffer;  

}  

写文件操作:

[php] view
plain copy

 





function writeFileData($file, $model, $data)  

{  

    $fp = fopen($file, $model);  

  

    // 获取独占锁  

    do {  

        $isLock = flocK($fp, LOCK_EX);  

    } while (! $isLock);  

  

    fwrite($fp, $data . '\n\r');  

    flock($fp, LOCK_UN);  

    fclose($fp);  

    return true;  

}  

  

writeFileData('test.txt', 'a', 'this is test');  

PHP文件操作函数总结

打开:fopen($filename, $model, (bool) include_file_path);

关闭:fclose($handle);

写:fwrite($handle , $data, [$length]); 这个函数的别名fputs

       file_put_contents($filename, $data); 这个函数的功能和依次调用fopen,fwrite,fclose 功能一样,但是如果同时多次调用这个函数,文件只会保存最后写入的数据

读:fread file_get_contents fgets fgetc file readfile
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: