Утечка памяти при использовании preg_replace

Cyrille

Новичок
Написал скрипт, который заменяет строчку кода в огромном числе файлов и столкнулся с такой проблемой, что скрипту не хватает памяти. error_log указывает именно на строчку с preg_replace.
 

tony2001

TeaM PHPClub
Спасибо за информацию.
Теперь переходите к сути вашего вопроса.
 

Cyrille

Новичок
Как это обойти/исправить? И еще такой вопрос. На хостинге, на сайте с TYPO3 я переименовал .htacess, но меня продолжает перенаправлять на главную, как отключить перенаправление? Заранее спасибо.
 

Cyrille

Новичок
foreach($files as $file) {


if (is_dir($file)) {
$tree[basename($file)] = GetFilesTree($file, $mask, $tree);
} else if (is_file($file)) {
$tree[] = $file;
if (preg_match("/php/i", $file)) {
DoChange($file);
}
}

}
return $tree;
}

// Функция замены
function DoChange($file) {
global $removes_regular;
$data = file_get_contents($file);
// $data = strtr($data, $removes);
foreach($removes_regular as $regexp => $remove) {
$data = preg_replace($regexp, $remove, $data);
}
file_put_contents($file, $data);
}
 

Beavis

Banned
Этот код не работает сам по себе.
Убери всё лишнее, чтобы код можно было запустить и он работал.
 

Cyrille

Новичок
во всех браузерах меня редиректит на главную, которую я даже переименовал. Код работает, просто вверху объявляются все нужные переменные. такой скрипт работает с меньшим числом файлов, а с большим у него "out of memory"
 

Beavis

Banned
во всех браузерах меня редиректит на главную, которую я даже переименовал. Код работает, просто вверху объявляются все нужные переменные. такой скрипт работает с меньшим числом файлов, а с большим у него "out of memory"
ну значит действительно заканчивается память
тебе нужно заняться отладкой своего скрипта ( http://phpfaq.ru/debug ), используя функцию http://php.net/manual/ru/function.memory-get-usage.php
 

ksnk

прохожий
Вероятно, ключевая фраза "с меньшим количеством файлов - работает". Ситуация с меньшим количеством файлов отличается от неработающей - хранением бОльшего количества файлов в $tree.
Дерево там действительно нужно? Можно читать каталог не glob'ом, а opendir/readdir
Сама операция замены делается над большими файлами? Текстовый файл размером в полметра - вполне может навернуть php и сам, без реплейса.
 

Cyrille

Новичок
Я не знаю. Скрипт должен обойти все директории и файлы, наверное для этого и нужно дерево. операция замены делается над небольшими файлами. и вообще я пробовал убирать нижнюю часть - без нее все работает на ура. т.е если просто все директории и файлы обойти это не проблема, а как начать работать с ними - не хватает памяти...
 

weregod

unserializer
PCRE-либы при адовом насилии текли по памяти в PHP4, возможно, PHP5.2, как обстоит дело сейчас, не знаю.

Cyrille, попытайтесь предоставить самостоятельный скрипт, воспроизводящий проблему без сканирования файловой системы, так же прикрепите выхлоп phpinfo().
 
Сверху