请写一段 PHP 代码 ,确保多个进程同时写入同一个文件成功

来源:互联网 发布:linux 禁用显卡 驱动 编辑:程序博客网 时间:2024/05/19 16:03

考点:对函数的理解

  • fopen:打开文件或者URL
参数1:文件地址或者URL  参数2:mode 参数指定了所要求到该流的访问类型      'r' 只读方式打开,将文件指针指向文件头。      'r+'    读写方式打开,将文件指针指向文件头。      'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。      'w+'    读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。      'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。      'a+'    读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
  • fwrite : 写入文件
参数1:文件名文件系统指针  参数2: 要写入的内容 string类型  返回值: 写入成功返回写入的字符数,失败返回false  
  • flock: 轻便的咨询文件锁定
参数1:文件系统指针,是典型地由 fopen() 创建的 resource(资源)。  参数2:模式      LOCK_SH取得共享锁定(读取的程序)。      LOCK_EX 取得独占锁定(写入的程序。      LOCK_UN 释放锁定(无论共享或独占)。      如果不希望 flock() 在锁定时堵塞,则是 LOCK_NB(Windows 上还不支持)。  返回值:成功时返回 TRUE, 或者在失败时返回 FALSE
  • fclose :关闭一个打开的文件指针
参数1:文件名  参数2:成功时返回 TRUE, 或者在失败时返回 FALSE
  • 方案一
function writeData($filepath, $data)   {       $fp = fopen($filepath,'a');        do{           usleep(100);       }while (!flock($fp, LOCK_EX));  //LOCK_EX 取得独占锁定(写入的程序)进行排它型锁定 获取锁 有锁就写入,没锁就得      $res = fwrite($fp, $data."\n");       flock($fp, LOCK_UN);    //LOCK_UN 释放锁定(无论共享或独占)。      fclose($fp);        return $res;   }   
  • 方案二
function write_file($filename, $content)  {      $lock = $filename . '.lck';      $write_length = 0;      while(true) {          if( file_exists($lock) ) {              usleep(100);          } else {              touch($lock);              $write_length = file_put_contents($filename, $content, FILE_APPEND);              break;          }      }      if( file_exists($lock) ) {          unlink($lock);      }      return $write_length;  }  
0 0