- Improved Logging

- Error handler
- Shutdown function
- Added OnShutdown callback
This commit is contained in:
Steffen Schröder 2013-12-09 15:43:08 +01:00
parent c97b4166f2
commit e9e1fb94d9
4 changed files with 107 additions and 42 deletions

View File

@ -1,29 +1,89 @@
<?php
// Run configuration
define('LOG_WRITE_CURRENT_FILE', 'ManiaControl.log'); // Write current log to extra file in base dir
define('LOG_NAME_USE_DATE', true); // Use current date as suffix for log file name in logs folder
define('LOG_NAME_USE_PID', true); // Use current process id as suffix for log file name in logs folder
// Define base dir
define('ManiaControlDir', __DIR__);
// Set process settings
ini_set('memory_limit', '128M');
ini_set('memory_limit', '64M');
if (function_exists('date_default_timezone_get') && function_exists('date_default_timezone_set')) {
date_default_timezone_set(@date_default_timezone_get());
}
// Error handling
ini_set('log_errors', true);
ini_set('display_errors', '1');
ini_set('error_reporting', -1);
ini_set('display_startup_errors', true);
if (!is_dir('logs')) {
mkdir('logs');
// Build log file name
$logFileName = ManiaControlDir . '/logs/';
if (!is_dir($logFileName)) {
mkdir($logFileName);
}
ini_set('error_log', 'logs/ManiaControl_' . getmypid() . '.log');
$logFileName .= '/ManiaControl';
if (LOG_NAME_USE_DATE) $logFileName .= '_' . date('Y-m-d');
if (LOG_NAME_USE_PID) $logFileName .= '_' . getmypid();
$logFileName .= '.log';
define('LOG_FILE', $logFileName);
// Load ManiaControl class
require_once __DIR__ . '/core/ManiaControl.php';
// Delete old current log file
if (LOG_WRITE_CURRENT_FILE) {
$currentLogFileName = ManiaControlDir . '/' . LOG_WRITE_CURRENT_FILE;
if (file_exists($currentLogFileName) && is_writable($currentLogFileName)) {
unlink($currentLogFileName);
}
define('LOG_CURRENT_FILE', $currentLogFileName);
}
// Log function
function logMessage($message) {
$message .= PHP_EOL;
file_put_contents(LOG_CURRENT_FILE, $message, FILE_APPEND);
file_put_contents(LOG_FILE, $message, FILE_APPEND);
echo $message;
}
// Error level parse function
function getErrorTag($errorLevel) {
if ($errorLevel == E_NOTICE) {
return '[PHP NOTICE]';
}
if ($errorLevel == E_WARNING) {
return '[PHP WARNING]';
}
if ($errorLevel == E_ERROR) {
return '[PHP ERROR]';
}
if ($errorLevel == E_USER_NOTICE) {
return '[ManiaControl NOTICE]';
}
if ($errorLevel == E_USER_WARNING) {
return '[ManiaControl WARNING]';
}
if ($errorLevel == E_USER_ERROR) {
return '[ManiaControl ERROR]';
}
return "[PHP {$errorLevel}]";
}
// Register error handler
set_error_handler(
function ($errorNumber, $errorString, $errorFile, $errorLine) {
if (error_reporting() == 0) {
// Error suppressed
return false;
}
// Log error
$errorTag = getErrorTag($errorNumber);
$message = "{$errorTag}: {$errorString} in File '{$errorFile}' on Line {$errorLine}!";
logMessage($message);
if ($errorNumber == E_ERROR || $errorNumber == E_USER_ERROR) {
logMessage('Stopping execution...');
exit();
}
return false;
}, -1);
// Start ManiaControl
error_log('Loading ManiaControl v' . ManiaControl\ManiaControl::VERSION . '...');
require_once __DIR__ . '/core/ManiaControl.php';
$maniaControl = new ManiaControl\ManiaControl();
$maniaControl->run();

View File

@ -18,6 +18,7 @@ class CallbackManager {
const CB_MC_5_SECOND = 'ManiaControl.5Second';
const CB_MC_1_MINUTE = 'ManiaControl.1Minute';
const CB_MC_ONINIT = 'ManiaControl.OnInit';
const CB_MC_ONSHUTDOWN = 'ManiaControl.OnShutdown';
const CB_MC_CLIENTUPDATED = 'ManiaControl.ClientUpdated';
const CB_MC_BEGINMAP = 'ManiaControl.BeginMap';
const CB_MC_ENDMAP = 'ManiaControl.EndMap';

View File

@ -86,6 +86,8 @@ class ManiaControl implements CommandListener {
* Construct ManiaControl
*/
public function __construct() {
logMessage('Loading ManiaControl v' . self::VERSION . '...');
$this->database = new Database($this);
$this->callbackManager = new CallbackManager($this);
$this->settingManager = new SettingManager($this);
@ -119,8 +121,8 @@ class ManiaControl implements CommandListener {
/**
* Send ManiaControl version
*
* @param array $chat
* @param Player $player
* @param array $chat
* @param Player $player
* @return bool
*/
public function command_Version(array $chat, Player $player) {
@ -134,6 +136,9 @@ class ManiaControl implements CommandListener {
* @param string $message
*/
public function quit($message = '') {
// OnShutdown callback
$this->callbackManager->triggerCallback(CallbackManager::CB_MC_ONSHUTDOWN, array(CallbackManager::CB_MC_ONSHUTDOWN));
if ($this->client) {
// Announce quit
$this->chat->sendInformation('ManiaControl shutting down.');
@ -144,7 +149,7 @@ class ManiaControl implements CommandListener {
// Log quit reason
if ($message) {
error_log($message);
logMessage($message);
}
// Shutdown
@ -152,7 +157,7 @@ class ManiaControl implements CommandListener {
$this->client->Terminate();
}
error_log("Quitting ManiaControl!");
logMessage('Quitting ManiaControl!');
exit();
}
@ -160,7 +165,7 @@ class ManiaControl implements CommandListener {
* Run ManiaControl
*/
public function run() {
error_log('Starting ManiaControl v' . self::VERSION . '!');
logMessage('Starting ManiaControl v' . self::VERSION . '!');
// Load plugins
$this->pluginManager->loadPlugins();
@ -168,13 +173,16 @@ class ManiaControl implements CommandListener {
// Connect to server
$this->connect();
// Register shutdown handler
register_shutdown_function(array($this, 'quit'));
// Loading finished
error_log("Loading completed!");
logMessage('Loading completed!');
// Announce ManiaControl
$this->chat->sendInformation('ManiaControl v' . self::VERSION . ' successfully started!');
// OnInit
// OnInit callback
$this->callbackManager->triggerCallback(CallbackManager::CB_MC_ONINIT, array(CallbackManager::CB_MC_ONINIT));
// Main loop
@ -196,7 +204,7 @@ class ManiaControl implements CommandListener {
}
// Shutdown
$this->client->Terminate();
$this->quit();
}
/**
@ -213,7 +221,7 @@ class ManiaControl implements CommandListener {
if (!$host) trigger_error("Invalid server configuration (port).", E_USER_ERROR);
$port = (string) $port[0];
error_log("Connecting to server at {$host}:{$port}...");
logMessage("Connecting to server at {$host}:{$port}...");
// Connect
if (!$this->client->InitWithIp($host, $port, 20)) {
@ -249,26 +257,22 @@ class ManiaControl implements CommandListener {
}
// Connect finished
error_log("Server connection successfully established!");
logMessage("Server connection successfully established!");
// Enable script callbacks if needed
if ($this->server->getGameMode() === 0) {
if (!$this->client->query('GetModeScriptSettings')) {
trigger_error("Couldn't get mode script settings. " . $this->getClientErrorText());
}
else {
$scriptSettings = $this->client->getResponse();
if (array_key_exists('S_UseScriptCallbacks', $scriptSettings)) {
$scriptSettings['S_UseScriptCallbacks'] = true;
if (!$this->client->query('SetModeScriptSettings', $scriptSettings)) {
trigger_error("Couldn't set mode script settings to enable script callbacks. " . $this->getClientErrorText());
}
else {
error_log("Script callbacks successfully enabled.");
}
}
}
if ($this->server->getGameMode() != 0) return;
if (!$this->client->query('GetModeScriptSettings')) {
trigger_error("Couldn't get mode script settings. " . $this->getClientErrorText());
return;
}
$scriptSettings = $this->client->getResponse();
if (!array_key_exists('S_UseScriptCallbacks', $scriptSettings)) return;
$scriptSettings['S_UseScriptCallbacks'] = true;
if (!$this->client->query('SetModeScriptSettings', $scriptSettings)) {
trigger_error("Couldn't set mode script settings to enable script callbacks. " . $this->getClientErrorText());
return;
}
logMessage('Script callbacks successfully enabled.');
}
}

View File

@ -287,14 +287,14 @@ class Server {
$waitBegin = time();
$maxWaitTime = 20;
$lastStatus = $response['Name'];
error_log("Waiting for server to reach status {$statusCode}...");
error_log("Current Status: {$lastStatus}");
logMessage("Waiting for server to reach status {$statusCode}...");
logMessage("Current Status: {$lastStatus}");
while ($response['Code'] !== 4) {
sleep(1);
$this->maniaControl->client->query('GetStatus');
$response = $this->maniaControl->client->getResponse();
if ($lastStatus !== $response['Name']) {
error_log("New Status: " . $response['Name']);
logMessage("New Status: " . $response['Name']);
$lastStatus = $response['Name'];
}
if (time() - $maxWaitTime > $waitBegin) {