<?php
declare(strict_types=1);
use Airship\Alerts\Router\ControllerComplete;
use Airship\Engine\{
AutoPilot,
Database,
Gears,
Hail,
View,
State
};
use Airship\Engine\Networking\HTTP\{
ServerRequest
};
use Psr\Log\LogLevel;
/**
* @global array $active
* @global Database[] $dbPool
* @global State $state
* @global View $lens
* @global AutoPilot $autopilot
*/
// Are we still installing?
/** @noinspection PhpUsageOfSilenceOperatorInspection */
if (
@\is_readable(dirname(__DIR__) . '/tmp/installing.json')
||
!\file_exists(dirname(__DIR__) . '/config/databases.json')
) {
include dirname(__DIR__) . '/Installer/launch.php';
exit;
}
/**
* Load the bare minimum:
*/
require_once \dirname(__DIR__) . '/preload.php';
$start = \microtime(true);
require_once ROOT . '/static-cache.php';
// Load all of the prerequisites:
require_once ROOT . '/bootstrap.php';
/**
* Initialize the automatic updater service
*
* Normally you would just want a cron job to run continuum.php every hour or so,
* but this forces it to be run.
*
* @global Hail $hail
*/
$autoUpdater = Gears::get('AutoUpdater', $hail);
if ($autoUpdater->needsUpdate()) {
$script = ROOT . '/CommandLine/continuum.php';
/**
* @security Make sure this is never compromised:
*/
\shell_exec(
'php -dphar.readonly=0 ' .
\escapeshellarg($script) .
' >/dev/null 2>&1 &'
);
\file_put_contents(
ROOT . '/tmp/last_update_check.txt',
time()
);
}
require_once ROOT . '/boot_final.php';
/**
* Final step: Let's turn on the autopilot
*/
if (!empty($state->universal['debug'])) {
try {
\error_reporting(E_ALL);
\ini_set('display_errors', 'On');
$autoPilot->serveResponse(
$autoPilot->route(ServerRequest::fromGlobals())
);
} catch (ControllerComplete $ex) {
$autoPilot->serveResponse();
} catch (\Throwable $e) {
if (!\headers_sent()) {
\Airship\sendHeadersArray(
\Airship\get_standard_headers('text/plain;charset=UTF-8')
);
}
try {
$state->logger->log(
LogLevel::ERROR,
$e->getMessage(),
\Airship\throwableToArray($e)
);
} catch (\Throwable $f) {
echo "FAILED TO LOG ERROR MESSAGE: ", \get_class($f), "\n\n",
$f->getMessage(), "\n\n",
$f->getCode(), "\n\n",
$f->getTraceAsString();
}
echo "DEBUG ERROR: ", \get_class($e), "\n\n",
$e->getMessage(), "\n\n",
$e->getCode(), "\n\n",
$e->getTraceAsString();
// Show previous throwables as well:
$n = 1;
// The methods below exist in both \Exception and \Error.
while ($e = $e->getPrevious()) {
if ($e instanceof \Exception) {
echo "\n", \str_repeat('#', 80), "\n";
echo "PREVIOUS EXCEPTION (", $n, "): ", \get_class($e), "\n\n",
$e->getMessage(), "\n\n",
'File: ', $e->getFile(), "\n",
'Line: ', $e->getLine(), "\n",
'Code: ', $e->getCode(), "\n\n",
$e->getTraceAsString();
++$n;
if (!$e) {
exit(255);
}
} elseif ($e instanceof \Error) {
echo "\n", \str_repeat('#', 80), "\n";
echo "PREVIOUS ERROR (", $n, "): ", \get_class($e), "\n\n",
$e->getMessage(), "\n\n",
'File: ', $e->getFile(), "\n",
'Line: ', $e->getLine(), "\n",
'Code: ', $e->getCode(), "\n\n",
$e->getTraceAsString();
++$n;
if (!$e) {
exit(255);
}
} else {
break;
}
}
exit(255);
}
// This is just for benchmarking purposes:
echo '<!-- Load time: ' . \round(\microtime(true) - $start, 5) . ' s -->';
} else {
try {
$autoPilot->serveResponse(
$autoPilot->route(ServerRequest::fromGlobals())
);
} catch (ControllerComplete $ex) {
$autoPilot->serveResponse();
} catch (\Throwable $e) {
$state->logger->log(
LogLevel::ERROR,
$e->getMessage(),
\Airship\throwableToArray($e)
);
\http_response_code(500);
echo \file_get_contents(
ROOT . '/error_pages/uncaught-exception.html'
);
exit(1);
}
}
|