Я пытался заменить одинарные кавычки в большом XML-файле (110 МБ) этим кодом, но произошла ошибка. Мне нужен код, который может обрабатывать как минимум 3 ГБ XML-файл.
Сообщение об ошибке:
Фатальная ошибка: Допустимый объем памяти 134217728 байт исчерпан
(попытался выделить 20449728 байт) в C: \ xampp \ htdocs \ replace.php на
строка 10
<?php
replace_file('electronics.xml', "'", "'");
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";
?>
Чтение большого файла в php не рекомендуется. Вызовите подходящую командную строку, например, sed
Упростить:
$str = str_replace( "'","'",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);
Ничего не достигнуто.
////
//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
";
}
}
}}