Chinaunix首页 | 论坛 | 博客
  • 博客访问: 344373
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 223
  • 用 户 组: 普通用户
  • 注册时间: 2020-07-01 21:01
个人简介

青岛风月网www.qdspaw.com,男士减压休闲养生体验平台。

文章分类
文章存档

2020年(21)

我的朋友

分类: PHP

2020-07-03 19:13:21

file_put_contents要比fwrite好,这个也很好理解,因为写入文件,file_put_contents就一行代码,fwrite至少三行,虽然不是说代码行少就一定快,但就这个写入功能来说,file_put_contents就等于fopen fwrite fclose,之所以前者快,就是因为一次api交互,直接干了这三件事,后者有三次api的开销。

点击(此处)折叠或打开

  1. <?php
  2. $n = "1\n";
  3.  
  4. $fp = @fopen('2.txt', 'ab');
  5. flock($fp, LOCK_EX|LOCK_NB);
  6. fwrite($fp, $n);
  7. flock($fp, LOCK_UN);
  8. fclose($fp);
再说问题,其实不能说是问题,应该说是一个需要注意的点,默认情况下,两者都是不是使用独占锁的方式运行,所以在高并发下,会有写入的内容被覆盖的问题。这里需要通过独占锁的方式来解决。
对比file_put_contents和fwrite的性能,是用的循环100w次写入的方式对比,记得当时的结论是,file_put_contents用了300多秒,fwrite 10秒,那是因为,他讲fopen和fcolse放到了循环外,如果你100w拼成一个长字符,最后一次写入,那肯定更快。所以很多结论都是有特定场景的。

点击(此处)折叠或打开

  1. Concurrency Level: 50
  2. Time taken for tests: 0.095 seconds
  3. Complete requests: 100
  4. Failed requests: 0
  5. Write errors: 0
  6. Total transferred: 21500 bytes
  7. HTML transferred: 0 bytes
  8. Requests per second: 1049.80 [#/sec] (mean)
  9. Time per request: 47.628 [ms] (mean)
  10. Time per request: 0.953 [ms] (mean, across all concurrent requests)
  11. Transfer rate: 220.42 [Kbytes/sec] received


当然了,这两个函数,和你的系统,软件版本,文件系统有很大的关系,linux下的性能明显比window要好一些。所以这里就像我上篇文章说的,web程序,和你做一个类似的批处理程序,写法是不一样,因为着重的点不一样。就是因为没有锁,所以才有好的并发效果,但是你如果一定要强制写入的完整,就需要牺牲并发的性能。
如果我们在做文件处理脚本,就适合使用颗粒度更小的函数,这样你才能在关键点,通过函数、系统逻辑特性做出优化。所以没有银弹,任何的东西都是相对的。
阅读(1865) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~