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中使用反射技术的架构插件使用说明
May 18 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
Aug 07 PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 PHP
Yii列表定义与使用分页方法小结(3种方法)
Jul 15 PHP
简单的pgsql pdo php操作类实现代码
Aug 25 PHP
Thinkphp连表查询及数据导出方法示例
Oct 15 PHP
php简单中奖算法(实例)
Aug 15 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
实例讲解PHP中使用命名空间
Jan 27 PHP
yii框架使用分页的方法分析
Jul 25 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 PHP
PHP网站常见安全漏洞,及相应防范措施总结
Mar 01 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下连接mssql2005的代码
2011/01/17 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
一个非常完美的读写ini格式的PHP配置类分享
2015/02/12 PHP
Twig模板引擎用法入门教程
2016/01/20 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
vue实现移动端input上传视频、音频
2020/08/18 Javascript
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
树莓派升级python的具体步骤
2020/07/05 Python
python中scipy.stats产生随机数实例讲解
2021/02/19 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
西班牙创意礼品和小工具网上商店:Curiosite
2016/07/26 全球购物
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
导游的职业规划书范文
2013/12/27 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
英语专业自荐书
2014/06/13 职场文书
2014年文明创建工作总结
2014/11/25 职场文书
保护校园环境倡议书
2015/04/28 职场文书