【问题标题】:Laravel local disk append() taking up a lot of memoryLaravel 本地磁盘 append() 占用大量内存
【发布时间】:2019-07-06 15:21:00
【问题描述】:
Storage::disk('local')
         ->append('/newsletter_lists/'.$contact_file_name.'.csv',
                $contact->email.','.$contact->salutation.','.$contact->lastname.','.$contact->unsubscribelink.','.$contact->bonus
          );

这是 Laravel 中的代码,它在 foreach 循环中写入 csv 文件(从数据库中加载块)。 但据我所知,append() 方法每次都打开文件,将内容加载到内存中,添加新行并再次保存文件,这需要大量记录(65 000)需要很长时间。 我正在尝试找到一种方法来附加到文件的末尾而不将内容加载到内存中(如果可能的话)还是我在这里采取了错误的方法?

【问题讨论】:

  • 如果您不介意使用“vanilla” php,请查看fopena+b 模式。
  • @d3L 我不介意使用普通 php,fopen(a+b) 我知道它以二进制模式附加到文件的末尾,我只是在文档中找不到关于发生的事情php打开文件时的内存和速度。但会做一个快速基准测试,看看速度是否有差异。
  • 看起来 append 在 Flysystem 中写入文件末尾的想法已经实现,但尚未实现:github.com/thephpleague/flysystem/pull/696
  • @1000Nettles 是的,你是对的,在拉取请求中我可以看到更多问题,然后实际帮助贡献者。

标签: php laravel file memory


【解决方案1】:

我接受了@d3L 的建议,并使用普通的 php 来追加文件,而不是使用 laravel 的 append() 方法,该方法在每次必须追加一行时加载内容。

$file = fopen(Storage::disk('local')->path('test.csv'), "a+b");

【讨论】:

  • 我从 Redis 写了一个文件,花了好几分钟才完成。我已经应用了更改,它会立即生效,谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-09-04
  • 2016-04-25
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 2017-08-26
相关资源
最近更新 更多