Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Usuwanie wielu linii z pliku
Forum PHP.pl > Forum > Przedszkole
Tomek58
Witam!
Próbuję napisać skrypt do usuwania z pliku wielu linii na raz. Przerobiłem skrypt do usuwania jednej linii, ale strasznie obciąża serwer i czasami wyskakuje błąd o wykorzystaniu limitu czasu. Czy da się to wykonać szybciej, tak aby nie wyskakiwał błąd?

Oto mój skrypt (usuwa 269 linii od góry licząc):

Cytat
<?PHP

$start = 0;
$koniec = 269;

do {

$toDelete = 0;
$lines = file('strona.html');
unset($lines[$toDelete]);
file_put_contents('strona.html', $lines);
$start ++;

} while ($start != $koniec);

?>
nowotny
  1. <?php
  2. $lines = file('strona.html');
  3. $output = array_slice($lines, 269);
  4. file_put_contents('strona.html', $output);
  5. ?>


A błąd polegał na tym że za każdą iteracją pętli wczytywałeś plik do tablicy na której potem robiłeś operację i z powrotem zapisywałeś plik... i tak 269 razy... operacje odczytu i zapisu do pliku są jednymi z najwolniejszych w PHP... w zasadzie wystarczyłoby przesunąć wczytanie pliku do tablicy przed pętlę... w samej pętli operować na tej jednej tablicy i zapisać już na końcu, po skończeniu pętli...
Tomek58
Dzięki, teraz operację wykonuje błyskawicznie :-).

Jeszcze jeden problemik, jak zostawić kilka linii bez naruszenia? Tzn. chciałbym jeszcze usunąć linie z końca pliku, tak aby zostały te które mnie interesują.

Wcześniej skrypt wyglądał tak (pozostawiał 16 linii), ale działał tylko przy małej ilości linii:

Cytat
<?PHP

$start = 0;
$koniec = 269;
$koniec2 = 268;

do {

$toDelete = 0;
$lines = file('strona.html');
unset($lines[$toDelete]);
file_put_contents('strona.html', $lines);
$start ++;

} while ($start != $koniec);

do {

$toDelete = 16;
$lines = file('strona.html');
unset($lines[$toDelete]);
file_put_contents('strona.html', $lines);
$start ++;

} while ($start != $koniec2);

?>
nowotny
Tak samo... poczytaj sobie manual o array_slice" title="Zobacz w manualu PHP" target="_manual i wszystko będziesz wiedział...
Tomek58
Dzięki, załapałem o co chodzi :-).
A więc gotowy skrypt wygląda tak (zachowa 16 linii począwszy od 269):

Cytat
<?PHP

$lines = file('strona.html');
$output = array_slice($lines, 269);
file_put_contents('strona.html', $output);

$lines = file('strona.html');
$output = array_slice($lines, 0, 16);
file_put_contents('strona.html', $output);



?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.