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下读取文本文件的代码
Jul 02 PHP
mayfish 数据入库验证代码
Apr 30 PHP
php小偷相关截取函数备忘
Nov 28 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
php缓冲 output_buffering和ob_start使用介绍
Jan 30 PHP
简单解决新浪SAE无法上传文件的问题
May 13 PHP
php 数组随机取值的简单实例
May 23 PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 PHP
PHP递归遍历指定文件夹内的文件实现方法
Nov 15 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
May 03 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 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+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
功能强大的php文件上传类
2016/08/29 PHP
cakephp常见知识点汇总
2017/02/24 PHP
js CSS操作方法集合
2008/10/31 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
JQuery获取表格数据示例代码
2014/05/26 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
2016/04/14 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
javascript 面向对象实战思想分享
2017/09/07 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
浅谈Node.js 沙箱环境
2018/05/15 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
node事件循环和process模块实例分析
2020/02/14 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
Python3中使用PyMongo的方法详解
2017/07/28 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
Python实现的文本对比报告生成工具示例
2018/05/22 Python
python 拼接文件路径的方法
2018/10/23 Python
python中实现控制小数点位数的方法
2019/01/24 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
通过实例解析python描述符原理作用
2020/01/22 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
CSS3 文字动画效果
2020/11/12 HTML / CSS
运动会通讯稿300字
2015/07/20 职场文书
行为习惯主题班会
2015/08/14 职场文书
机关干部正风肃纪心得体会
2016/01/15 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android