source: http://blog.csdn.net/looksunli/article/details/17841145

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

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

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

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

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

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

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

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

读文件操作:

[php] 
view plain
 copy

 
在CODE上查看代码片
派生到我的代码片

  1. function readFileData($file)  
  2. {  
  3.     $fp = fopen($file‘r’);  
  4.   
  5.     // 加入共享锁  
  6.     flock($fp, LOCK_SH);  
  7.   
  8.     $buffer = ;  
  9.   
  10.     while(! feof($fp)) {  
  11.         $buffer .= fread($fp, 1024);  
  12.     }  
  13.   
  14.     // 关闭共享锁  
  15.     flock($fp, LOCK_UN);  
  16.   
  17.     fclose($fp);  
  18.   
  19.     return $buffer;  
  20. }  

写文件操作:

[php] 
view plain
 copy

 
在CODE上查看代码片
派生到我的代码片

  1. function writeFileData($file$model$data)  
  2. {  
  3.     $fp = fopen($file$model);  
  4.   
  5.     // 获取独占锁  
  6.     do {  
  7.         $isLock = flocK($fp, LOCK_EX);  
  8.     } while (! $isLock);  
  9.   
  10.     fwrite($fp$data . ‘\n\r’);  
  11.     flock($fp, LOCK_UN);  
  12.     fclose($fp);  
  13.     return true;  
  14. }  
  15.   
  16. 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

版权声明:本文为WORDLESS原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wordless/p/16208668.html