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 expects parameter 1 to be resource, array given 错误
Mar 23 PHP
PHP5中实现多态的两种方法实例分享
Apr 21 PHP
php中file_get_contents与curl性能比较分析
Nov 08 PHP
php下Memcached入门实例解析
Jan 05 PHP
php实现字符串翻转的方法
Mar 27 PHP
PHP中SSO Cookie登录分析和实现
Nov 06 PHP
PHP扩展框架之Yaf框架的安装与使用
May 18 PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
Sep 16 PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 PHP
PHP代码加密的方法总结
Mar 13 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 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
php4的彩蛋
2006/10/09 PHP
我的论坛源代码(五)
2006/10/09 PHP
php strtotime 函数UNIX时间戳
2009/01/14 PHP
Laravel 5 学习笔记
2015/03/06 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
通用JS事件写法实现代码
2009/01/07 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
ECMAScript6块级作用域及新变量声明(let)
2015/06/12 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
Python使用MONGODB入门实例
2015/05/11 Python
用Python的Django框架来制作一个RSS阅读器
2015/07/22 Python
Django admin美化插件suit使用示例
2017/12/12 Python
python递归法解决棋盘分割问题
2019/07/17 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
python接入支付宝的实例操作
2020/07/20 Python
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
房屋出租协议书
2014/04/10 职场文书
家庭暴力离婚起诉书
2015/05/18 职场文书
学风建设主题班会
2015/08/17 职场文书
2016年感恩教师节校园广播稿
2015/12/18 职场文书
详解CSS3浏览器兼容
2022/12/24 HTML / CSS