Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Usuwanie wielu linii z pliku
Tomek58
post
Post #1





Grupa: Zarejestrowani
Postów: 74
Pomógł: 0
Dołączył: 30.08.2007

Ostrzeżenie: (0%)
-----


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);

?>


--------------------
Procesor: 2,4 GHz
Dysk: 180 GB
Ramy: 1538 MB
Grafika: GeForce 256 MB

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
nowotny
post
Post #2





Grupa: Zarejestrowani
Postów: 875
Pomógł: 122
Dołączył: 2.02.2008

Ostrzeżenie: (0%)
-----


  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...

Ten post edytował nowotny 29.07.2008, 20:20:17
Go to the top of the page
+Quote Post
Tomek58
post
Post #3





Grupa: Zarejestrowani
Postów: 74
Pomógł: 0
Dołączył: 30.08.2007

Ostrzeżenie: (0%)
-----


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);

?>


Ten post edytował Tomek58 29.07.2008, 20:26:20


--------------------
Procesor: 2,4 GHz
Dysk: 180 GB
Ramy: 1538 MB
Grafika: GeForce 256 MB

Go to the top of the page
+Quote Post
nowotny
post
Post #4





Grupa: Zarejestrowani
Postów: 875
Pomógł: 122
Dołączył: 2.02.2008

Ostrzeżenie: (0%)
-----


Tak samo... poczytaj sobie manual o array_slice" title="Zobacz w manualu PHP" target="_manual i wszystko będziesz wiedział...
Go to the top of the page
+Quote Post
Tomek58
post
Post #5





Grupa: Zarejestrowani
Postów: 74
Pomógł: 0
Dołączył: 30.08.2007

Ostrzeżenie: (0%)
-----


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);



?>


--------------------
Procesor: 2,4 GHz
Dysk: 180 GB
Ramy: 1538 MB
Grafika: GeForce 256 MB

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 10:25