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

3

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

8
一台服务器上有两百万个文本文件。 - Dai
2
弄清楚如何做2,其余的就会跟随,就像羊一样。 - Funk Forty Niner
为什么这会导致服务器无法访问?它应该能够同时运行多个请求。 - Barmar
7
这似乎不是 PHP 的工作,而是 findsed 命令的工作。请参考此链接以获取相关信息:http://superuser.com/search?q=replace+multiple+files+sed ,也可以参考以下内容:http://superuser.com/questions/146389/how-to-replace-every-text-in-a-mac-folder/146392#146392 。 - Michael Berkowski
@user2070775,我猜你不想让你的服务器在几分钟后挂掉,对吧?请阅读我的答案,特别是“xargs”解释部分。 - Pedro Lobito
3个回答

4

使用shell中的findxargssed,例如:

cd /dir

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

将会递归地搜索当前dir中的所有文件(包括隐藏文件),并使用sedNEW替换OLD
为什么要用-print0
man find中得知:

如果你将find的输出管道传入另一个程序,并且有可能要搜索的文件包含换行符,请使用“-print0”选项而不是“-print”。


为什么要用xargs
man find中得知:

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

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

3
不要使用PHP进行这个操作,否则很可能会严重失败并且占用所有系统资源。
find . -type f -exec sed -i 's/search/replace/g' {} +

上面的示例中包含查找和替换字符串,这是递归和包括隐藏文件在内的常规文件。

你的回答会导致服务器在一段时间后挂起,你应该使用 xargs,请阅读我的解释。 - Pedro Lobito

0

你也可以使用一个仅限于一个核心(这是默认设置)的Python程序来完成此操作。如果您的计算机有多个核心,并且至少有一个通常是空闲的,那么您应该可以完成此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接