【问题标题】:PHP unlink large number of filesPHP取消链接大量文件
【发布时间】:2016-10-04 15:49:36
【问题描述】:

我在一个目录中有大约 600k 图像,我需要使用 PHP 删除其中几乎一半。在一个数组中,我存储了需要删除的文件的名称,当我尝试遍历数组并在 ~1k 次迭代后调用 unlink($filename) 服务器崩溃 时,我必须重新启动它(CentOS 7)。 PHP 内存使用量为 81MB,这是因为数组很大,我使用它是因为它与目录中的文件进行一些比较更快,并不重要。

foreach($filenames as $filename){

  // Deletes file
  unlink($filename);
}

我坚持,也许我应该试试exec(),但它很慢,而且过了一段时间它也会冻结。我也在这里看到了一个discussion unlink() 是异步的,但我认为不是。

我不需要rmdir() 和删除目录,因为所有 600k 文件都在一个目录中,并且应用程序中的文件和实体之间的关系存储在 DB 中。

是否有任何其他替代方法可以从 PHP 中删除文件,或者有一些建议如何使这个东西工作?

【问题讨论】:

  • 你是从浏览器运行这个吗?还是从命令行?如果你正在运行一些需要很长时间才能执行的东西,那么最好不要从浏览器中运行它
  • 当然来自 CLI
  • 为什么必须在 PHP 中完成?
  • 在这个命令中删除,例如一次100个文件,把这个命令放到cron中。
  • 它不需要从 PHP 运行,但我更喜欢,如果有办法在 PHP 中执行,那为什么不呢,我也可以轻松地与 DB、ORM 通信。

标签: php centos unlink


【解决方案1】:

我找到了一种解决方案。首先使用file_put_contents() 将所有文件的列表写入to_delete.txt 文件(每行一个文件名)。然后运行xargs -a to_delete.txt -d'\n' rm 删除文件(xarg 尽可能多地向 rm 添加参数,它不会为每个文件运行 rm 命令)。

【讨论】:

    猜你喜欢
    • 2012-02-02
    • 2012-08-05
    • 2012-02-02
    • 2017-05-06
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多