Completed
Push — master ( 5bed8f...b71929 )
by Jacob
04:00
created

bootstrap.php (1 issue)

Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
$startTime = microtime(true);
4
$startMemory = memory_get_usage();
5
ini_set('display_errors', 0);
6
7
8
require_once __DIR__ . '/vendor/autoload.php';
9
10
$container = new Pimple\Container();
11
12
13
// load the config for the application
14
$config_path = __DIR__ . '/config.json';
15
16
$handle = @fopen($config_path, 'r');
17
if ($handle === false) {
18
    throw new RuntimeException("Could not load config");
19
}
20
$config = fread($handle, filesize($config_path));
21
fclose($handle);
22
23
$config = json_decode($config);
24
$last_json_error = json_last_error();
25
if ($last_json_error !== JSON_ERROR_NONE) {
26
    throw new RuntimeException("Could not parse config - JSON error detected");
27
}
28
$container['config'] = $config;
29
30
// timezones are fun
31
date_default_timezone_set('America/Phoenix'); // todo - belongs in configuration
32
$container['default_timezone'] = function ($c) {
0 ignored issues
show
The parameter $c is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
33
    return new DateTimeZone('America/Phoenix');
34
};
35
36
37
// configure the db connections holder
38
$db_connections = new Aura\Sql\ConnectionLocator();
39
$db_connections->setDefault(function () use ($config) {
40
    $connection = $config->database->slave;
41
    return new Aura\Sql\ExtendedPdo(
42
        "mysql:host={$connection->host}",
43
        $connection->user,
44
        $connection->password
45
    );
46
});
47
$db_connections->setWrite('master', function () use ($config) {
48
    $connection = $config->database->master;
49
    return new Aura\Sql\ExtendedPdo(
50
        "mysql:host={$connection->host}",
51
        $connection->user,
52
        $connection->password
53
    );
54
});
55
$db_connections->setRead('slave', function () use ($config) {
56
    $connection = $config->database->slave;
57
    $pdo = new Aura\Sql\ExtendedPdo(
58
        "mysql:host={$connection->host}",
59
        $connection->user,
60
        $connection->password
61
    );
62
63
    $profiler = new Aura\Sql\Profiler();
64
    $profiler->setActive(true);
65
    $pdo->setProfiler($profiler);
66
67
    return $pdo;
68
});
69
$container['db_connection_locator'] = $db_connections;
70
71
72
// setup mail handler
73
$container['mail'] = $container->factory(function ($c) {
74
    return (new Jacobemerick\Archangel\Archangel())->setLogger($c['logger']);
75
});
76
77
78
// setup the logger
79
$container['setup_logger'] = $container->protect(function ($name) use ($container) {
80
    $logger = new Monolog\Logger($name);
81
82
    $logPath = __DIR__ . "/logs/{$name}.log";
83
    $streamHandler = new Monolog\Handler\StreamHandler($logPath, Monolog\Logger::INFO);
84
    $streamHandler->setFormatter(
85
        new Monolog\Formatter\LineFormatter("[%datetime%] %channel%.%level_name%: %message%\n")
86
    );
87
    $logger->pushHandler($streamHandler);
88
89
    Monolog\ErrorHandler::register($logger);
90
    $container['logger'] = $logger;
91
});
92
93
94
// adds profiler
95
$console = new Particletree\Pqp\Console();
96
$profiler = new Particletree\Pqp\PhpQuickProfiler($startTime);
97
$profiler->setConsole($console);
98
$container['console'] = $console;
99
$container['profiler'] = $profiler;
100
$container['console']->logMemory($startMemory, 'PHP - Pre-bootstrap memory', true);
101
102
103
// sets up logger, modifes with profiler handler
104
$pqpHandler = new Jacobemerick\MonologPqp\PqpHandler($container['console']);
105
$container['setup_logger']($namespace);
106
$container['logger']->pushHandler($pqpHandler);
107
108
109
// sets up shutdown function to display profiler
110
register_shutdown_function(function () use ($container) {
111
    if (
112
        !isset($_COOKIE['debugger']) ||
113
        $_COOKIE['debugger'] != 'display'
114
    ) {
115
        return;
116
    }
117
118
    $dbProfiles = $container['db_connection_locator']
119
        ->getRead()
120
        ->getProfiler()
121
        ->getProfiles();
122
    $dbProfiles = array_filter($dbProfiles, function ($profile) {
123
        return $profile['function'] == 'perform';
124
    });
125
    $dbProfiles = array_map(function ($profile) {
126
        return [
127
            'sql' => trim(preg_replace('/\s+/', ' ', $profile['statement'])),
128
            'parameters' => $profile['bind_values'],
129
            'time' => $profile['duration'],
130
        ];
131
    }, $dbProfiles);
132
    $container['profiler']->setProfiledQueries($dbProfiles);
133
    $container['profiler']->setDisplay(new Particletree\Pqp\Display());
134
    $container['profiler']->display($container['db_connection_locator']->getRead());
135
});
136
137
$container['console']->logMemory(null, 'PHP - Post-boostrap memory');
138
$container['console']->logSpeed('Post-bootstrap time');
139