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
php多进程写入文件的更多相关文章
- php利用curl实现多进程下载文件类
批量下载文件一般使用循环的方式,逐一执行下载.但在带宽与服务器性能允许的情况下,使用多进程进行下载可以大大提高下载的效率.本文介绍PHP利用curl的多进程请求方法,实现多进程同时下载文件. 原理: ...
- Django多进程日志文件问题
Django多进程日志文件问题 最近使用Django做一个项目.在部署的时候发现日志文件不能滚动(我使用的是RotatingFileHandler),只有一个日志文件. 查看Log发现一个错误消息:P ...
- mac 无法识别seagate硬盘、无法向其写入文件
1,无法识别 Seagate 硬盘 新买的mac air Captian 10.11.6系统,连上硬盘根本不出现盘符,usb插头不要插得太深,慢慢的插入,看到硬盘白灯亮起就可以了 2,无法向 Seag ...
- .NET跨平台之旅:在Linux上将ASP.NET 5运行日志写入文件
在前一篇博文(增加文件日志功能遇到的挫折)中,我们遇到了这样一个问题:虽然有一些.NET日志组件(比如Serilog, NLog)已经开始支持.NET Core,但目前只支持控制台输出日志,不支持将日 ...
- C#文本写入文件,追加写入文件
写入文件和这个对象 StreamWriter using (StreamWriter fs = new StreamWriter(path, true)) { fs.WriteLine(strLog) ...
- JMeter中BeanShell实现写入文件
1.首先F:\test.txt文件为空
- 利用其它带文件防护功能的软件防止*.asp;*.jpg写入文件。
此木马是一个.NET程序制作,如果你的服务器支持.NET那就要注意了,,进入木马有个功能叫:IIS Spy,点击以后可以看到所有站点所在的物理路径.以前有很多人提出过,但一直没有人给解决的答案.. 防 ...
- 写入文件(txt格式)
#region 写入文件 /// <summary> /// 写入文件 /// </summary> /// <param ...
- C++重载流运算符,将存储结构体的vector直接写入文件
我们知道,当vector很大的时候,如果使用循环的方式将其中的元素写入文件将非常费时,因此有没有办法将vector一次性写入文件呢? 采用流运算符重载的方法可以做到,不仅基本类型的vector可以一次 ...
随机推荐
- Linux mmap 要主动释放共享内存
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/sta ...
- 邮件email
参考地址:https://blog.csdn.net/baidu_30000217/article/details/52942258 邮箱配置地址:http://service.exmail.qq.c ...
- strus2配置strus.xml问题-The content of element type "package" must match "(result-types?,interceptors?
搭建strus2项目,在配置strus.xml时候碰到了这个问题: The content of element type "package" must match "( ...
- 爬虫beautifulsoup实践
爬虫beautifulsoup实践: 目的:在https://unsplash.com/上爬取图片并保存到本地文件夹里. 一.观察response.首先,在Chrome浏览器里观察一下该网页的re ...
- 读取日志文件,搜索关键字,打印关键字前5行。yield、deque实例
from collections import deque def search(lines, pattern, history=5): previous_lines = deque(maxlen=h ...
- (Frontend Newbie)Web三要素(三)
上一篇简单介绍了Web三要素中的层叠样式表,本篇主要介绍三要素中最后一个,也是最难掌握的一个-----JavaScript. JavaScript 老规矩不能破,先简要交代 JavaScript 的历 ...
- 2.3 js基础--DOM
一.javascript组成 ECMAScript:核心解释器[为我们提供好了最基本的功能:变量声明.函数.语法.运算]. 兼容性:完全兼容. DoM:文档对象 ...
- 绘图神器-matplotlib入门
这次,让我们使用一个非常有名且十分有趣的玩意儿来完成今天的任务,它就是jupyter. 一.安装jupyter matplotlib入门之前,先安装好jupyter.这里只提供最为方便快捷的安装方式: ...
- React.js 小书 Lesson9 - 事件监听
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson9 转载请注明出处,保留原文链接和作者信息. 在 React.js 里面监听事件是很容易的事情 ...
- [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)
本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...