Замените символ в большом файле, используя переполнение стека

Я пытался заменить одинарные кавычки в большом XML-файле (110 МБ) этим кодом, но произошла ошибка. Мне нужен код, который может обрабатывать как минимум 3 ГБ XML-файл.

Сообщение об ошибке:

Фатальная ошибка: Допустимый объем памяти 134217728 байт исчерпан
(попытался выделить 20449728 байт) в C: \ xampp \ htdocs \ replace.php на
строка 10

<?php
replace_file('electronics.xml', "'", "&#39;");

function replace_file($path, $string, $replace)
{
$file = fopen($path, 'a+');
while (feof($file) === false)
{
$str=file_get_contents($path);
$str=str_replace($string, $replace, fgets($file));
}
fclose($file);
}
echo "replace done";
?>

1

Решение

Чтение большого файла в php не рекомендуется. Вызовите подходящую командную строку, например, sed

Ссылка: http://www.grymoire.com/Unix/Sed.html

1

Другие решения

Упростить:

$str = str_replace( "'","&#39;",file_get_contents('electronics.xml'));

Это просто очень неправильно:

Открытие XML

    $file = fopen($path, 'a+');

В то время как Loop без причины, fgets читает в конец файла, поэтому цикл завершается на первой итерации.

    while (feof($file) === false)
{

повторное чтение всего содержимого одного и того же файла без какой-либо цели

        $str=file_get_contents($path);

Чтение во всем файле, без указания длины, поэтому чтение в EOF

        $str=str_replace($string, $replace, fgets($file));
}
fclose($file);

Ничего не достигнуто.

0

    ////
//PHP 5.3 + Class find and replace string in files
//
//by Bruce Afruz
//
//2013
//
//example usage for single file:
//
//$new = new fileReplacement('./');
//$new->setExt("check.php");
//$new->changeContents("hello", "goodbye");
//
//example usage for multiple files:
//
//$new = new fileReplacement('./test');
//$new->setExt("*.html");
//$new->changeContents("hello", "goodbye");
//
//to change directory:
//
//$new = new fileReplacement('./test');
//$new->setDir("./test2");
//$new->setExt("*.html");
//$new->changeContents("hello", "goodbye");
////


class fileReplacement
{
private $ext , $dir ;
public function getDir() {
return $this->dir;
}
public function setDir($dir) {
$this->dir = $dir;
}
public function getExt() {
return $this->ext;
}
public function setExt($ext) {
$this->ext = $ext;
}
function __construct($dir) {
$this->dir = $dir;
}

public function rglob($pattern = '*', $flags = 0, $path = '') {

chdir($this->getDir());
$paths = glob($path . '*', GLOB_MARK | GLOB_ONLYDIR | GLOB_NOSORT);
$files = glob($path . $pattern, $flags);
foreach ($paths as $path) {
$files = array_merge($files, $this->rglob($pattern, $flags, $path));
}
return $files;
}

public function changeContents($replace , $sentence , $flags = 0, $path = '') {
$all = $this->rglob($this->getExt() , $flags, $path);
foreach ($all as $file) {

$filename = $file;
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
$contents = str_replace($replace , $sentence, $contents);

if (is_writable($filename)) {
if (!$handle = fopen($filename, 'w+')) {
echo "Cannot open file ($filename)
";
exit;
}

// Write $contents to our opened file.
if (fwrite($handle, $contents) === FALSE) {
echo "Cannot write to file ($filename)
";
exit;
}

echo "Success, wrote content to file ($filename)
";

fclose($handle);
} else {
echo "The file $filename is not writable
";
}
}
}}
0
По вопросам рекламы [email protected]