<?php
use Dotenv\Dotenv;
use PHPServer\Env;
use PHPServer\ServerInfo;
use PHPServer\Swoole\Console;
use PHPServer\Swoole\Http\Request;
use PHPServer\Swoole\Http\Response;
use PHPServer\Terminal;
use Swoole\Http\Request as SWRequest;
use Swoole\Http\Response as SWResponse;
use Swoole\Http\Server;
use Swoole\Runtime;
use Swotch\Watcher;
require 'vendor/autoload.php';
$swooleData = Terminal::getArgumentAndDecode('s', 'swoole');
$serverData = Terminal::getArgumentAndDecode('i', 'server-info');
$serverInfo = ServerInfo::create($serverData);
function handleException(Throwable $exception, ?Request $request = null): void
{
try {
$request?->response()->html($exception);
} catch (Throwable $exception) {
if (!Env::isInProduction()) {
$request->response()->html($exception);
return;
}
$request->response()->html('Internal Server Error');
} finally {
Console::error($exception);
}
}
set_exception_handler('handleException');
try {
if (null !== $serverInfo->getEnvDirectory()) {
$dotEnv = Dotenv::createImmutable(__DIR__)->load();
}
//Runtime configuration
Runtime::enableCoroutine(true, SWOOLE_HOOK_ALL);
$server = new Server($serverInfo->getHost(), $serverInfo->getPort());
$server->on(
'request',
function (SWRequest $swRequest, SWResponse $swResponse) use ($serverInfo): void {
$response = new Response($swResponse);
$request = new Request($swRequest, $response);
$response->setRequest($request);
$serverInfo->getRequestCallback()($request);
}
);
$server->on('start', function (Server $server) use ($serverInfo, $swooleData) {
Console::info("Swoole server started at http://{$serverInfo->getHost()}:{$serverInfo->getPort()}");
file_put_contents(__DIR__ . '/.pid', $server->getMasterPid());
//Run file watcher
if (!empty($swooleData['watch_filesystem_changes'])) {
go(function () use ($server, $swooleData) {
Watcher::watch($swooleData['watch_filesystem_changes'])
->onAny(fn($e) => $server->reload());
});
}
});
$server->set(\PHPServer\Swoole\Server::cleanSwooleServerConfig($swooleData));
$server->start();
} catch (Error $error) {
dump($error);
}
|