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则就是来解决这个问题的。

posted @   一个人的孤独自白  阅读(1160)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示