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 @ 2019-12-04 16:43  一个人的孤独自白  阅读(1123)  评论(0编辑  收藏  举报