[PHP] Regels wissen na maximaal regels

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Hoi all. Ik gebruik in php een script om bezoekers te loggen in een textfile.
Dit werkt allemaal prima, alleen word deze textfile heel groot.

Nu zoek ik een manier om automatisch het logbestand op zeg 50 regels te houden.
Hij moet dus de oudste waarde overschrijven met de nieuwste.

Ik heb overal gezocht met google, maar krijg het niet werkend voor elkaar.

Ik gebruik nu dit script:

<?
$inhoud2 = file("logfile.txt");
$logfile2 = fopen("logfile.txt","w");
fwrite($logfile2, "tekst");
fwrite($logfile2, "\r\n");
fwrite($logfile2,join('',$inhoud2));
fclose($logfile2);
?>

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-09 08:50

gorgi_19

Kruimeltjes zijn weer op :9

Inlezen
Splitten op \r\n (of newline)
Laatste 50 elementen (of minder) wegschrijven
Huidig item wegschrijven
bestand sluiten.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Bedankt voor je snelle reactie, maar ik ben nog geen php guru.

Dat is inderdaad wat ik wil ja, maar nu is de vraag hoe ik dat doe.
Elke regel eindigd al op \r\n. Zou je asjeblieft willen aangeven
welke functie kan zorgen dat die maar de laatste 50 wegschrijft?

[ Voor 12% gewijzigd door Verwijderd op 18-11-2004 17:36 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
explode

dan met een for loop je een bepaald aantal regels wegschrijven.

[ Voor 83% gewijzigd door Michali op 18-11-2004 17:38 ]

Noushka's Magnificent Dream | Unity


  • DukeBox
  • Registratie: April 2000
  • Nu online

DukeBox

loves wheat smoothies

File pointer bovenaanzetten (dus nieuwste data komt bovenaan te staan i.p.v. onderaan), en wegschrijven als stream met max de grootte van het bestand dat je wilt hebben.

[ Voor 23% gewijzigd door DukeBox op 18-11-2004 17:40 ]

Duct tape can't fix stupid, but it can muffle the sound.


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
DukeBox schreef op donderdag 18 november 2004 @ 17:39:
File pointer bovenaanzetten (dus nieuwste data komt bovenaan te staan i.p.v. onderaan), en wegschrijven als stream met max de grootte van het bestand dat je wilt hebben.
En hoe wou je de max. grootte bepalen als het ding 50 regels moet zijn?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Topicstarter
Met mijn script word al het huidige bestand ingeladen... filepointer boven en het oude bestand er onder gezet.

Het hoeft niet perse 50 regels te zijn... mag ook max 200kb bijvoorbeeld.
Het gaat erom dat de textfile niet kan groeien tot een monsterbestand.

[ Voor 30% gewijzigd door Verwijderd op 18-11-2004 18:04 ]


Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
$inhoud2 = file("logfile.txt");
$logfile2 = fopen("logfile.txt","w");
for ($i=0;$i<50;$i++) {
  $inhoud3[$i] = $inhoud2[$i];
}
fwrite($logfile2, "tekst");
fwrite($logfile2, "\r\n");
fwrite($logfile2,join('',$inhoud3));
fclose($logfile2);

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op donderdag 18 november 2004 @ 19:12:
PHP:
1
2
3
4
5
6
7
8
9
$inhoud2 = file("logfile.txt");
$logfile2 = fopen("logfile.txt","w");
for ($i=0;$i<50;$i++) {
  $inhoud3[$i] = $inhoud2[$i];
}
fwrite($logfile2, "tekst");
fwrite($logfile2, "\r\n");
fwrite($logfile2,join('',$inhoud3));
fclose($logfile2);
PHP:
1
2
3
4
5
6
7
8
9
$inhoud2 = file("logfile.txt");
$logfile2 = fopen("logfile.txt","w");
for ($i=0;$i<50 && $i < count($inhoud2);$i++) {
  $inhoud3[$i] = $inhoud2[$i];
}
fwrite($logfile2, "tekst");
fwrite($logfile2, "\r\n");
fwrite($logfile2,join('',$inhoud3));
fclose($logfile2);

Noushka's Magnificent Dream | Unity


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Met maximaal X bytes is het trouwens wat efficienter om het zo te doen dat je niet de hele input file leest:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$max_steps = 200;
$step = 1024;

$input = "tekst\r\n";

// Input meerekenen bij de max. grootte
$cur_steps = $max_steps - ceil(count($input) / 1024);

// Nieuwste data inlezen
$source_data = '';
$fp = fopen('logfile.txt', 'r');
for($i = 0; $i < $cur_steps && !feof($fp); $i++)
{
  $source_data .= fread($fp_source, $step);
}
fclose($fp);

// En de boel wegschrijven
$fp = fopen('logfile.txt', 'w');
fwrite($fp, $input);
fwrite($fp, $source_data);
fclose($fp);


Kijk evt ook nog naar fgets ipv fread als je een maximaal aantal regels, ipv bytes wil.

[ Voor 10% gewijzigd door ACM op 18-11-2004 20:57 ]


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Verwijderd schreef op donderdag 18 november 2004 @ 18:02:
Het hoeft niet perse 50 regels te zijn... mag ook max 200kb bijvoorbeeld.
Het gaat erom dat de textfile niet kan groeien tot een monsterbestand.
PHP:
1
2
3
4
$handle = fopen('logfile.txt', 'r+');
$contents = fread($handle, 204800);
fwrite($handle, $contents);
fclose($handle);


Zou zoiets werken?

Blog [Stackoverflow] [LinkedIn]


Verwijderd

Topicstarter
Geweldig het werkt perfect... bedankt allemaal.

Jullie zijn de beste.

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
ik gok dat je met die max filesize wel wilt dat ie regels niet afkapt midden erin.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik zou ook inderdaad voor de 50 regel versie gaan. Anders heb je kans dat je een waarde kan missen. Zou het niet beter zijn trouwens om gewoon per dag een nieuw tekst bestandje aan te maken en daar in te loggen? Anders kun je net zo goed niet loggen lijkt me.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is voor een logbestand van bekeken pagina's dat ik op de site als link aangeef.
Ik laat de laatste 6 zien, dus meer is niet nodig om op te slaan.

Met het script van Michali heb ik precies wat ik wilde.

Dit topic kan van mij gesloten worden nu.

Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Michali schreef op donderdag 18 november 2004 @ 23:31:
Ik zou ook inderdaad voor de 50 regel versie gaan. Anders heb je kans dat je een waarde kan missen.
...
Dat is natuurlijk geen probleem heh, als je 50 regels pakt en je ahd iets nodig van regel 51 zou het ook weg zijn...

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op vrijdag 19 november 2004 @ 12:15:
Met het script van Michali heb ik precies wat ik wilde.
Script van Sidney he ;) met een kleine aanpassing
RwD schreef op vrijdag 19 november 2004 @ 12:56:
[...]
Dat is natuurlijk geen probleem heh, als je 50 regels pakt en je ahd iets nodig van regel 51 zou het ook weg zijn...
Ja inderdaad. Daarom raadde ik ook aan om gewoon per dag een nieuw bestandje te laten aanmaken. Iets van fopen(date("dmY") . ".txt", "a") of iets dergelijks.

[ Voor 9% gewijzigd door Michali op 19-11-2004 17:28 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op donderdag 18 november 2004 @ 17:28:
Nu zoek ik een manier om automatisch het logbestand op zeg 50 regels te houden.
Hij moet dus de oudste waarde overschrijven met de nieuwste.
PHP:
1
system('tail -n50 log.txt > log.txt');


?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 14:52

crisp

Devver

Pixelated

Verwijderd schreef op vrijdag 19 november 2004 @ 18:17:
[...]


PHP:
1
system('tail -n50 log.txt > log.txt');


?
of head als je bovenin wegschrijft, of zo natuurlijk:
PHP:
1
system('sed -i 50q log.txt');

;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

crisp schreef op vrijdag 19 november 2004 @ 18:42:
[...]

of head als je bovenin wegschrijft[...]
Erg nuttig, een log dat na 50 regels niet meer groeit :+

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 14:52

crisp

Devver

Pixelated

Verwijderd schreef op zondag 21 november 2004 @ 20:17:
[...]
Erg nuttig, een log dat na 50 regels niet meer groeit :+
Verwijderd schreef op donderdag 18 november 2004 @ 18:02:
Met mijn script word al het huidige bestand ingeladen... filepointer boven en het oude bestand er onder gezet.
[...]
;)

Intentionally left blank

Pagina: 1