php多进程写入文件

测试一

$begin = time();
for ($i=0; $i<10000; $i++) {
        $fp = fopen("tmp", 'r+');
        fseek($fp, 0, SEEK_END);
        fwrite($fp, str_repeat($argv[1],1024*32).PHP_EOL);
        fclose($fp);
}
$end = time();
echo "time use: ".($end-$begin).PHP_EOL;

 

php write.php b

php write.php a

wc -l tmp

10450 tmp

测试结果:

与预期的2W行不相符

错误分析:

seek定位到文件末尾的之后,可能因为其他进程已经写入文件,当前进程进行了覆盖

 

测试二

$begin = time();
for ($i=0; $i<10000; $i++) {
        $fp = fopen("tmp", 'a+');
        fwrite($fp, str_repeat($argv[1],1024*32).PHP_EOL);
        fclose($fp);
}
$end = time();
echo "time use: ".($end-$begin).PHP_EOL;

 

php write.php b

php write.php a

wc -l tmp

20000 tmp

测试结果:

与预期的2W行相符,但是检查文件内容

检查脚本,检查一行是不是同时含有a和b

<?php
$fp = fopen("tmp", 'r+');
while (!feof($fp)) {
        $line = fgets($fp, 1024*1024);
        if (strstr($line, 'a') && strstr($line, 'b')) {
                echo 'not pass'.PHP_EOL;
                for ($i=0;$i<strlen($line);$i++){
                        echo ord($line[$i]).PHP_EOL;
                }
                die;
        }
}
echo 'pass'.PHP_EOL;

 

php check.php >ts

ts内容

not pass
97
97
.
.
.
98
98
10

错误分析:

php的fwrite是带buffer的,写入一行的内容大于buffer的长度,进程A和进程B是轮流调用write到同一行,就导致了这种结果

 

测试三

顺序写

$begin = time();
$fp = fopen("tmp", 'w+');
for ($i=0; $i<200000; $i++) {
        fwrite($fp, str_repeat($argv[1],1024*32).PHP_EOL);
}
fclose($fp);
$end = time();
echo "time use: ".($end-$begin).PHP_EOL;

 

php write.php a

time use: 13

 

$begin = time();
for ($i=0; $i<200000; $i++) {
        $fp = fopen("tmp", 'a+');
        fwrite($fp, str_repeat($argv[1],1024*32).PHP_EOL);
        fclose($fp);
}
$end = time();
echo "time use: ".($end-$begin).PHP_EOL;

 

php write.php a

time use: 16

 

转载于:https://www.cnblogs.com/23lalala/p/3930145.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值