[php] hoe om te gaan met 'grote' bestanden?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • decramy
  • Registratie: December 2001
  • Laatst online: 07:36

decramy

root@birdie:~#

Topicstarter
ik heb hier een logfile van een constante ping met iedere keer de zelfde regel:
Jul 09 08:19:29 Pinging 213.201.128.21: time=12.0
als de host onbereikbaar is staat er
Jul 09 06:15:00 Pinging 213.201.128.21: UNREACABLE!

Nu heb ik deze code geschreven:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/php4
<?php

$tehoog = 100; //in milisec

$handle = fopen("./kabelmodem.log","r");
$log = fread($handle,filesize("./kabelmodem.log"));
fclose($handle);
$logentry = split("\n",$log);
foreach($logentry as $entry){
    $ent = split(" ",$entry);
    if($ent[5] == "UNREACABLE!" || (substr($ent[5],5,-2) >= $tehoog))
        echo $entry."\n";
}
?>

Maar die geeft:
dagobert:~# ./kabelmodem_check_time.php

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 50 bytes) in /root/kabelmodem_check_time.php on line 9


Blijkbaar is het werken met array`s niet optimaal ;)
Is er een andere manier waardoor ik de zelfde output krijg op een andere manier?

20*375Wp met Enphase IQ7+ micro's | Stiebel Eltron HGE Water/Water WP 9kW | Tesla M3, powered by SmartEVSE | Servertje @ www.coloclue.net


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Je hebt nou twee keer ($log en $logentry) dat bestand in je heugen staan, en dat vind PHP niet zo fijn blijkbaar. Je hoeft het ook maar een keer te hebben dus je zou naar de file() functie kunnen kijken. Die geeft meteen een array met de regels terug.

Acties:
  • 0 Henk 'm!

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

UNREACABLE!

Beetje rare typo in de foutmelding ook. (UNREACHABLE)

Misschien kun je de logfile regel voor regel inlezen:
PHP:
1
2
3
4
5
6
$handle = fopen("./kabelmodem.log","r");
while (!feof($handle)) {
   $buffer = fgets($handle, 4096);
   echo $buffer;
}
fclose($handle);

Eventueel kun je de tweede parameter van fgets nog weglaten, hij leest dan tot de eerste regeleinde.

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


Acties:
  • 0 Henk 'm!

Verwijderd

Probeer dit eens
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
$handle = fopen("./kabelmodem.log","r"); 
while (!feof($handle)) { 
   $log = split(" ", fgets($handle)); 
} 
fclose($handle);

echo "<pre>";
print_r($log);
echo "</pre>";
?>

en inplaats van een split zou je een mooie regex kunnen bouwen. dan heb je gelijk alle info die je nodig hebt netjes in een dyn.array :*)

Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
grep is hier voor bedoeld volgens mij. dit kan je dan icm met php gebruiken :)

succes :)