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 相关文章推荐
PHP之变量、常量学习笔记
Mar 27 PHP
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
一个典型的PHP分页实例代码分享
Jul 28 PHP
简单实用的.net DataTable导出Execl
Oct 28 PHP
PHP上传文件时文件过大$_FILES为空的解决方法
Nov 26 PHP
php正则表达式获取内容所有链接
Jul 24 PHP
PHP实现伪静态方法汇总
Jan 13 PHP
PHP Echo字符串的连接格式
Mar 07 PHP
PHP实现的随机IP函数【国内IP段】
Jul 20 PHP
利用PHP抓取百度阅读的方法示例
Dec 18 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
Mar 21 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写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
PHP设计模式之工厂模式与单例模式
2016/09/28 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
js获取select标签的值且兼容IE与firefox
2013/12/30 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
mac中利用NVM管理不同node版本的方法详解
2017/11/08 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
vue cli 3.0 使用全过程解析
2018/06/14 Javascript
Vuex入门到上手教程
2018/06/20 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
Python冒泡排序注意要点实例详解
2016/09/09 Python
Python3.6简单反射操作示例
2018/06/14 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
python 提取文件指定列的方法示例
2019/08/07 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
会计专业自我评价
2014/02/12 职场文书
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
电子商务助理求职自荐信
2014/04/10 职场文书
项目建议书怎么写
2014/05/15 职场文书
酒店周年庆活动方案
2014/08/21 职场文书
2014年党员个人工作总结
2014/12/02 职场文书
实习护士自荐信
2015/03/25 职场文书
2016年教代会开幕词
2016/03/04 职场文书
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers