- Improved Logging
- Error handler - Shutdown function - Added OnShutdown callback
This commit is contained in:
parent
c97b4166f2
commit
e9e1fb94d9
@ -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();
|
||||
|
@ -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';
|
||||
|
@ -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);
|
||||
@ -120,7 +122,7 @@ class ManiaControl implements CommandListener {
|
||||
* Send ManiaControl version
|
||||
*
|
||||
* @param array $chat
|
||||
* @param Player $player
|
||||
* @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.');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user