测试一

$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

php多进程写入文件的更多相关文章

  1. php利用curl实现多进程下载文件类

    批量下载文件一般使用循环的方式,逐一执行下载.但在带宽与服务器性能允许的情况下,使用多进程进行下载可以大大提高下载的效率.本文介绍PHP利用curl的多进程请求方法,实现多进程同时下载文件. 原理: ...

  2. Django多进程日志文件问题

    Django多进程日志文件问题 最近使用Django做一个项目.在部署的时候发现日志文件不能滚动(我使用的是RotatingFileHandler),只有一个日志文件. 查看Log发现一个错误消息:P ...

  3. mac 无法识别seagate硬盘、无法向其写入文件

    1,无法识别 Seagate 硬盘 新买的mac air Captian 10.11.6系统,连上硬盘根本不出现盘符,usb插头不要插得太深,慢慢的插入,看到硬盘白灯亮起就可以了 2,无法向 Seag ...

  4. .NET跨平台之旅:在Linux上将ASP.NET 5运行日志写入文件

    在前一篇博文(增加文件日志功能遇到的挫折)中,我们遇到了这样一个问题:虽然有一些.NET日志组件(比如Serilog, NLog)已经开始支持.NET Core,但目前只支持控制台输出日志,不支持将日 ...

  5. C#文本写入文件,追加写入文件

    写入文件和这个对象 StreamWriter using (StreamWriter fs = new StreamWriter(path, true)) { fs.WriteLine(strLog) ...

  6. JMeter中BeanShell实现写入文件

    1.首先F:\test.txt文件为空

  7. 利用其它带文件防护功能的软件防止*.asp;*.jpg写入文件。

    此木马是一个.NET程序制作,如果你的服务器支持.NET那就要注意了,,进入木马有个功能叫:IIS Spy,点击以后可以看到所有站点所在的物理路径.以前有很多人提出过,但一直没有人给解决的答案.. 防 ...

  8. 写入文件(txt格式)

    #region 写入文件       /// <summary>       /// 写入文件       /// </summary>       /// <param ...

  9. C++重载流运算符,将存储结构体的vector直接写入文件

    我们知道,当vector很大的时候,如果使用循环的方式将其中的元素写入文件将非常费时,因此有没有办法将vector一次性写入文件呢? 采用流运算符重载的方法可以做到,不仅基本类型的vector可以一次 ...

随机推荐

  1. 获取window.location.href路径参数

    GetQueryString(param) { //param为要获取的参数名 注:获取不到是为null var currentUrl = window.location.href; //获取当前链接 ...

  2. (转)企业Shell实战-MySQL分库分表备份脚本

    本文来自http://www.xuliangwei.com/xubusi/252.html 免费视频讲解见 http://edu.51cto.com/course/course_id-5064.htm ...

  3. Beam编程系列之Java SDK Quickstart(官网的推荐步骤)

    不多说,直接上干货! https://beam.apache.org/get-started/beam-overview/ https://beam.apache.org/get-started/qu ...

  4. C++11并发编程:async,future,packaged_task,promise

    一:async std::async:用于创建异步任务,可以代替创建线程,函数原型:async(std::launch::async | std::launch::deferred, f, args. ...

  5. Win7 x86内核调试与TP反调试的研究

    参考  这两天对某P双机调试的学习及成果 ,非常好的一篇分析贴. 本文在Win7 x86下的分析,在虚拟机中以/DEBUG模式启动TP游戏,系统会自动重启. 0x01 内核调试全局变量  根据软件调试 ...

  6. 移动端本地 H5 秒开方案探索与实现

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 企业微信移动端项目中有需求要展示数据趋势的可视化图表,经过调研,最终决定以单页面 H5 来完成,对 APP 里的一些使用 H5 实现的功能模 ...

  7. HAProxy advanced Redis health check---ref

    http://blog.exceliance.fr/2014/01/02/haproxy-advanced-redis-health-check/ HAProxy advanced Redis hea ...

  8. Design Pattern理解碎片

    开发封闭原则(Open-Closed Principle OCP)Software entities(classes,modules,functions etc) should open for ex ...

  9. js控制字符处理

    使用js在对json字符串转json对象时,如果遇到一些控制(特殊)字符会出现转化失败的情况 处理方法:通常我们可以把这些控制字符替换成空 function character(str) { retu ...

  10. c#.net常见字符串处理方法

    1.字符串比较 字符串.ComparTo(目标字符串) "a".ComparTo("b"); 2.查找子串 字符串.IndexOf(子串,查找其实位置) ; 字 ...