1
0
Fork 0
mirror of synced 2024-05-19 20:22:33 +12:00
appwrite/app/http.php

220 lines
6.9 KiB
PHP
Raw Normal View History

2020-06-26 21:54:37 +12:00
<?php
require_once __DIR__.'/../vendor/autoload.php';
use Appwrite\Utopia\Response;
2020-06-27 00:27:58 +12:00
use Swoole\Process;
use Swoole\Http\Server;
2020-06-26 21:54:37 +12:00
use Swoole\Http\Request as SwooleRequest;
use Swoole\Http\Response as SwooleResponse;
2020-06-27 00:27:58 +12:00
use Utopia\App;
use Utopia\CLI\Console;
2021-05-04 22:24:08 +12:00
use Utopia\Config\Config;
2021-07-26 02:51:04 +12:00
use Utopia\Database\Validator\Authorization;
2021-06-09 21:28:12 +12:00
use Utopia\Audit\Audit;
use Utopia\Abuse\Adapters\TimeLimit;
2021-07-05 00:05:46 +12:00
use Utopia\Database\Document;
2021-06-13 06:39:59 +12:00
use Utopia\Swoole\Files;
use Utopia\Swoole\Request;
2020-06-27 00:27:58 +12:00
2021-01-21 00:49:36 +13:00
$http = new Server("0.0.0.0", App::getEnv('PORT', 80));
2020-07-01 20:55:14 +12:00
2020-10-28 08:56:37 +13:00
$payloadSize = max(4000000 /* 4mb */, App::getEnv('_APP_STORAGE_LIMIT', 10000000 /* 10mb */));
2020-07-20 03:17:57 +12:00
2020-06-27 00:27:58 +12:00
$http
2020-06-26 21:54:37 +12:00
->set([
'open_http2_protocol' => true,
2020-07-07 07:29:13 +12:00
// 'document_root' => __DIR__.'/../public',
// 'enable_static_handler' => true,
2020-07-02 18:44:16 +12:00
'http_compression' => true,
'http_compression_level' => 6,
2020-07-20 03:17:57 +12:00
'package_max_length' => $payloadSize,
2021-05-25 22:19:49 +12:00
'buffer_output_size' => $payloadSize,
2020-06-26 21:54:37 +12:00
])
;
2021-08-09 03:56:07 +12:00
$http->on('WorkerStart', function($server, $workerId) {
Console::success('Worker '.++$workerId.' started successfully');
2020-06-26 21:54:37 +12:00
});
2021-08-09 03:56:07 +12:00
$http->on('BeforeReload', function($server, $workerId) {
2020-06-26 21:54:37 +12:00
Console::success('Starting reload...');
});
2021-08-09 03:56:07 +12:00
$http->on('AfterReload', function($server, $workerId) {
2020-06-26 21:54:37 +12:00
Console::success('Reload completed...');
});
2021-05-07 09:35:05 +12:00
Files::load(__DIR__ . '/../public');
include __DIR__ . '/controllers/general.php';
2021-05-07 09:35:05 +12:00
$http->on('start', function (Server $http) use ($payloadSize, $register) {
2021-05-04 22:24:08 +12:00
$app = new App('UTC');
go(function() use ($register, $app) {
// wait for database to be ready
$attempts = 0;
2021-07-21 07:11:54 +12:00
$max = 10;
$sleep = 1;
do {
try {
$attempts++;
$db = $register->get('dbPool')->get();
$redis = $register->get('redisPool')->get();
break; // leave the do-while if successful
} catch(\Exception $e) {
Console::warning("Database not ready. Retrying connection ({$attempts})...");
2021-07-21 07:11:54 +12:00
if ($attempts >= $max) {
throw new \Exception('Failed to connect to database: '. $e->getMessage());
}
2021-07-21 07:11:54 +12:00
sleep($sleep);
}
2021-07-21 07:11:54 +12:00
} while ($attempts < $max);
2021-12-17 23:41:26 +13:00
App::setResource('db', fn() => $db);
App::setResource('cache', fn() => $redis);
$dbForConsole = $app->getResource('dbForConsole'); /** @var Utopia\Database\Database $dbForConsole */
2021-05-04 22:24:08 +12:00
Console::success('[Setup] - Server database init started...');
$collections = Config::getParam('collections', []); /** @var array $collections */
if(!$dbForConsole->exists('appwrite')) {
$redis->flushAll();
Console::success('[Setup] - Creating database: appwrite...');
2021-12-23 14:51:49 +13:00
$dbForConsole->create('appwrite');
}
2021-07-05 03:14:39 +12:00
try {
Console::success('[Setup] - Creating metadata table: appwrite...');
$dbForConsole->createMetadata();
} catch (\Throwable $th) {
Console::success('[Setup] - Skip: metadata table already exists');
}
if($dbForConsole->getCollection(Audit::COLLECTION)->isEmpty()) {
2021-07-05 03:14:39 +12:00
$audit = new Audit($dbForConsole);
$audit->setup();
}
if ($dbForConsole->getCollection(TimeLimit::COLLECTION)->isEmpty()) {
$adapter = new TimeLimit("", 0, 1, $dbForConsole);
$adapter->setup();
}
foreach ($collections as $key => $collection) {
if(!$dbForConsole->getCollection($key)->isEmpty()) {
continue;
}
Console::success('[Setup] - Creating collection: ' . $collection['$id'] . '...');
$attributes = [];
$indexes = [];
foreach ($collection['attributes'] as $attribute) {
$attributes[] = new Document([
'$id' => $attribute['$id'],
'type' => $attribute['type'],
'size' => $attribute['size'],
'required' => $attribute['required'],
'signed' => $attribute['signed'],
'array' => $attribute['array'],
'filters' => $attribute['filters'],
]);
}
2021-07-05 03:14:39 +12:00
foreach ($collection['indexes'] as $index) {
$indexes[] = new Document([
'$id' => $index['$id'],
'type' => $index['type'],
'attributes' => $index['attributes'],
'lengths' => $index['lengths'],
'orders' => $index['orders'],
]);
2021-05-04 22:24:08 +12:00
}
$dbForConsole->createCollection($key, $attributes, $indexes);
}
Console::success('[Setup] - Server database init completed...');
});
2021-05-04 22:24:08 +12:00
2021-08-09 03:56:07 +12:00
Console::success('Server started successfully (max payload is '.number_format($payloadSize).' bytes)');
2020-07-09 03:08:14 +12:00
Console::info("Master pid {$http->master_pid}, manager pid {$http->manager_pid}");
2020-06-27 00:27:58 +12:00
// listen ctrl + c
Process::signal(2, function () use ($http) {
2020-07-09 03:08:14 +12:00
Console::log('Stop by Ctrl+C');
2020-06-27 00:27:58 +12:00
$http->shutdown();
});
2020-06-26 21:54:37 +12:00
});
$http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swooleResponse) use ($register) {
2020-07-01 20:55:14 +12:00
$request = new Request($swooleRequest);
$response = new Response($swooleResponse);
2020-07-07 07:29:13 +12:00
if(Files::isFileLoaded($request->getURI())) {
2020-07-11 16:16:24 +12:00
$time = (60 * 60 * 24 * 365 * 2); // 45 days cache
2020-07-07 07:29:13 +12:00
$response
->setContentType(Files::getFileMimeType($request->getURI()))
->addHeader('Cache-Control', 'public, max-age='.$time)
->addHeader('Expires', \date('D, d M Y H:i:s', \time() + $time).' GMT') // 45 days cache
->send(Files::getFileContents($request->getURI()))
;
return;
}
2021-06-28 19:19:33 +12:00
$app = new App('UTC');
$db = $register->get('dbPool')->get();
$redis = $register->get('redisPool')->get();
2021-12-17 23:41:26 +13:00
App::setResource('db', fn() => $db);
App::setResource('cache', fn() => $redis);
2020-06-27 00:27:58 +12:00
try {
2020-11-19 19:56:14 +13:00
Authorization::cleanRoles();
2021-06-12 06:23:16 +12:00
Authorization::setRole('role:all');
2020-11-19 19:56:14 +13:00
2020-07-01 20:55:14 +12:00
$app->run($request, $response);
2020-06-27 00:27:58 +12:00
} catch (\Throwable $th) {
2020-10-26 02:48:04 +13:00
Console::error('[Error] Type: '.get_class($th));
Console::error('[Error] Message: '.$th->getMessage());
Console::error('[Error] File: '.$th->getFile());
Console::error('[Error] Line: '.$th->getLine());
/**
* Reset Database connection if PDOException was thrown.
*/
2021-07-13 04:15:21 +12:00
if ($th instanceof PDOException) {
$db = null;
}
2021-12-21 23:12:33 +13:00
$swooleResponse->setStatusCode(500);
2020-07-02 10:34:05 +12:00
if(App::isDevelopment()) {
$swooleResponse->end('error: '.$th->getMessage());
}
2020-12-23 08:53:49 +13:00
else {
$swooleResponse->end('500: Server Error');
}
} finally {
/** @var PDOPool $dbPool */
$dbPool = $register->get('dbPool');
$dbPool->put($db);
/** @var RedisPool $redisPool */
$redisPool = $register->get('redisPool');
$redisPool->put($redis);
2020-06-27 00:27:58 +12:00
}
2020-06-26 21:54:37 +12:00
});
2020-10-20 05:54:21 +13:00
$http->start();