RaketenDatenfuzzi: Beispiel: Individuelles Loggen in Datenbank, mit PIPE/FIFO und PHP

Beitrag lesen

Ansage war:

Dazu reicht z.B. ein laufendes MySQL und ein als Dienst etabliertes Schell-Skript, welches einmal die Verbindung zur Datenbank aufbaut, den Logstring mit read str; entgegennimmt und nach Entschärfung den Insert macht.

Ich hab mir gedacht, ich mach das mal in PHP...

<?php

/* database: test, table: phplog
MariaDB [test]> describe test.phplog\G
*************************** 1. row ***************************
  Field: id
   Type: int(11)
   Null: NO
    Key: PRI
Default: NULL
  Extra: auto_increment
*************************** 2. row ***************************
  Field: timestamp
   Type: timestamp
   Null: YES
    Key: MUL
Default: CURRENT_TIMESTAMP
  Extra: 
*************************** 3. row ***************************
  Field: entry
   Type: varchar(1000)
   Null: YES
    Key: 
Default: NULL
  Extra: 
*/


$FH = fopen( 'php://stdin', 'r' );
$mysqli = mysqli_connect("localhost", "test", "hallo", "test");
$sql    ='INSERT INTO `phplog` (`entry`) values (?)';
$stmt   = $mysqli->prepare( $sql );
$entry  = 'Connected from '. __FILE__;
$stmt -> bind_param( "s", $entry );
$stmt -> execute();

while ( $entry = fgets( $FH ) ) {
	$entry = substr( trim( $entry ), 0, 1000 ) ;
	$stmt -> bind_param( 's', $entry );
	$stmt -> execute();
}

Test mit /var/log/syslog (Derzeit 303 Zeilen):

wc -l /var/log/syslog; time cat /var/log/syslog | php test.php
303 /var/log/syslog

real  0m0,276s
user  0m0,029s
sys	  0m0,015s

Wie weiter? Man kann das Skript wie folgt umbauen:

#$FH = fopen( 'php://stdin', 'r' );
$FH = fopen( '/tmp/phplogger', 'r+' );

dazu den angebenen FiFO bauen:

mkfifo /tmp/phplogger

Das Zeug starten:

php /tmp/test.php

und dann so loggen:

echo "Eintrag" > /tmp/phplogger 

Ist der Eintrag drin?

MariaDB [test]> select * from phplog order by id desc limit 1;
+------+---------------------+---------+
| id   | timestamp           | entry   |
+------+---------------------+---------+
| 3096 | 2020-03-11 14:35:54 | Eintrag |
+------+---------------------+---------+