From 070e612d942756ccd7185520e14217b499209298 Mon Sep 17 00:00:00 2001 From: chengyao Date: Fri, 9 Sep 2022 09:43:00 +0800 Subject: [PATCH 1/4] =?UTF-8?q?Pref=EF=BC=9A=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Middleware/ExceptionHandleMiddleware.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/Http/Middleware/ExceptionHandleMiddleware.php b/app/Http/Middleware/ExceptionHandleMiddleware.php index 144b726..3a7d1b6 100644 --- a/app/Http/Middleware/ExceptionHandleMiddleware.php +++ b/app/Http/Middleware/ExceptionHandleMiddleware.php @@ -12,7 +12,6 @@ namespace App\Http\Middleware; use App\Http\Response; -use ErrorException; use Max\Exception\Handler\WhoopsExceptionHandler; use Max\Http\Message\Exception\HttpException; use Max\Http\Server\Middleware\ExceptionHandleMiddleware as Middleware; @@ -34,10 +33,10 @@ public function __construct( protected function render(Throwable $throwable, ServerRequestInterface $request): ResponseInterface { - $code = $this->getStatusCode($throwable); if ($throwable instanceof Abort) { return Response::HTML($this->convertToHtml($throwable)); } + $code = $this->getStatusCode($throwable); if (env('APP_DEBUG')) { $response = (new WhoopsExceptionHandler())->handle($throwable, $request); if ($throwable instanceof HttpException) { From b21c4a835d782281fa029517c2e45fd67822b534 Mon Sep 17 00:00:00 2001 From: chengyao Date: Fri, 9 Sep 2022 15:42:25 +0800 Subject: [PATCH 2/4] =?UTF-8?q?Style:=20=E4=BC=98=E5=8C=96=E9=A3=8E?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Kernel.php | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 0298155..abd3ce0 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -29,7 +29,7 @@ class Kernel extends HttpKernel * Web middlewares. */ protected array $webMiddlewares = [ - \Max\Http\Server\Middleware\SessionMiddleware::class, + // \Max\Http\Server\Middleware\SessionMiddleware::class, \App\Http\Middleware\VerifyCSRFToken::class, ]; @@ -37,8 +37,8 @@ class Kernel extends HttpKernel * Api middlewares. */ protected array $apiMiddlewares = [ - \App\Http\Middleware\AllowCrossDomain::class, - \App\Http\Middleware\ParseBodyMiddleware::class, + // \App\Http\Middleware\AllowCrossDomain::class, + // \App\Http\Middleware\ParseBodyMiddleware::class, ]; /** @@ -47,20 +47,20 @@ class Kernel extends HttpKernel protected function map(Router $router): void { $router->middleware(...$this->webMiddlewares) - ->group(function (Router $router) { - $router->request('/', [\App\Http\Controller\IndexController::class, 'index']); - }); + ->group(function(Router $router) { + $router->request('/', [\App\Http\Controller\IndexController::class, 'index']); + }); $router->middleware(...$this->apiMiddlewares) - ->prefix('api') - ->group(function (Router $router) { - $router->get('/', function (ServerRequestInterface $request) { - return Response::JSON([ - 'statue' => true, - 'code' => 0, - 'message' => sprintf('Hello, %s.', $request->query('name', 'world')), - 'data' => [], - ]); - }); - }); + ->prefix('api') + ->group(function(Router $router) { + $router->get('/', function(ServerRequestInterface $request) { + return Response::JSON([ + 'statue' => true, + 'code' => 0, + 'message' => sprintf('Hello, %s.', $request->query('name', 'world')), + 'data' => [], + ]); + }); + }); } } From 3df441bb861976bc4e34fb72b4db27740633c1e6 Mon Sep 17 00:00:00 2001 From: chengyao Date: Fri, 9 Sep 2022 19:01:12 +0800 Subject: [PATCH 3/4] =?UTF-8?q?Pref:=20=E7=A7=BB=E9=99=A4StringStream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Middleware/DownloadCacheMiddleware.php | 3 +-- app/Http/Response.php | 17 +++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/Http/Middleware/DownloadCacheMiddleware.php b/app/Http/Middleware/DownloadCacheMiddleware.php index b647f6f..4b46d99 100644 --- a/app/Http/Middleware/DownloadCacheMiddleware.php +++ b/app/Http/Middleware/DownloadCacheMiddleware.php @@ -28,8 +28,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface if ($modifiedSince = $request->getHeaderLine('if-modified-since')) { $body = $response->getBody(); if ($body instanceof FileStream) { - $path = $body->getMetadata('uri'); - $lastModified = date('D, d M Y H:i:s', filemtime($path)) . ' ' . date_default_timezone_get(); + $lastModified = date('D, d M Y H:i:s', filemtime($body->getFilename())) . ' ' . date_default_timezone_get(); if ($lastModified === $modifiedSince) { return new Response(304); } diff --git a/app/Http/Response.php b/app/Http/Response.php index b987e68..28d71c1 100644 --- a/app/Http/Response.php +++ b/app/Http/Response.php @@ -12,12 +12,11 @@ namespace App\Http; use Max\Http\Message\Contract\HeaderInterface; -use Max\Http\Message\Stream\StandardStream; +use Max\Http\Message\Stream\FileStream; use Max\Http\Server\Response as PsrResponse; use Max\View\ViewFactory; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Message\StreamInterface; class Response extends PsrResponse { @@ -44,16 +43,18 @@ public static function view(string $view, array $arguments = [], ?ServerRequestI /** * Create a file download response. * - * @param string|StreamInterface|resource $file - * @param string $name 文件名(留空则自动生成文件名) - * @param array $headers + * @param string $file + * @param string $name 文件名(留空则自动生成文件名) + * @param int $offset 偏移量 + * @param int $length 长度 * * @return ResponseInterface */ - public static function download($file, string $name, array $headers = []): ResponseInterface + public static function download(string $file, string $name = '', int $offset = 0, int $length = 0): ResponseInterface { + $name = $name ?: pathinfo($file, PATHINFO_BASENAME); + $headers = static::DEFAULT_DOWNLOAD_HEADERS; $headers[HeaderInterface::HEADER_CONTENT_DISPOSITION] = sprintf('attachment;filename="%s"', htmlspecialchars($name, ENT_COMPAT)); - $headers = array_merge(static::DEFAULT_DOWNLOAD_HEADERS, $headers); - return new static(200, $headers, StandardStream::create($file)); + return new static(200, $headers, new FileStream($file, $offset, $length)); } } From dc92cbbdaa77e2339ab09a7c8ca691b842abb0cc Mon Sep 17 00:00:00 2001 From: chengyao Date: Sat, 10 Sep 2022 09:18:07 +0800 Subject: [PATCH 4/4] =?UTF-8?q?Pref:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 31 +++++++++++++++++++++++++++ deploy.test.yml | 30 ++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 .gitlab-ci.yml create mode 100644 Dockerfile create mode 100644 deploy.test.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..0891707 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,57 @@ +# usermod -aG docker gitlab-runner + +stages: + - build + - deploy + +variables: + PROJECT_NAME: maxphp + REGISTRY_URL: registry-docker.org + +build_test_docker: + stage: build + before_script: +# - git submodule sync --recursive +# - git submodule update --init --recursive + script: + - docker build . -t $PROJECT_NAME + - docker tag $PROJECT_NAME $REGISTRY_URL/$PROJECT_NAME:test + - docker push $REGISTRY_URL/$PROJECT_NAME:test + only: + - test + tags: + - builder + +deploy_test_docker: + stage: deploy + script: + - docker stack deploy -c deploy.test.yml --with-registry-auth $PROJECT_NAME + only: + - test + tags: + - test + +build_docker: + stage: build + before_script: +# - git submodule sync --recursive +# - git submodule update --init --recursive + script: + - docker build . -t $PROJECT_NAME + - docker tag $PROJECT_NAME $REGISTRY_URL/$PROJECT_NAME:$CI_COMMIT_REF_NAME + - docker tag $PROJECT_NAME $REGISTRY_URL/$PROJECT_NAME:latest + - docker push $REGISTRY_URL/$PROJECT_NAME:$CI_COMMIT_REF_NAME + - docker push $REGISTRY_URL/$PROJECT_NAME:latest + only: + - tags + tags: + - builder + +deploy_docker: + stage: deploy + script: + - echo SUCCESS + only: + - tags + tags: + - builder diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..94530df --- /dev/null +++ b/Dockerfile @@ -0,0 +1,31 @@ +FROM php:latest +LABEL maintainer="ChengYao" version="1.0" license="Apache-2.0" app.name="MaxPHP" + +## +# ---------- env settings ---------- +## +# --build-arg timezone=Asia/Shanghai +ARG timezone + +ENV TIMEZONE=${timezone:-"Asia/Shanghai"} + +# update +RUN set -ex \ + # show php version and extensions + && php -v \ + && php -m \ + && pecl install swoole \ + && echo -e "\033[42;37m Build Completed :).\033[0m\n" + +WORKDIR /www + +# Composer Cache +# COPY ./composer.* /opt/www/ +# RUN composer install --no-dev --no-scripts + +COPY . /www +RUN composer install --no-dev -o && php bin/swoole.php + +EXPOSE 8989 + +ENTRYPOINT ["php", "/www/bin/swoole.php"] diff --git a/deploy.test.yml b/deploy.test.yml new file mode 100644 index 0000000..1342e29 --- /dev/null +++ b/deploy.test.yml @@ -0,0 +1,30 @@ +version: '3.7' +services: + maxphp: + image: $REGISTRY_URL/$PROJECT_NAME:test + environment: + - "APP_PROJECT=maxphp" + - "APP_ENV=test" + ports: + - 8989:8989 + deploy: + replicas: 1 + restart_policy: + condition: on-failure + delay: 5s + max_attempts: 5 + update_config: + parallelism: 2 + delay: 5s + order: start-first + networks: + - maxphp_net + configs: + - source: maxphp_1.0 + target: /www/.env +configs: + maxphp_1.0: + external: true +networks: + maxphp_net: + external: true