Centralize startup steps in Friendica\App

- Add loadDatabase startup step
- Add loadConfigFiles startup step
- Remove startup() in boot.php
- Replace App::checkMaintenanceMode() with App::determineMode()
This commit is contained in:
Hypolite Petovan 2018-06-25 20:38:41 -04:00
parent 2503660f97
commit 5fdff3d813
2 changed files with 184 additions and 63 deletions

View file

@ -76,8 +76,6 @@ if (!$a->mode == App::MODE_INSTALL) {
Session::init();
Addon::loadHooks();
Addon::callHooks('init_1');
$a->checkMaintenanceMode();
}
$lang = L10n::getBrowserLanguage();

View file

@ -4,7 +4,6 @@
*/
namespace Friendica;
use Friendica\Core\Cache;
use Friendica\Core\Config;
use Friendica\Core\L10n;
use Friendica\Core\PConfig;
@ -17,6 +16,7 @@ use Detection\MobileDetect;
use Exception;
require_once 'boot.php';
require_once 'include/dba.php';
require_once 'include/text.php';
/**
@ -40,9 +40,10 @@ class App
public $module_loaded = false;
public $module_class = null;
public $query_string;
public $config;
public $page;
public $query_string = '';
public $config = [];
public $page = [];
public $pager = [];
public $page_offset;
public $profile;
public $profile_uid;
@ -54,16 +55,15 @@ class App
public $content;
public $data = [];
public $error = false;
public $cmd;
public $cmd = '';
public $argv;
public $argc;
public $module;
public $mode = App::MODE_NORMAL;
public $pager;
public $strings;
public $basepath;
public $path;
public $hooks;
public $urlpath;
public $hooks = [];
public $timezone;
public $interactive = true;
public $addons;
@ -127,7 +127,6 @@ class App
private $curl_code;
private $curl_content_type;
private $curl_headers;
private static $a;
/**
* @brief App constructor.
@ -136,21 +135,21 @@ class App
*/
public function __construct($basepath)
{
global $default_timezone;
if (!static::directory_usable($basepath, false)) {
throw new Exception('Basepath ' . $basepath . ' isn\'t usable.');
}
$this->basepath = rtrim($basepath, DIRECTORY_SEPARATOR);
if (file_exists($this->basepath . DIRECTORY_SEPARATOR . '.htpreconfig.php')) {
include $this->basepath . DIRECTORY_SEPARATOR . '.htpreconfig.php';
}
$this->determineUrlPath();
$this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC');
$this->loadConfigFiles();
date_default_timezone_set($this->timezone);
$this->loadDatabase();
$this->determineMode();
$this->loadDefaultTimezone();
$this->performance['start'] = microtime(true);
$this->performance['database'] = 0;
@ -173,8 +172,6 @@ class App
$this->callstack['rendering'] = [];
$this->callstack['parser'] = [];
$this->config = [];
$this->page = [
'aside' => '',
'bottom' => '',
@ -189,10 +186,6 @@ class App
'title' => ''
];
$this->pager = [];
$this->query_string = '';
$this->process_id = System::processID('log');
set_time_limit(0);
@ -218,16 +211,6 @@ class App
if (x($_SERVER, 'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) {
$this->hostname .= ':' . $_SERVER['SERVER_PORT'];
}
/*
* Figure out if we are running at the top of a domain
* or in a sub-directory and adjust accordingly
*/
/// @TODO This kind of escaping breaks syntax-highlightning on CoolEdit (Midnight Commander)
$path = trim(dirname($_SERVER['SCRIPT_NAME']), '/\\');
if (isset($path) && strlen($path) && ($path != $this->path)) {
$this->path = $path;
}
}
set_include_path(
@ -238,19 +221,16 @@ class App
if ((x($_SERVER, 'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'], 0, 9) === 'pagename=') {
$this->query_string = substr($_SERVER['QUERY_STRING'], 9);
// removing trailing / - maybe a nginx problem
$this->query_string = ltrim($this->query_string, '/');
} elseif ((x($_SERVER, 'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'], 0, 2) === 'q=') {
$this->query_string = substr($_SERVER['QUERY_STRING'], 2);
}
// removing trailing / - maybe a nginx problem
$this->query_string = ltrim($this->query_string, '/');
}
if (x($_GET, 'pagename')) {
if (!empty($_GET['pagename'])) {
$this->cmd = trim($_GET['pagename'], '/\\');
} elseif (x($_GET, 'q')) {
} elseif (!empty($_GET['q'])) {
$this->cmd = trim($_GET['q'], '/\\');
}
@ -311,16 +291,174 @@ class App
// Register template engines
$this->register_template_engine('Friendica\Render\FriendicaSmartyEngine');
}
private function loadConfigFiles()
{
$this->loadConfigFile($this->basepath . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'defaults.ini.php');
// Legacy .htconfig.php support
if (file_exists($this->basepath . DIRECTORY_SEPARATOR . '.htpreconfig.php')) {
$a = $this;
include $this->basepath . DIRECTORY_SEPARATOR . '.htpreconfig.php';
}
// Legacy .htconfig.php support
if (file_exists($this->basepath . DIRECTORY_SEPARATOR . '.htconfig.php')) {
$a = $this;
include $this->basepath . DIRECTORY_SEPARATOR . '.htconfig.php';
unset($db_host, $db_user, $db_pass, $db_data);
if (isset($default_timezone)) {
$this->setConfigValue('system', 'default_timezone', $default_timezone);
unset($default_timezone);
}
if (isset($pidfile)) {
$this->setConfigValue('system', 'pidfile', $pidfile);
unset($pidfile);
}
}
if (file_exists($this->basepath . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.ini.php')) {
$this->loadConfigFile($this->basepath . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.ini.php');
}
}
public function loadConfigFile($filepath)
{
if (!file_exists($filepath)) {
throw new Exception('Error parsing non-existent config file ' . $filepath);
}
$contents = include($filepath);
$config = parse_ini_string($contents, true, INI_SCANNER_TYPED);
if ($config === false) {
throw new Exception('Error parsing config file ' . $filepath);
}
foreach($config as $category => $values) {
foreach($values as $key => $value) {
$this->setConfigValue($category, $key, $value);
}
}
}
private function loadAddonConfig()
{
// Loads addons default config
Core\Addon::callHooks('load_config');
// Load the local config file again in case there are overwritten addon config
if (file_exists($this->basepath . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.ini.php')) {
$this->loadConfigFile($this->basepath . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.ini.php');
}
}
private function loadDefaultTimezone()
{
if ($this->getConfigValue('system', 'default_timezone')) {
$this->timezone = $this->getConfigValue('system', 'default_timezone');
} else {
global $default_timezone;
$this->timezone = !empty($default_timezone) ? $default_timezone : 'UTC';
}
if ($this->timezone) {
date_default_timezone_set($this->timezone);
}
}
/**
* Load the configuration file which contains our DB credentials.
* Ignore errors. If the file doesn't exist or is empty, we are running in
* installation mode. *
* Figure out if we are running at the top of a domain
* or in a sub-directory and adjust accordingly
*/
$this->mode = ((file_exists('.htconfig.php') && filesize('.htconfig.php')) ? App::MODE_NORMAL : App::MODE_INSTALL);
private function determineUrlPath()
{
$this->urlpath = $this->getConfigValue('system', 'urlpath');
/* SCRIPT_URL gives /path/to/friendica/module/parameter
* QUERY_STRING gives pagename=module/parameter
*
* To get /path/to/friendica we perform dirname() for as many levels as there are slashes in the QUERY_STRING
*/
if (!empty($_SERVER['SCRIPT_URL']) && !empty($_SERVER['QUERY_STRING'])) {
$path = trim(dirname($_SERVER['SCRIPT_URL'], substr_count(trim($_SERVER['QUERY_STRING'], '/'), '/') + 1), '/');
self::$a = $this;
if ($path && $path != $this->urlpath) {
$this->urlpath = $path;
}
}
}
private function determineMode()
{
$this->mode = App::MODE_INSTALL;
// Missing DB connection
if (!\dba::connected()) {
return;
}
// Working DB connection, missing tables
if (\dba::fetch_first("SHOW TABLES LIKE 'config'") === false) {
return;
}
// Maintenance mode check
if (Config::get('system', 'maintenance')) {
$this->mode = App::MODE_MAINTENANCE;
} else {
$this->mode = App::MODE_NORMAL;
}
}
public function loadDatabase()
{
if (\dba::connected()) {
return;
}
$db_host = $this->getConfigValue('database', 'hostname');
$db_user = $this->getConfigValue('database', 'username');
$db_pass = $this->getConfigValue('database', 'password');
$db_data = $this->getConfigValue('database', 'database');
$charset = $this->getConfigValue('database', 'charset');
// Use environment variables for mysql if they are set beforehand
if (!empty(getenv('MYSQL_HOST'))
&& !empty(getenv('MYSQL_PORT'))
&& (!empty(getenv('MYSQL_USERNAME')) || !empty(getenv('MYSQL_USER')))
&& !empty(getenv('MYSQL_PASSWORD'))
&& !empty(getenv('MYSQL_DATABASE')))
{
$db_host = getenv('MYSQL_HOST') . ':' . getenv('MYSQL_PORT');
if (!empty(getenv('MYSQL_USERNAME'))) {
$db_user = getenv('MYSQL_USERNAME');
} elseif (!empty(getenv('MYSQL_USER'))) {
$db_user = getenv('MYSQL_USER');
}
$db_pass = getenv('MYSQL_PASSWORD');
$db_data = getenv('MYSQL_DATABASE');
}elseif (file_exists($this->basepath . DIRECTORY_SEPARATOR . '.htconfig.php')) {
$a = new \stdClass();
include $this->basepath . DIRECTORY_SEPARATOR . '.htconfig.php';
$charset = isset($a->config["system"]["db_charset"]) ? $a->config["system"]["db_charset"] : $charset;
unset($a);
}
$stamp1 = microtime(true);
\dba::connect($db_host, $db_user, $db_pass, $db_data, $charset);
unset($db_host, $db_user, $db_pass, $db_data, $charset);
$this->save_timestamp($stamp1, "network");
}
/**
@ -1107,21 +1245,6 @@ class App
return $sender_email;
}
/**
* @note Checks, if the App is in the Maintenance-Mode
*
* @return boolean
*/
public function checkMaintenanceMode()
{
if (Config::get('system', 'maintenance')) {
$this->mode = App::MODE_MAINTENANCE;
return true;
}
return false;
}
/**
* Returns the current theme name.
*