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日历程序
Dec 06 PHP
PHP 分页原理分析,大家可以看看
Dec 21 PHP
了解Joomla 这款来自国外的php网站管理系统
Mar 11 PHP
php实例分享之二维数组排序
May 15 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
PHP利用imagick生成组合缩略图
Feb 19 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP实现验证码校验功能
Nov 16 PHP
Laravel5.1 框架响应基本用法实例分析
Jan 04 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
Aug 24 PHP
PHP之header函数详解
Mar 02 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
基于PHP的简单采集数据入库程序【续篇】
2014/07/30 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
JS中script标签defer和async属性的区别详解
2016/08/12 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
浅谈React高阶组件
2018/03/28 Javascript
Vue-cli3项目配置Vue.config.js实战记录
2018/07/29 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
浅谈Python 字符串格式化输出(format/printf)
2016/07/21 Python
Python编程生成随机用户名及密码的方法示例
2017/05/05 Python
PyQt5每天必学之组合框
2018/04/20 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
个人找工作求职简历的自我评价
2013/10/20 职场文书
总务岗位职责
2013/11/19 职场文书
活动策划求职信模板
2014/04/21 职场文书
初中生操行评语大全
2014/04/24 职场文书
化工实习心得体会
2014/09/09 职场文书
护士工作失误检讨书
2014/09/14 职场文书
2015年护士节慰问信
2015/03/23 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android