У меня есть два миллиона текстовых файлов на сервере, доступном для интернет-пользователей. Меня попросили как можно скорее изменить эти файлы (операция замены строки). Я думал о том, чтобы сделать 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
}
использование находить, xargs а также СЕПГ от shell
т.е.
cd /dir
find . -type f -print0 | xargs -0 sed -i 's/OLD/NEW/g
Будет искать все файлы рекурсивно (также скрыто) внутри текущего dir
и заменить OLD
за NEW
с помощью sed
,
Зачем -print0
?
От человек найти:
Если вы передаете вывод find в другую программу и
есть малейшая вероятность того, что файлы, которые вы
поиск может содержать новую строку, тогда вам следует серьезно
рассмотрите возможность использования опции «-print0» вместо «-print».
Зачем xargs
?
От человек найти:
Указанная команда запускается один раз для каждого соответствующего файла.
То есть, если есть 2000 файлов в /dir
, затем find ... -exec ...
приведет к 2000 вызовам sed
; в то время как find ... | xargs ...
будет вызывать только sed
один или два раза
Не делайте этого с PHP, скорее всего это ужасно провалится, и я займу все ваши системные ресурсы.
find . -type f -exec sed -i 's/search/replace/g' {} +
Пример выше с поиском и заменой строки и ее рекурсивными и обычными файлами, включая скрытые.
Вы также можете сделать это с помощью программы на Python, ограниченной одним ядром (по умолчанию). Если ваша машина имеет несколько ядер, и, по крайней мере, одно из них, как правило, бесплатно, вы должны быть настроены.