PHP 写文件加锁的例子

用 PHP 的 file_put_contents 函数以追加的方式,循环 10 w 次写文件,耗时很多。因为 file_put_contents 函数每次都要打开文件,写入文件,然后关闭文件。

以下是测试:

public function handle()
{
    $testTxt = storage_path('test.txt');
    for ($i = 0; $i < 100000; $i++) {
        $this->comment('writing...');
        file_put_contents($testTxt, 'wo shi tanteng.' . PHP_EOL, FILE_APPEND);
    }
    $this->comment('time:' . round(microtime(true) - LARAVEL_START, 2));
}
如图所示:


耗时 165.76 秒。现在换一种写文件的方式,使用 fwrite 并且加锁的方式同样循环 10w 次写入,代码如下:

public function handle()
{
    $testTxt = storage_path('test2.txt');
    $handle = fopen($testTxt, 'wr');
    flock($handle, LOCK_EX | LOCK_NB);
    for ($i = 0; $i < 100000; $i++) {
        $this->comment('writing...');
        fwrite($handle, 'wo shi tanteng.' . PHP_EOL);
    }
    flock($handle, LOCK_UN);
    fclose($handle);
    $this->comment('time:' . round(microtime(true) - LARAVEL_START, 2));
}
运行效果如图:


如图所示,耗时 40.46 s,大大提高了效率。

跟 file_put_contents 函数比, fwrite 提高了写文件的效率,同时使用 flock 进行写文件加锁,防止并发同时操作一个文件。

时间: 2024-10-10 17:45:14

PHP 写文件加锁的例子的相关文章

JSP中读文件和写文件的例子

js 读文件的例子***************************************************<%@ page contentType="text/html;charset=gb2312"%><%//变量声明\java.lang.String strFileName; //文件名java.io.File objFile; //文件对象java.io.FileReader objFileReader; //读文件对象char[] chrBuff

PHP使用flock实现文件加锁的方法

  本文实例讲述了PHP使用flock实现文件加锁的方法.分享给大家供大家参考.具体分析如下: flock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows).如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE.锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用). 简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,

PHP使用flock实现文件加锁的方法_php技巧

本文实例讲述了PHP使用flock实现文件加锁的方法.分享给大家供大家参考.具体分析如下: flock在官方文档里的解释是:flock() 允许你执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是Windows).如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),请将可选的第三个参数设置为 TRUE.锁定操作也可以被 fclose() 释放(代码执行完毕时也会自动调用). 简单来说,就是对一个文件进行锁定操作,使得多进程访问该文件时受到限制,从而

java对文件加锁

在对文件操作过程中,有时候需要对文件进行加锁操作,防止其他线程访问该文件.对文件的加锁方法有两种: 第一种方法:使用RandomAccessFile类操作文件. 在java.io.RandomAccessFile类的open方法,提供了参数实现独占的方式打开文件:         RandomAccessFile raf = new RandomAccessFile(file, "rws"); 其中的"rws"参数,rw代表读取和写入,s代表了同步方式,也就是同步锁

Java编程那些事儿88——文件操作之写文件

11.3.1.4 写文件 如前所述,将程序内部的数据输出到程序外部的数据源,应该使用IO类体系中的输出流.在实际的编程中,将程序中的数据,例如用户设定或程序运行时生成的内容,存储到外部的文件中,应该使用输出流进行编程. 基本的输出流包含OutputStream和Writer两个,区别是OutputStream体系中的类(也就是OutputStream的子类)是按照字节写入的,而Writer体系中的类(也就是Writer的子类)是按照字符写入的. 使用输出流进行编程的步骤是: 1.建立输出流 建立

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.6.3 文件加锁机制

2.6.3 文件加锁机制 考虑一下多个同时执行的程序需要修改同一个文件的情形,很明显,这些程序需要以某种方式进行通信,不然这个文件很容易被损坏.文件锁可以解决这个问题,它可以控制对文件或文件中某个范围的字节的访问. 假设你的应用程序将用户的偏好存储在一个配置文件中,当用户调用这个应用的两个实例时,这两个实例就有可能会同时希望写这个配置文件.在这种情况下,第一个实例应该锁定这个文件,当第二个实例发现这个文件被锁定时,它必须决策是等待直至这个文件解锁,还是直接跳过这个写操作过程. 要锁定一个文件,可

Java中读/写文件文本文件的示例

1.FileReader----读取字符流 2.FileWriter----写入字符流 3.BufferedReader----缓冲指定文件的输入 该类的方法有: void close()         关闭该流.  void mark(int readAheadLimit)         标记流中的当前位置.  boolean markSupported()         判断此流是否支持 mark() 操作(它一定支持) int read()         读取单个字符.  int

日志系统中多线程写文件的问题

问题描述 大家好,我现在在写一个日志系统,因为我需要在另外的项目中使用这个日志系统,在项目中调用日志系统的输出日志功能时,需要把日志写到一个文件里面,因为项目中可能启动几十上百个线程,这样的话,就会出现很多线程都是向同一个文件里面写日志,考虑的性能和资源的前提下,有没有一个好的方案解决多个线程写文件的问题.在下考虑到的方法有:1,每次每个线程读写文件的时候,打开输入流,写完了以后关闭输出流.这样做的话每次都要打开关闭输出流,会不会很耗资源2,程序中使用一个集合保存需要写文件的输出流,当哪个线程需

Window,Linux应用程序调试法----写文件调试程序法

Linux,一切皆文件,那么在Android系统本身,也是Linux+java罢了,也是在Linux的运行环境下. 通常,我们在调试程序的都会使用printf. 在Android中,我们会去使用logcat,现在,给大家介绍一种常用的调试方法,debug写文件调试法. 在Android系统中,调试一个C应用程序可谓是极其不方便,为了保存log的完整性,于是,写文件调试法可以发挥重大的作用,下面给出一个例子: #include <stdio.h> FILE * wirte_debug_file=