PHP中fwrite与file_put_contents性能测试代码


Posted in PHP onAugust 02, 2013

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,%s\n", $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:\myphp\research>php test2.php
PHP Warning: file_put_contents(ratings.txt): failed to open stream:Permission
denied in D:\myphp\research\test2.php on line 79

Warning: file_put_contents(ratings.txt): failed to open stream:Permission denie
d in D:\myphp\research\test2.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,%s\n", $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:\myphp\research>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。

PHP 相关文章推荐
一个简洁的多级别论坛
Oct 09 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
Oct 04 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Jan 27 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
Jan 03 PHP
php使用curl检测网页是否被百度收录的示例分享
Jan 31 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
Yii框架上传图片用法总结
Mar 28 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
May 16 PHP
YII2自动登录Cookie总是失效的解决方法
Jun 28 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
php使用curl伪造浏览器访问操作示例
Sep 30 PHP
PHP-Fcgi下PHP的执行时间设置方法
Aug 02 #PHP
基于php中使用excel的简单介绍
Aug 02 #PHP
PHP自动识别字符集并完成转码详解
Aug 02 #PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 #PHP
php实现查询百度google收录情况(示例代码)
Aug 02 #PHP
浅析PHP Socket技术
Aug 02 #PHP
php中如何防止表单的重复提交
Aug 02 #PHP
You might like
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
BOM与DOM的区别分析
2010/10/26 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
使用angular写一个hello world
2015/01/23 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
2016/07/14 Javascript
微信小程序 页面跳转事件绑定的实例详解
2017/09/20 Javascript
使用JQuery实现图片轮播效果的实例(推荐)
2017/10/24 jQuery
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
Vue组件实现触底判断
2019/06/26 Javascript
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
python实现查找所有程序的安装信息
2020/02/18 Python
Python解释器及PyCharm工具安装过程
2020/02/26 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
pycharm安装及如何导入numpy
2020/04/03 Python
利用Python发送邮件或发带附件的邮件
2020/11/12 Python
IE兼容css3圆角的实现代码
2011/07/21 HTML / CSS
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
新闻学毕业生自荐信
2013/11/15 职场文书
单位领导证婚词
2014/01/14 职场文书
软环境建设心得体会
2014/09/09 职场文书
2014年实习生工作总结
2014/11/27 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python