#!/usr/bin/php
<?php

$lHost       = '127.0.0.1';
$lUser       = 'app';
$lPassword   = 'secret';
$lDatabase   = 'test';
$lPort       = '3306';
$lPort       = '3392';
$lSocket     = '/var/run/mysqld/mysql.sock';
$lMicroSleep = 10000;
$lMicroSleep = 10;
$lNumberRows = 1000000;
$lNumberRows = 100000;

$rc = 0;

declare(ticks = 1);   // Mandatory, otherwise it will NOT work!
function sig_handler($pSignalNumber)
{
	global $mysqli;
	print 'Caught signal: ' . $pSignalNumber . "\n";

  switch ($pSignalNumber) {
    case SIGTERM:
      // handle shutdown tasks
      exit;
      break;
    case SIGHUP:
      // handle restart tasks
      break;
    case SIGINT:
      // handle ^C tasks
      $mysqli->close();
      exit;
      break;
    case SIGUSR1:
      echo "Caught SIGUSR1...\n";
      break;
    default:
      // handle all other signals
  }
}


// MAIN

$mysqli = new mysqli($lHost, $lUser, $lPassword, $lDatabase, $lPort, $lSocket);

if ( mysqli_connect_error() ) {
  $rc = 9999;
  fprintf(STDERR, "ERROR: Connect failed: (%d) %s\n", mysqli_connect_errno(), mysqli_connect_error());
  exit($rc);
}
$mysqli->query('SET NAMES utf8');

pcntl_signal(SIGTERM, 'sig_handler');
pcntl_signal(SIGHUP,  'sig_handler');
pcntl_signal(SIGUSR1, 'sig_handler');
pcntl_signal(SIGINT,  'sig_handler');

while ( true ) {

	$lRandomNumber = rand(1, $lNumberRows);
	$sql = sprintf("SELECT * FROM test WHERE id = %d", $lRandomNumber);

  if ( ($result = $mysqli->query($sql)) === false ) {
  
    fprintf(STDERR, "\nERROR %d: %s\n", $mysqli->errno, $mysqli->error);
    do {

      $retry = 5;
      fwrite(STDERR, "Retry in $retry seconds...\n");
      sleep($retry);

      $mysqli = new mysqli($lHost, $lUser, $lPassword, $lDatabase, $lPort, $lSocket);

      if ( mysqli_connect_error() ) {
        fprintf(STDERR, "ERROR: Connect failed: (%d) %s\n", mysqli_connect_errno(), mysqli_connect_error());
      }
      else {
        $mysqli->query('SET NAMES utf8');
      }
    } while ( mysqli_connect_error()  != null );
  }
  else {

		$row = $result->fetch_assoc();

		if ( ! is_null($row) ) {

			// 50:50 chance
			if ( (rand() % 2) == 1 ) {
				$dml = sprintf("UPDATE test SET data = '%s' WHERE id = %d", md5($row['id']), $row['id']);
				print 'U';
			}
			else {
				$dml = sprintf("DELETE FROM test WHERE id = %d", $row['id']);
				print 'D';
			}
		}
		// No match
		else {
			$dml = sprintf('INSERT INTO test (id, data, ts) values (%d, "Test data insert", CURRENT_TIMESTAMP(6))', $lRandomNumber);
			print 'I';
		}
		$mysqli->query($dml);

    usleep($lMicroSleep);
  }
}

$mysqli->close();
exit($rc);

?>
