PHP文件的锁定机制
source: http://blog.csdn.net/looksunli/article/details/17841145
文件系统操作是在网络环境下完成的,可能有多个客户端用户在同一时刻读对服务器的同一个文件访问。如果有个用户正在向文件中写入数据,当还没有写完的时候,其他用户在这一时刻也向这个文件写入数据,这样就可能造成数据写入混乱。还有,当用户没有将数据写完时,其他用户读取这个文件的内容时,就会得到残缺的数据。
如何避免这样的情况发生,需要做到如下几点:
1)当有用户读取文件的时候,这个文件不能被写操作。可以同时多个用户对这个文件有读操作
2)当用户需要对这个文件进行写操作,不能读取这个文件。同时只能由一个用户对这个文件进行写操作。
PHP提供了flock()函数,可以对文件使用锁定操作,当一个进程访问一个文件的时会加上锁,只有等这个锁被释放之后,其他进程才可以对该文件进行访问。文件锁定有2种锁定类型:共享锁定和独占锁定。
共享锁定LOCK_SH:读文件的时候加的锁机制,同时有多个用户可以对这个文件加共享锁
独占锁定LOCK_EX:写数据的时候加的锁机制,只有这个文件所有的锁都被释放了才能加锁成功(即这个共享锁定和之前独占锁定都被释放),否则会出现锁定堵塞。
释放锁 LOCK_UN:释放锁定,无论是共享锁定还是独占锁定都用它释放。
读文件操作:
- 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;
- }
写文件操作:
- 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