【问题标题】:PHP - How to do a string replace in a very large number of files?PHP - 如何在大量文件中进行字符串替换?
【发布时间】:2015-04-22 19:10:30
【问题描述】:

我的服务器中有两百万个文本文件可供互联网用户在线访问。我被要求尽快对这些文件进行更改(字符串替换操作)。我正在考虑在服务器上的每个文本文件上做一个str_replace。但是,我不想占用服务器并使其无法被互联网用户访问。

你认为以下是个好主意吗?

<?php

ini_set('max_execution_time', 1000);


$path=realpath('/dir/');
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
   set_time_limit(100);
  //do str_replace stuff on the file
}

【问题讨论】:

  • “服务器中有两百万个文本文件” - wut.
  • 弄清楚如何做 2,剩下的就跟着来了,就像绵羊一样
  • 为什么这会使服务器无法访问?它应该能够同时运行多个请求。
  • 这听起来不像是 PHP 的工作,而是 findsedsuperuser.com/search?q=replace+multiple+files+sed 类似的东西:superuser.com/questions/146389/…
  • @user2070775 我猜你不希望你的服务器在几分钟后挂起,对吧?阅读我的答案,特别是xargs 的解释。

标签: php sed server


【解决方案1】:

使用shell中的findxargssed,即:

cd /dir

find . -type f -print0 | xargs -0 sed -i 's/OLD/NEW/g

将递归搜索(也隐藏)当前dir 内的所有文件,并使用sedOLD 替换为NEW


为什么是-print0

来自man find

如果您将 find 的输出通过管道传输到另一个程序中,并且 最微弱的可能性是您的文件 搜索可能包含换行符,那么您应该认真 考虑使用“-print0”选项而不是“-print”。


为什么是xargs

来自man find

指定的命令对每个匹配的文件运行一次。

也就是说,如果/dir中有2000个文件,那么find ... -exec ...将导致2000次sed的调用;而find ... | xargs ... 只会调用sed 一次或两次。

【讨论】:

    【解决方案2】:

    不要用 PHP 做这个,它很可能会严重失败,我会占用你所有的系统资源。

    find . -type f -exec sed -i 's/search/replace/g' {} +
    

    上面的例子是搜索和替换字符串,它是递归和常规文件,包括隐藏文件。

    【讨论】:

    • 你的回答会让服务器在一段时间后挂起,你应该使用xargs,阅读我的解释。
    【解决方案3】:

    您也可以使用仅限于一个核心(默认设置)的 Python 程序来执行此操作。如果您的机器有多个核心,并且通常至少有一个是免费的,那么您应该进行设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-10
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多