PHP - 如何在大量文件中替换字符串?

时间:2015-04-22 19:10:30

标签: php sed server

我在互联网用户可在线访问的服务器中有200万个文本文件。我被要求尽快对这些文件进行更改(字符串替换操作)。我在考虑在服务器上的每个文本文件上执行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
}

3 个答案:

答案 0 :(得分:4)

使用shell中的findxargssed,即:

cd /dir

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

将在当前dir内递归搜索(隐藏)所有文件,并使用OLD替换NEW sed

为什么-print0

来自man find

  

如果要将find的输出传送到另一个程序中   你所拥有的文件是最微弱的可能性   搜索可能包含换行符,那么你应该认真对待   考虑使用&#39; -print0&#39;选项而不是&#39; -print&#39;。

为什么xargs

来自man find

  

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

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

答案 1 :(得分:3)

不要用PHP做这件事,它最有可能失败,我会占用你所有的系统资源。

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

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

答案 2 :(得分:0)

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