PHP使用flock实现文件加锁来防止多进程同时写入文件

lock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows)。如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE。锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用)。

简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,从而防止冲突。举个例子:

<?php 
  $file = fopen("test.txt","w+"); 
  if (flock($file,LOCK_EX)) 
  { 
   fwrite($file,"Write something"); 
   flock($file,LOCK_UN); 
  } 
  else
  { 
    echo "Error locking file!"; 
  } 
  fclose($file); 
?>

说明:

1.这段代码的意思是,以读写方式打开文件test.txt,当一个用户调用该php页面时,即对test.txt文件进行操作,那么就会执行flock($file,LOCK_EX)代码,即将test.txt文件进行独占锁定(该文件只能由该用户进行读写操作),那么如果有其他新的用户想访问该文件,就会被阻塞,直到前者关闭文件(释放锁定)。

2.如果将代码改成flock($file,LOCK_EX+LOCK_NB)表示锁定时直接返回错误,那么如果有新的用户访问该文件,就会输出“Error locking file!”

代码学堂php教程_代码学堂

3.该函数的语法是flock(file,lock,block),其中file必需。规定要锁定或释放的已打开的文件。lock 必需。规定要使用哪种锁定类型。block可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。

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

function writeData($path, $mode,$data) 
{ 
  $fp = fopen($path, $mode);  
  $retries = 0; 
  $max_retries = 100;  
  do{ 
    if ($retries > 0)  
    { 
      usleep(rand(1, 10000)); 
    } 
    $retries += 1; 
  }while (!flock($fp, LOCK_EX) and $retries<= $max_retries);  
  if ($retries == $max_retries)  
  { 
    return false; 
  } 
  fwrite($fp, "$data\n"); 
  flock($fp, LOCK_UN); 
  fclose($fp);  
  return true;  
}
时间: 2024-10-12 12:46:43

PHP使用flock实现文件加锁来防止多进程同时写入文件的相关文章

PHP关于文件与目录(1) 写入文件 文件权限 三、锁定文件

一.文件权限 总之一切都是为了保证目录的安全,保证目录的安全比保证文件的安全更重要. 二.写入文件 file_put_contents($file,$data);  //如果没有的话会创建,有的话覆盖原文件: file_put_contents($file,$data,FILE_APPEND); //没的话会创建,有的话追加在后面: file_put_contents($file,$data.PHP_EOL,FILE_APPEND);//有换行 [例子]: <!DOCTYPE html PUBL

[Linux文件]将用户输入的字符串写入文件实例

 //使用gets函数从标准输入(键盘)获得一个以回车换行为结束的字符串,可以带空格  //运行时候屏幕会提示输入字符处,以回车结尾  //需要注意的是待输入的字符串存放在writebuf中,不能超过30字节并且不会带回车换行  #include <fcntl.h>  #include <stdio.h>  #include <string.h>  int main(int argc,char *argv[])  {    int fd;      //文件描述符   

java基于NIO的分散读取文件,然后统一聚合后写入文件

分散读取:对于一个文件,可以分散的读取数据,可以快速的读取,好比多个线程在分段同时读取: 聚合写入:为了提高效率,一般读取到的数据都是分散的,要快速写入,就需要把分散的数据聚集在一起,然后一块写入到文件: 具体代码如下: //首先创建一个随机访问文件 RandomAccessFile raf= new RandomAccessFile("test.txt", "rw"); //根据随机获取通道 FileChannel channel = raf.getChannel

Android文件存储往SD卡中写入文件路径出错问题求解。

============问题描述============   因为学习需要  看的老罗的视频  关于数据存储往SD卡写文件的那一部分  几乎完全照办的敲的代码   结果在pad上测试的时候和预想的有区别     本来应该存储到SD卡中的文件结果跑到pad自带内存中去了...   然后我尝试过把路径直接自己手动写  还是一样存到了自带内存中  这到底是为什么啊? 顺带吐槽一下万恶的导师  十一还要我们加班 求大神们指导呀~   国庆节玩的开学哟!!! ============解决方案1======

下位机数据接收十六进制写入文件

项目:实现can总线传感器  QN1161 测试上位机 要求:需要将接收的到数据写入到文件中 格式: 时间 + CAN ID + 数据: 如: 2015/4/22 11:45:18 0xF5F4EB18 03 EC 0D 0B 00 02 00 00 一.写入文件(追加方式) /// <summary> /// 写入文件 /// </summary> public void WriteFile(string strInfo) { FileStream fs = new FileSt

【php写日志】php将日志写入文件

php 写内容到文件,把日志写到log文件 <?php header("Content-type: text/html; charset=utf-8"); /******************** 1.写入内容到文件,追加内容到文件 2.打开并读取文件内容 ********************/ $file = 'log.txt';//要写入文件的文件名(可以是任意文件名),如果文件不存在,将会创建一个 $content = "第一次写入的内容\n";

C#使用读写锁解决多线程并发写入文件时线程同步的问题

读写锁是以 ReaderWriterLockSlim 对象作为锁管理资源的,不同的 ReaderWriterLockSlim 对象中锁定同一个文件也会被视为不同的锁进行管理,这种差异可能会再次导致文件的并发写入问题,所以 ReaderWriterLockSlim 应尽量定义为只读的静态对象. 多线程同时写入文件 class Program { static int writeCount = 0; static int wrongCount = 0; static void Main(string

0X02写入文件

''' 保存数据的最简单的方式之一是将其写入到文件中.通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:你可以在程序结束运行后查看这些输出, 可与别人分享输出文件,还可编写程序来将这些输出读取到内存中并进行处理. ''' filename = '/home/aaron/桌面/biaoge/htmlcade.txt' with open(filename,'w') as file_object: file_object.write("I LOVE Programming.&q

PHP flock实现文件加锁

flock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows).如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE.锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用). 简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,从而防止冲突.举个例子: <?php $file = fopen("test.txt&qu