|
| 1 | +#!/usr/bin/env php |
1 | 2 | <?php |
2 | 3 |
|
3 | 4 | declare(strict_types=1); |
4 | 5 |
|
5 | | -// Delegate static file requests back to the PHP built-in webserver |
6 | 6 | use Antidot\Application\Http\Application; |
| 7 | +use Antidot\React\PromiseResponse; |
| 8 | +use Laminas\Diactoros\Response\HtmlResponse; |
| 9 | +use Psr\Http\Message\ServerRequestInterface; |
| 10 | +use Ramsey\Uuid\Uuid; |
| 11 | +use React\EventLoop\Factory; |
| 12 | +use React\Http\Middleware\LimitConcurrentRequestsMiddleware; |
| 13 | +use React\Http\Middleware\RequestBodyBufferMiddleware; |
| 14 | +use React\Http\Middleware\RequestBodyParserMiddleware; |
| 15 | +use React\Http\Middleware\StreamingRequestMiddleware; |
| 16 | +use React\Http\Server; |
| 17 | +use React\Socket\Server as Socket; |
| 18 | +use function React\Promise\resolve; |
7 | 19 |
|
8 | | -if (PHP_SAPI === 'cli-server' && $_SERVER['SCRIPT_FILENAME'] !== __FILE__) { |
9 | | - return false; |
10 | | -} |
11 | | -\chdir(\dirname(__DIR__)); |
12 | 20 | require 'vendor/autoload.php'; |
13 | | -/** |
14 | | - * Self-called anonymous function that creates its own scope and keep the global namespace clean. |
15 | | - */ |
16 | | -\call_user_func(static function (): void { |
17 | | - error_reporting(E_ALL & ~E_USER_DEPRECATED & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE); |
18 | 21 |
|
19 | | - /** @var \Psr\Container\ContainerInterface $container */ |
| 22 | +call_user_func(static function () { |
| 23 | + $loop = Factory::create(); |
20 | 24 | $container = require 'config/container.php'; |
21 | | - /** @var Application $app */ |
22 | | - $app = $container->get(Application::class); |
23 | | - // Execute programmatic/declarative middleware pipeline and routing |
24 | | - // configuration statements |
25 | | - (require 'router/middleware.php')($app, $container); |
26 | | - (require 'router/routes.php')($app, $container); |
27 | | - $app->run(); |
| 25 | + $application = $container->get(Application::class); |
| 26 | + (require 'router/middleware.php')($application, $container); |
| 27 | + (require 'router/routes.php')($application, $container); |
| 28 | + |
| 29 | + $server = new Server( |
| 30 | + $loop, |
| 31 | + new StreamingRequestMiddleware(), |
| 32 | + new LimitConcurrentRequestsMiddleware(100), // 100 concurrent buffering handlers |
| 33 | + new RequestBodyBufferMiddleware(4 * 1024 * 1024), // 4 MiB |
| 34 | + new RequestBodyParserMiddleware(), |
| 35 | + static function (ServerRequestInterface $request) use ($application) { |
| 36 | + try { |
| 37 | + $response = new PromiseResponse( |
| 38 | + resolve($request) |
| 39 | + ->then(static fn ($request) => $request->withAttribute('request_id', Uuid::uuid4()->toString())) |
| 40 | + ->then(static fn ($request) => $application->handle($request)) |
| 41 | + ); |
| 42 | + } catch (Throwable $exception) { |
| 43 | + if (!empty($e = $exception->getPrevious())) { |
| 44 | + $exception = $e; |
| 45 | + } |
| 46 | + |
| 47 | + $response = new HtmlResponse( |
| 48 | + sprintf( |
| 49 | + '%s in file %s in line %s.', |
| 50 | + $exception->getMessage(), |
| 51 | + $exception->getFile(), |
| 52 | + $exception->getLine() |
| 53 | + ) |
| 54 | + ); |
| 55 | + } |
| 56 | + |
| 57 | + return resolve($response); |
| 58 | + } |
| 59 | + ); |
| 60 | + |
| 61 | + $server->on('error', function ($err) { |
| 62 | + dump($err); |
| 63 | + }); |
| 64 | + |
| 65 | + $socket = new Socket('0.0.0.0:8080', $loop); |
| 66 | + $server->listen($socket); |
| 67 | + |
| 68 | + $loop->run(); |
28 | 69 | }); |
0 commit comments