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

时间: 2024-09-30 15:12:41

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

Python 2.7_Second_try_爬取阳光电影网_获取电影下载地址并写入文件 20161207

1.昨天文章http://www.cnblogs.com/Mr-Cxy/p/6139705.html 是获取电影网站主菜单 然后获取每个菜单下的电影url  2.今天是对电影url 进行再次解析获取下载地址 并写入文件  调用函数和类多线程还没实现 一步步来吧 3.问题:我想实现的是先对菜单进行创建文件目录 然后每个目录下以获取的电影名称.txt 作为文件 文件内是下载连接,但是创建一级菜单文件夹没问题 用OS模块就可以创建 在写入电影名称.txt时候出问题 报错 我以为是编码问题 f.open

对象写入文件和从文件中重构到对象

//将对象写入文件中 Game game = new Game(); game.Level = 2; game.Player = "Tom"; FileStream fs = new FileStream(@"game.bak",FileMode.OpenOrCreate,FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(game.Player); sw.WriteLine

五,写入文件

php向文件中写入内容和读取类似,用fwrite()代替fread(). php向文件中写入内容有两种方式: (1)第一种方式 /*第一种写入文件方式*/ $file_path = "test.txt"; if(file_exists($file_path)){ $fp = fopen($file_path,'a+'); $str = '你好\r\n'; for($i = 0; $i < 10; $i++){ fwrite($fp,$str); } fclose($fp); ec

PHP内置函数file_put_content(),将数据写入文件,使用FILE_APPEND 参数进行内容追加

file_put_contents(fileName,data,flags,context) 入参说明: 参数 说明 fileName 要写入数据的文件名 data 要写入的数据.类型可以是 string,array(但不能为多维数组),或者是 stream 资源 flags 可选,规定如何打开/写入文件.可能的值: FILE_USE_INCLUDE_PATH:检查 filename 副本的内置路径 FILE_APPEND:在文件末尾以追加的方式写入数据 LOCK_EX:对文件上锁 contex

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

写入文件和这个对象 StreamWriter 1 using (StreamWriter fs = new StreamWriter(path, true)) 2 { 3 fs.WriteLine(strLog); 4 } 这个看到那个蓝色的true了没,个就是追加的标记,如果不写的话,那么你所有写一次,之前的都会被覆盖掉.

运用BufferedWriter把数据写入文件

public class WriteReadFiles { private static Logger log = LoggerFactory.getLogger(WriteReadFiles.class); public boolean writeFile(String content) { String filename = "E:/java_src/MVCDemo3/MVCDemo3/accounts.txt"; try { File f = new File(filename)

Java 读取、写入文件——解决乱码问题

读取文件流时,经常会遇到乱码的现象,造成乱码的原因当然不可能是一个,这里主要介绍因为文件编码格式而导致的乱码的问题.首先,明确一点,文本文件与二进制文件的概念与差异. 文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码.ANSI编码等等.二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码.) 因此可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8).而二进制文件可看成是变长编码的,因为是值编码嘛,多少

通过codehaus来实现json写入文件和读取文件成json对象

原文:通过codehaus来实现json写入文件和读取文件成json对象 代码下载地址:http://www.zuidaima.com/share/1550463256562688.htm pom.xml需要增加如下依赖: <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-lgpl</artifactId> <version>1.

java使用I/O流实现9*9乘法口诀的写入文件和从文件打印到屏幕

1.9*9乘法口诀打印到test2.txt中,代码如下 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class week { publicstatic void main(String[] args) throws Exception { File t