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 相关文章推荐
PHP4在WinXP下IIS和Apache2服务器上的安装实例
Oct 09 PHP
php+mysql开源XNA 聚合程序发布 下载
Jul 13 PHP
PHP在字符断点处截断文字的实现代码
Apr 21 PHP
PHP 第二节 数据类型之转换
Apr 28 PHP
php代码中使用换行及(\n或\r\n和br)的应用
Feb 02 PHP
使用PHP函数scandir排除特定目录
Jun 12 PHP
PHP实现抓取HTTPS内容
Dec 01 PHP
简单解决微信文章图片防盗链问题
Dec 17 PHP
Yii2实现自定义独立验证器的方法
May 05 PHP
PHP用函数嵌入网站访问量计数器
Oct 27 PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 PHP
phpstudy隐藏index.php的方法
Sep 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脚本加密专家php解密算法
2020/09/13 PHP
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
jQuery的text()方法用法分析
2014/12/20 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
超级简单实现JavaScript MVC 样式框架
2015/03/24 Javascript
向JavaScript的数组中添加元素的方法小结
2015/10/24 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
2016/04/25 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
详解node中创建服务进程
2017/05/09 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
怎样使用Python脚本日志功能
2016/08/14 Python
python如何获取服务器硬件信息
2017/05/11 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
python实现局域网内实时通信代码
2019/12/22 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
酒店服务与管理毕业生求职信
2013/11/02 职场文书
《青海高原一株柳》教学反思
2014/04/25 职场文书
人代会标语
2014/06/30 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
出国留学自荐信模板
2015/03/06 职场文书
环境卫生整治简报
2015/07/20 职场文书
高效课堂教学反思
2016/02/24 职场文书
DIY胆机必读:各国电子管评价
2022/04/06 无线电