Ben bir dize PHP tüm dosyanın yerini yapmaya çalışıyorum. Benim dosya yüzden satır satır gitmek ve kullanamazsınız sahip 100MB bitti file_get_contents()
. Bu iyi bir çözüm var mı?
PHP kullanmak için gerekli değildir, ben çok komut satırından bu gibi şeyler performans öneriyoruz. Bu iş için en iyi araç byfar, ve kullanımı çok daha kolay.
Her durumda, sed
komutu aradığınız budur:
sed s/search/replace oldfilename > newfilename
: Eğer harf duyarsızlığı ihtiyacınız varsa
sed -i s/search/replace oldfilename > newfilename
Eğer PHP içinde dinamik gerçekleştirmek için bu gerekiyorsa, kullanabileceğiniz passthru()
:
$output = passthru("sed s/$search/$replace $oldfilename > $newfilename");
Buyrun:
function replace_file($path, $string, $replace)
{
set_time_limit(0);
if (is_file($path) === true)
{
$file = fopen($path, 'r');
$temp = tempnam('./', 'tmp');
if (is_resource($file) === true)
{
while (feof($file) === false)
{
file_put_contents($temp, str_replace($string, $replace, fgets($file)), FILE_APPEND);
}
fclose($file);
}
unlink($path);
}
return rename($temp, $path);
}
Bu gibi diyoruz:
replace_file('/path/to/fruits.txt', 'apples', 'oranges');
, Bunu bir seferde birkaç satır olsun değişkeni dökümü, önümüzdeki birkaç satır olsun.
$fh = fopen("bigfile.txt", "flags");
$num = 0;
$length = 300;
$filesize = filesize("bigfile.txt");
while($num < $filesize)
{
$contents = fread($fh, $length);
// .. do stuff ...
$num = $num+$length;
fseek($fh, $num);
}
fclose($fh);
Bunu (test değil) doğru olduğundan emin olmak istiyorum için gidiyoruz. PHP Documentation. üzerine kitaplığa bakın
Zor kısmı geri dosyaya yazma olacak. Aklımda içine açılan ilk fikir dize, yerine başka bir dosyaya yeni içerik yazmak ve sonra sonunda, eski dosyayı silin ve yenisiyle değiştirin yapmaktır.
Dinamik bir görev çünkü doğrudan komut satırından sed kullanamaz ve php onu aramak için gerekirse bu sözdizimi hakkı elde etmek zor: Eğer arama ve değiştirme dizeleri farklı şekillerde kaçmak gerekir bu karakterler
' / $ . * [ ] \ ^ &
Işlevi arama takip eden ve bir dosyada bir dize yerine without bir düzenli ifade olarak arandı dize yorumlama. İsterseniz Yani "*." Dizesini aramak ve "$" ile yerini alabilir.
/**
* str_replace_with_sed($search, $replace, $file_in, $file_out=null)
*
* Search for the fixed string `$search` inside the file `$file_in`
* and replace it with `$replace`. The replace occurs in-place unless
* `$file_out` is defined: in that case the resulting file is written
* into `$file_out`
*
* Return: sed return status (0 means success, any other integer failure)
*/
function str_replace_with_sed($search, $replace, $file_in, $file_out=null)
{
$cmd_opts = '';
if (! $file_out)
{
// replace inline in $file_in
$cmd_opts .= ' -i';
}
// We will use Basic Regular Expressions (BRE). This means that in the
// search pattern we must escape
// $.*[\]^
//
// The replacement string must have these characters escaped
// \ &
//
// In both cases we must escape the separator character too ( usually / )
//
// Since we run the command trough the shell we We must escape the string
// too (yai!). We're delimiting the string with single quotes (') and we'll
// escape them with '\'' (close string, write a single quote, reopen string)
// Replace all the backslashes as first thing. If we do it in the following
// batch replace we would end up with bogus results
$search_pattern = str_replace('\\', '\\\\', $search);
$search_pattern = str_replace(array('$', '.', '*', '[', ']', '^'),
array('\\$', '\\.', '\\*', '\\[', '\\]', '\\^'),
$search_pattern);
$replace_string = str_replace(array('\\', '&'),
array('\\\\', '\\&'),
$replace);
$output_suffix = $file_out ? " > '$file_out' " : '';
$cmd = sprintf("sed ".$cmd_opts." -e 's/%s/%s/g' \"%s\" ".$output_suffix,
str_replace('/','\\/', # escape the regexp separator
str_replace("'", "'\''", $search_pattern) // sh string escape
),
str_replace('/','\\/', # escape the regexp separator
str_replace("'", "'\''", $replace_string) // sh string escape
),
$file_in
);
passthru($cmd, $status);
return $status;
}
böyle bir şey?
$infile="file";
$outfile="temp";
$f = fopen($infile,"r");
$o = fopen($outfile,"a");
$pattern="pattern";
$replace="replace";
if($f){
while( !feof($f) ){
$line = fgets($f,4096);
if ( strpos($pattern,"$line") !==FALSE ){
$line=str_replace($pattern,$replace,$line);
}
fwrite($o,$line);
}
}
fclose($f);
fclose($o);
rename($outfile,$infile);