当前位置:首页 > PHP教程 > php高级应用 > 列表

file_put_contents并发性问题解决方案整理

发布:smiling 来源: PHP粉丝网  添加日期:2018-10-22 17:26:23 浏览: 评论:0 

解决办法一,file_put_contents 高并发与独占锁定

发现高并发访问时使用 file_put_contents 写入文件造成数据置空。

查看官方文档:

int file_put_contents ( string $filename , string $data [, int $flags [, resource $context ]] )

参数:

filename 要被写入数据的文件名。 data 要写入的数据。类型可以是 string,array 或者是 stream 资源(如上面所说的那样)。 flags flags 可以是 FILE_USE_INCLUDE_PATH,FILE_APPEND 和/或 LOCK_EX(获得一个独占锁定),然而使用 FILE_USE_INCLUDE_PATH 时要特别谨慎。 context 一个 context 资源。

直接直至 flags 参数为 LOCK_EX 即可在高并发时获得一个独占锁定。

另外,flock 函数的也提供了文件锁定方法:

  1.    
  2. $fp = <a href="\"/tags.php/fopen/\"" target="\"_blank\"">fopen</a>("/tmp/lock.txt""w+"); 
  3. if (flock($fp, LOCK_EX)) { // 进行排它型锁定 
  4. fwrite($fp"Write something here\\n"); 
  5. flock($fp, LOCK_UN); // 释放锁定 
  6. else { 
  7. echo "Couldn't lock the file !"
  8. fclose($fp); 

注意 flock() 需要一个文件指针。

方法二,file_put_contents() 存在高并发问题,Smarty中处理方式如下。

  1. <?php 
  2.  
  3. define("FILE_PUT_CONTENTS_ATOMIC_TEMP", dirname(__FILE__)."/cache"); 
  4.   
  5. define("FILE_PUT_CONTENTS_ATOMIC_MODE", 0777); 
  6.  
  7. function file_put_contents_atomic($filename$content) { 
  8.   
  9.     $temp = tempnam(FILE_PUT_CONTENTS_ATOMIC_TEMP, 'temp'); 
  10.   
  11.     if (!($f = @fopen($temp'wb'))) { 
  12.   
  13.         $temp = FILE_PUT_CONTENTS_ATOMIC_TEMP . DIRECTORY_SEPARATOR . uniqid('temp'); 
  14.   
  15.         if (!($f = @fopen($temp'wb'))) { 
  16.   
  17.             trigger_error("file_put_contents_atomic() : error writing temporary file '$temp'", E_USER_WARNING); 
  18.   
  19.             return false; 
  20.         } 
  21.     } 
  22.   
  23.     fwrite($f$content); 
  24.   
  25.     fclose($f); 
  26.   
  27.     if ( 
  28. !@rename($temp 
  29. $filename)) { 
  30.   
  31.         @unlink($filename); 
  32.   
  33.         @rename($temp$filename); 
  34.   
  35.     } 
  36.   
  37.     @chmod($filename, FILE_PUT_CONTENTS_ATOMIC_MODE); 
  38.   
  39.     return true; 
  40.   
  41. ?>

Tags: 解决方案 问题

分享到: