PHP中fwrite与file

这里测试的是往文件中写一百万行记录,如果数据量很小,比如1000条左右的记录,可能差距不大
 

function microtimeFloat() {
    list($usec,$sec) = explode(" ", microtime());
    return((float)$usec + (float)$sec);
}

1.测试file_put_contents

复制代码 代码如下:

<?php
$userCount = 1000;
$itemCount = 1000;
$file = 'ratings.txt';
file_exists($file) &&unlink($file);

$timeStart = microtimeFloat();
for ($i = 0; $i < $userCount; $i++) {
    $uid =random(32);
    for ($j = 0;$j < $itemCount; $j++) {
       $itemId = mt_rand(1, 300000);
       $rating = $j == 0 ? 1 : mt_rand(1, 100) / 100;
       $line = sprintf("%s,%d,%sn", $uid, $itemId, $rating);
       file_put_contents($file, $line, FILE_APPEND);
    }
}
$timeEnd = microtimeFloat();
echo sprintf("Spend time: |%s| second(s)n", $timeEnd -$timeStart);
?>

测试结果:
测试过程中出现了打开文件的错误,而且程序执行完成以后写入的数据不完整,只有999997行,漏了3行。最重要的一点是时间花了307秒多,而用fwrite只花了10秒多的时间,差距还是不小的。

D:myphpresearch>php test2.php
PHP Warning: file_put_contents(ratings.txt): failed to open stream:Permission
denied in D:myphpresearchtest2.php on line 79

Warning: file_put_contents(ratings.txt): failed to open stream:Permission denie
d in D:myphpresearchtest2.php on line 79
Spend time: |307.0586669445|second(s)

...
999994:98xDtLjaeD8MG9ywifegZvRRQzVBZbbw,167670,0.15
999995:98xDtLjaeD8MG9ywifegZvRRQzVBZbbw,234223,0.13
999996:98xDtLjaeD8MG9ywifegZvRRQzVBZbbw,84947,0.79
999997:98xDtLjaeD8MG9ywifegZvRRQzVBZbbw,6489,0.38

2.测试fwrite

复制代码 代码如下:

<?php
$userCount = 1000;
$itemCount = 1000;
$file = 'ratings.txt';
file_exists($file) &&unlink($file);

$fp = @fopen($file, 'ab');
if (!$fp) die("Open $file failed");

$timeStart = microtimeFloat();
for ($i = 0; $i < $userCount; $i++) {
    $uid =random(32);
    for ($j = 0;$j < $itemCount; $j++) {
       $itemId = mt_rand(1, 300000);
       $rating = $j == 0 ? 1 : mt_rand(1, 100) / 100;
       $line = sprintf("%s,%d,%sn", $uid, $itemId, $rating);
       fwrite($fp, $line);
       $k++;
    }
}
if ($fp) @fclose($fp);
$timeEnd = microtimeFloat();
echo sprintf("Spend time: |%s| second(s)n", $timeEnd -$timeStart);
?>

测试结果:
写一百万行记录,10秒左右写完,对于PHP来说,速度算不错了。这是在我的个人电脑上面测试的,如果在生产机上测试,可能速度还要快一些。
D:myphpresearch>php test2.php
Spend time: |10.764221191406|second(s)

用fwrite写入的数据是完整的
999997,QOvcZYFJFlFHjiGyGxAc615kOXdX3Yii,246982,0.03
999998,QOvcZYFJFlFHjiGyGxAc615kOXdX3Yii,240160,0.39
999999,QOvcZYFJFlFHjiGyGxAc615kOXdX3Yii,46296,0.61
1000000,QOvcZYFJFlFHjiGyGxAc615kOXdX3Yii,26211,0.14

3.总结
如果要往文件里面写入大量的数据,则推荐用fwrite,不要用file_put_contents。在高并发的请求中也建议用fwrite。

时间: 2024-09-05 11:12:48

PHP中fwrite与file的相关文章

js清除input中type等于file的值域

 本篇文章主要介绍了js清除input中type等于file的值域(示例代码) 需要的朋友可以过来参考下,希望对大家有所帮助 如下所示; var objFile = document.getElementById('fileID'); objFile.outerHTML=objFile.outerHTML.replace(/(value=").+"/i,"$1"");     

open-在VS2013中CFile的file.Open 点报错

问题描述 在VS2013中CFile的file.Open 点报错 求教各位,如题 代码如下: /*把位图文件读入内存*/ CFile File;//从CFile类中生成一个实例File if (!File.Open("e:8bitcol.bmp", CFile::modeRead)) return;//打开文件只读,打开成功返回非0值,否则返回0 就是这句中File.Open的.报错,报错信息为: no instance of overloaded function "CFi

html5-HTML5中的input file标签

问题描述 HTML5中的input file标签 其中,accept限制类型,capture说是选择默认设备摄像机,为什么好像capture没作用呢?加与不加都是可以选择相机和相册,不知道能不能让该标签只触发选择相机功能呢? 解决方案 http://silverlightchina.net/html/HTML_5/study/2013/0216/21858.html

javaweb-Extjs2.0.2中 监听file的change事件是怎么回事

问题描述 Extjs2.0.2中 监听file的change事件是怎么回事 var form = new Ext.form.FormPanel({ renderTo:'file', labelAlign: 'right', labelWidth: 60, frame:true, autoWidth: true, height:200, fileUpload: true, items: [{ xtype: 'textfield', fieldLabel: '文件名', listeners : {

PHP中fwrite与file_put_contents性能测试代码_php技巧

function microtimeFloat() {    list($usec,$sec) = explode(" ", microtime());    return((float)$usec + (float)$sec);} 1.测试file_put_contents 复制代码 代码如下: <?php$userCount = 1000;$itemCount = 1000;$file = 'ratings.txt';file_exists($file) &&

PHP中fwrite与file_put_contents的区别

相同点:file_put_contents() 函数把一个字符串写入文件中,与依次调用 fopen(),fwrite() 以及 fclose() 功能一样. 不同点:在file_put_contents()函数中使用 FILE_APPEND 可避免删除文件中已有的内容,即实现多次写入同一个文件时的追加功能. 例如: echo file_put_contents("test.txt","Hello World. Testing!",FILE_APPEND); file

前端常见兼容问题系列6: 一些安卓APP的WebView中&lt;input type=&quot;file&quot;&gt;不工作

有一次想做一个HTML5的图片上传功能,主要是依赖<input type="file">来选择本地的图片.开始一切都很顺利,在浏览器中,在淘宝等容器中,都能如预期进行文件选择和上传.在iOS系统下的APP中也都工作正常,但是在一个安卓APP中,无论怎么尝试选择文件,都始终出不来. 我给input的onchange事件打了个alert(),点击时也没有任何反应.看来是<input type="file">在这个容器中根本就不工作. 经过一番检索

mysql中Incorrect key file for table: Try to repair it

损坏的症状 一个损坏的表的典型症状如下: 1 .当在从表中选择数据之时,你得到如下错误:Incorrect key file for table: '...'. Try to repair it 2 .查询不能在表中找到行或返回不完全的数据. 3 .Error: Table 'p' is marked as crashed and should be repaired . 4 .打开表失败: Can't open file: '×××.MYI' (errno: 145) . MySQL 表损坏的

js清除input中type等于file的值域(示例代码)_javascript技巧

如下所示;var objFile = document.getElementById('fileID');objFile.outerHTML=objFile.outerHTML.replace(/(value=\").+\"/i,"$1\"");