PHP 1000个进程同时利用file_put_contents的追加FILE_APPEND模式
1000个进程同时利用file_put_contents的追加FILE_APPEND模式,不会出现写入的数据被覆盖?
<?php // fork出1000个进程查询,内存大,cpu屌,1000个进程怎么了? // 我买个CPU不就是为的用它么,你省着干什么? for ( i = 1 ; i <= 1000; i++ ) { pid = fork(); // 在子进程里查询 if ( 0 == pid ) { ret = get_dizhi_by_phone( '手机号' ); // 查询出来后,记录到data.log文件里 file_put_contents( 'data.log', ret, FILE_APPEND ); exit; } }
考虑到 “多进程写入同一文件可能会导致数据覆盖” 可能会导致上亿的损失,我决定认真对待一下这个问题,于是我写了下面的代码测试了一波儿:
<?php for ( $i = 1; $i <= 30; $i++ ) { $pid = pcntl_fork(); if ( 0 == $pid ) { $my_pid = posix_getpid(); for ( $counter = 1; $counter <= 10000; $counter++ ) { file_put_contents( "./api.log", "record\r\n", FILE_APPEND ); //file_put_contents( "./api.log", date( 'Y-m-d H:i:s' ).' : '.$str."\r\n", FILE_APPEND|LOCK_EX ); } exit; } }
顺带给看不懂代码的萌新说明一下👆那坨代码是啥意思:
fork出30个进程,每个进程写入10000个what,每个what独占一行。程序执行完毕后,理论上我们打开api.log文件,应该有 30 * 10000 行数据,就说明没有出现多进程写同一文件覆盖数据这种事情。
结果:
-
30,0000行数据就这样静静地躺在文件里...
-
说出来我自己可能都不信,然而事实确实是发生了...
-
于是我又重新试了好多遍,然而确实结果都是一致的...
暂时得出一个这样的结论了:当file-put-contents函数中一旦启用了FILE_APPEND标记,那么无论你用多少个进程向同一个文件中写内容都不会出现进程间内容覆盖这种问题,并不需要EX_LOCK标记。
那么问题来了:EX_LOCK是做什么用的?
FILE-APPEND可以保证没有覆盖写漏写这种问题了,但是会有顺序错乱这种存在的可能性,而EX—LOCK则就是来解决这个问题的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律