From 80857016d6bc2b4249ceee4cc3d076e0f881a07d Mon Sep 17 00:00:00 2001 From: inhere Date: Thu, 4 Jul 2019 12:41:48 +0800 Subject: [PATCH 001/211] update: change composer source to aliyun --- composer.cn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.cn.json b/composer.cn.json index 1b6f3bb3..97a8c40e 100644 --- a/composer.cn.json +++ b/composer.cn.json @@ -54,7 +54,7 @@ "repositories": { "packagist": { "type": "composer", - "url": "https://packagist.laravel-china.org" + "url": "https://mirrors.aliyun.com/composer/" } } } From 32da871800f55af6b49696121f0f27bb8a6f2361 Mon Sep 17 00:00:00 2001 From: Inhere Date: Tue, 9 Jul 2019 11:54:26 +0800 Subject: [PATCH 002/211] Update Dockerfile --- Dockerfile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5362bfe4..7a675f70 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,14 +31,17 @@ ADD . /var/www/swoft # Timezone RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo 'Asia/Shanghai' > /etc/timezone \ -# Libs +# Libs -y --no-install-recommends && apt-get update \ - && apt-get install -y --no-install-recommends \ + && apt-get install \ curl wget git zip unzip less vim openssl \ libz-dev \ libssl-dev \ libnghttp2-dev \ libpcre3-dev \ + libjpeg-dev \ + libpng-dev \ + libfreetype6-dev \ # Install composer && curl -sS https://getcomposer.org/installer | php \ && mv composer.phar /usr/local/bin/composer \ @@ -74,7 +77,7 @@ RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "[Date]\ndate.timezone=${TIMEZONE}" > /usr/local/etc/php/conf.d/timezone.ini \ # Install composer deps && cd /var/www/swoft \ - && composer install --no-dev \ + && composer install \ && composer clearcache WORKDIR /var/www/swoft From 859fc73b7a4e6e8107c6a373f85750125e4ae0da Mon Sep 17 00:00:00 2001 From: Inhere Date: Tue, 9 Jul 2019 12:01:37 +0800 Subject: [PATCH 003/211] Update Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7a675f70..496c5e22 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,7 +33,7 @@ RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo 'Asia/Shanghai' > /etc/timezone \ # Libs -y --no-install-recommends && apt-get update \ - && apt-get install \ + && apt-get install -y \ curl wget git zip unzip less vim openssl \ libz-dev \ libssl-dev \ From 3ab365956cbbac1048a981066688550df2bc1e25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9C=96?= Date: Tue, 9 Jul 2019 12:41:58 +0800 Subject: [PATCH 004/211] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fd131c0b..ac907bb7 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,9 @@ ![](public/image/start-http-server.jpg) -⚡️ Modern High performance AOP and Coroutine PHP Framework, base on Swoole +Swoft is a PHP microservices coroutine framework based on the Swoole extension. Like Go, Swoft has a built-in coroutine web server and a common coroutine client and is resident in memory, independent of traditional PHP-FPM. There are similar Go language operations, similar to the Spring Cloud framework flexible annotations, powerful global dependency injection container, comprehensive service governance, flexible and powerful AOP, standard PSR specification implementation and so on. + +Through three years of accumulation and direction exploration, Swoft has made Swoft the Spring Cloud in the PHP world, which is the best choice for PHP's high-performance framework and microservices management. > **[中文说明](README.zh-CN.md)** From d7ab215ed8100bafbdfd7c560fd2a8f6248b52e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9C=96?= Date: Tue, 9 Jul 2019 12:47:45 +0800 Subject: [PATCH 005/211] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index ac907bb7..a3107544 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,10 @@ ![](public/image/start-http-server.jpg) +PHP microservices coroutine framework + +## Introduction + Swoft is a PHP microservices coroutine framework based on the Swoole extension. Like Go, Swoft has a built-in coroutine web server and a common coroutine client and is resident in memory, independent of traditional PHP-FPM. There are similar Go language operations, similar to the Spring Cloud framework flexible annotations, powerful global dependency injection container, comprehensive service governance, flexible and powerful AOP, standard PSR specification implementation and so on. Through three years of accumulation and direction exploration, Swoft has made Swoft the Spring Cloud in the PHP world, which is the best choice for PHP's high-performance framework and microservices management. From 41678601704d30f1088f79d9d7ea514c7139344d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9C=96?= Date: Tue, 9 Jul 2019 12:50:40 +0800 Subject: [PATCH 006/211] Update README.zh-CN.md --- README.zh-CN.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index bc55cb1a..d7f40038 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -14,10 +14,16 @@ ![](public/image/start-http-server.jpg) -⚡️ 现代的高性能的 AOP & Coroutine PHP框架 +PHP 高性能微服务协程框架 > **[EN README](README.md)** +## 简介 + +Swoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架。Swoft 能像 Go 一样,内置协程网络服务器及常用的协程客户端且常驻内存,不依赖传统的 PHP-FPM。有类似 Go 语言的协程操作方式,有类似 Spring Cloud 框架灵活的注解、强大的全局依赖注入容器、完善的服务治理、灵活强大的 AOP、标准的 PSR 规范实现等等。 + +Swoft 通过长达三年的积累和方向的探索,把 Swoft 打造成 PHP 界的 Spring Cloud, 它是 PHP 高性能框架和微服务治理的最佳选择。 + ## 功能特色 - 内置高性能网络服务器(Http/Websocket/RPC) From 7ffcf70b323e23a85673dc32083a736e8128923d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9C=96?= Date: Tue, 9 Jul 2019 12:52:24 +0800 Subject: [PATCH 007/211] Update README.zh-CN.md --- README.zh-CN.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.zh-CN.md b/README.zh-CN.md index d7f40038..129c2f79 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -44,6 +44,13 @@ Swoft 通过长达三年的积累和方向的探索,把 Swoft 打造成 PHP - 高效的任务处理 - 灵活的异常处理 - 强大的日志系统 + - 服务注册与发现 + - 配置中心 + - 服务限流 + - 服务降级 + - 服务熔断 + - Apollo + - Consul ## 在线文档 From 98c1bdc4c680048870cfb09cc213b676eaa498e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9C=96?= Date: Tue, 9 Jul 2019 12:56:16 +0800 Subject: [PATCH 008/211] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index a3107544..42fb063b 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,12 @@ Through three years of accumulation and direction exploration, Swoft has made Sw - Efficient task processing - Flexible exception handling - Powerful log system +- Service registration & discovery +- Service breaker +- Service restrictions +- Service fallback +- Apollo +- Consul ## Document From eae9759d7a22c2d7304c0a688c61646e87a4499f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9C=96?= Date: Tue, 9 Jul 2019 12:56:46 +0800 Subject: [PATCH 009/211] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 42fb063b..b3edb24d 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ Through three years of accumulation and direction exploration, Swoft has made Sw - Service breaker - Service restrictions - Service fallback +- Configuration Center - Apollo - Consul From 487befc9c1db4bd70fea8759d10f57ee80f130f7 Mon Sep 17 00:00:00 2001 From: Inhere Date: Tue, 9 Jul 2019 14:31:07 +0800 Subject: [PATCH 010/211] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b3edb24d..e809f439 100644 --- a/README.md +++ b/README.md @@ -11,19 +11,20 @@ [![Swoole Version](https://img.shields.io/badge/swoole-%3E=4.3.3-brightgreen.svg?maxAge=2592000)](https://github.com/swoole/swoole-src) [![Swoft Doc](https://img.shields.io/badge/docs-passing-green.svg?maxAge=2592000)](https://www.swoft.org/docs) [![Swoft License](https://img.shields.io/hexpm/l/plug.svg?maxAge=2592000)](https://github.com/swoft-cloud/swoft/blob/master/LICENSE) +[![Gitter](https://img.shields.io/gitter/room/swoft-cloud/swoft.svg)](https://gitter.im/swoft-cloud/community) ![](public/image/start-http-server.jpg) PHP microservices coroutine framework +> **[中文说明](README.zh-CN.md)** + ## Introduction Swoft is a PHP microservices coroutine framework based on the Swoole extension. Like Go, Swoft has a built-in coroutine web server and a common coroutine client and is resident in memory, independent of traditional PHP-FPM. There are similar Go language operations, similar to the Spring Cloud framework flexible annotations, powerful global dependency injection container, comprehensive service governance, flexible and powerful AOP, standard PSR specification implementation and so on. Through three years of accumulation and direction exploration, Swoft has made Swoft the Spring Cloud in the PHP world, which is the best choice for PHP's high-performance framework and microservices management. -> **[中文说明](README.zh-CN.md)** - ## Feature - Built-in high performance network server(Http/Websocket/RPC) From 92ddde031317e95bb43375d8353fa04ec4791319 Mon Sep 17 00:00:00 2001 From: inhere Date: Tue, 9 Jul 2019 17:10:31 +0800 Subject: [PATCH 011/211] add some tcp classes --- app/Tcp/Controller/DemoController.php | 30 +++++++++++++++++++++++++++ dev.composer.json | 12 +++++++---- 2 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 app/Tcp/Controller/DemoController.php diff --git a/app/Tcp/Controller/DemoController.php b/app/Tcp/Controller/DemoController.php new file mode 100644 index 00000000..3c8734a8 --- /dev/null +++ b/app/Tcp/Controller/DemoController.php @@ -0,0 +1,30 @@ + Date: Wed, 10 Jul 2019 12:16:01 +0800 Subject: [PATCH 012/211] Update docker-compose.yml --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5f216e6f..49003d59 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,7 +15,7 @@ services: - "18307:18307" - "18308:18308" volumes: - - ./:/var/www + - ./:/var/www/swoft # - ./tmp/ng-conf:/etc/nginx # - ./tmp/logs:/var/log From 219afcf0cf1dff474aa5de4ea911bf280386006a Mon Sep 17 00:00:00 2001 From: inhere Date: Wed, 10 Jul 2019 12:40:17 +0800 Subject: [PATCH 013/211] update some info, fix docker compose --- .dockerignore | 1 + README.md | 4 ++-- README.zh-CN.md | 5 +++-- app/Application.php | 2 -- bin/swoft | 4 +--- composer.json | 7 +++---- docker-compose.yml | 4 ++-- 7 files changed, 12 insertions(+), 15 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..e4d05d91 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +runtime diff --git a/README.md b/README.md index e809f439..4eb911d5 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,14 @@ [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/swoft.svg)](https://packagist.org/packages/swoft/swoft) [![Build Status](https://travis-ci.org/swoft-cloud/swoft.svg?branch=master)](https://travis-ci.org/swoft-cloud/swoft) -[![Docker Build Status](https://img.shields.io/docker/build/swoft/alphp.svg)](https://hub.docker.com/r/swoft/alphp/) +[![Docker Build Status](https://img.shields.io/docker/build/swoft/swoft.svg)](https://hub.docker.com/r/swoft/swoft/) [![Php Version](https://img.shields.io/badge/php-%3E=7.1-brightgreen.svg?maxAge=2592000)](https://secure.php.net/) [![Swoole Version](https://img.shields.io/badge/swoole-%3E=4.3.3-brightgreen.svg?maxAge=2592000)](https://github.com/swoole/swoole-src) [![Swoft Doc](https://img.shields.io/badge/docs-passing-green.svg?maxAge=2592000)](https://www.swoft.org/docs) [![Swoft License](https://img.shields.io/hexpm/l/plug.svg?maxAge=2592000)](https://github.com/swoft-cloud/swoft/blob/master/LICENSE) [![Gitter](https://img.shields.io/gitter/room/swoft-cloud/swoft.svg)](https://gitter.im/swoft-cloud/community) -![](public/image/start-http-server.jpg) +![start-http-server](https://raw.githubusercontent.com/swoft-cloud/swoft/master/public/image/start-http-server.jpg) PHP microservices coroutine framework diff --git a/README.zh-CN.md b/README.zh-CN.md index 129c2f79..b174d3e6 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -6,13 +6,14 @@ [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/swoft.svg)](https://packagist.org/packages/swoft/swoft) [![Build Status](https://travis-ci.org/swoft-cloud/swoft.svg?branch=master)](https://travis-ci.org/swoft-cloud/swoft) -[![Docker Build Status](https://img.shields.io/docker/build/swoft/alphp.svg)](https://hub.docker.com/r/swoft/alphp/) +[![Docker Build Status](https://img.shields.io/docker/build/swoft/swoft.svg)](https://hub.docker.com/r/swoft/swoft/) [![Php Version](https://img.shields.io/badge/php-%3E=7.1-brightgreen.svg?maxAge=2592000)](https://secure.php.net/) [![Swoole Version](https://img.shields.io/badge/swoole-%3E=4.3.3-brightgreen.svg?maxAge=2592000)](https://github.com/swoole/swoole-src) [![Swoft Doc](https://img.shields.io/badge/docs-passing-green.svg?maxAge=2592000)](https://www.swoft.org/docs) [![Swoft License](https://img.shields.io/hexpm/l/plug.svg?maxAge=2592000)](https://github.com/swoft-cloud/swoft/blob/master/LICENSE) +[![Gitter](https://img.shields.io/gitter/room/swoft-cloud/swoft.svg)](https://gitter.im/swoft-cloud/community) -![](public/image/start-http-server.jpg) +![start-http-server](https://raw.githubusercontent.com/swoft-cloud/swoft/master/public/image/start-http-server.jpg) PHP 高性能微服务协程框架 diff --git a/app/Application.php b/app/Application.php index d68e92c6..c7003af9 100644 --- a/app/Application.php +++ b/app/Application.php @@ -1,9 +1,7 @@ 300000, ]); // Run application -(new \App\Application())->run(); \ No newline at end of file +(new \App\Application())->run(); diff --git a/composer.json b/composer.json index d7092dcf..1d0aec11 100644 --- a/composer.json +++ b/composer.json @@ -24,17 +24,16 @@ "swoft/rpc-client": "~2.0.0", "swoft/rpc-server": "~2.0.0", "swoft/websocket-server": "~2.0.0", - "swoft/tcp": "~2.0.0", "swoft/tcp-server": "~2.0.0", "swoft/apollo": "~2.0.0", "swoft/consul": "~2.0.0", "swoft/limiter": "~2.0.0", - "swoft/breaker": "~2.0.0" + "swoft/breaker": "~2.0.0", + "swoft/devtool": "~2.0.0" }, "require-dev": { "swoft/swoole-ide-helper": "dev-master", - "phpunit/phpunit": "^7.5", - "swoft/devtool": "~2.0.0" + "phpunit/phpunit": "^7.5" }, "autoload": { "psr-4": { diff --git a/docker-compose.yml b/docker-compose.yml index 5f216e6f..05aa4ff1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,7 +15,7 @@ services: - "18307:18307" - "18308:18308" volumes: - - ./:/var/www + - ./:/var/www/swoft # - ./tmp/ng-conf:/etc/nginx # - ./tmp/logs:/var/log @@ -27,7 +27,7 @@ services: ports: - "13306:3306" volumes: - - ./tmp/data/mysql:/var/lib/mysql + - ./runtime/data/mysql:/var/lib/mysql restart: always redis: From 743155bae77a1163263eadf12352601fcd6baa7d Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Fri, 12 Jul 2019 11:14:54 +0800 Subject: [PATCH 014/211] Fixed for swoole 4.4 --- app/Listener/DeregisterServiceListener.php | 17 ++++++++++++----- app/Listener/RegisterServiceListener.php | 13 ++++++------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/app/Listener/DeregisterServiceListener.php b/app/Listener/DeregisterServiceListener.php index bae52825..78ace1ae 100644 --- a/app/Listener/DeregisterServiceListener.php +++ b/app/Listener/DeregisterServiceListener.php @@ -4,13 +4,19 @@ namespace App\Listener; +use ReflectionException; use Swoft\Bean\Annotation\Mapping\Inject; +use Swoft\Bean\Exception\ContainerException; +use Swoft\Co; use Swoft\Consul\Agent; +use Swoft\Consul\Exception\ClientException; +use Swoft\Consul\Exception\ServerException; use Swoft\Event\Annotation\Mapping\Listener; use Swoft\Event\EventHandlerInterface; use Swoft\Event\EventInterface; use Swoft\Http\Server\HttpServer; use Swoft\Server\Swoole\SwooleEvent; +use Swoole\Coroutine; /** * Class DeregisterServiceListener @@ -30,16 +36,17 @@ class DeregisterServiceListener implements EventHandlerInterface /** * @param EventInterface $event + * + * @throws ReflectionException + * @throws ContainerException + * @throws ClientException + * @throws ServerException */ public function handle(EventInterface $event): void { /* @var HttpServer $httpServer */ $httpServer = $event->getTarget(); -// $scheduler = Swoole\Coroutine\Scheduler(); -// $scheduler->add(function () use ($httpServer) { -// $this->agent->deregisterService('swoft'); -// }); -// $scheduler->start(); +// $this->agent->deregisterService('swoft'); } } \ No newline at end of file diff --git a/app/Listener/RegisterServiceListener.php b/app/Listener/RegisterServiceListener.php index 101cb596..9bdce35d 100644 --- a/app/Listener/RegisterServiceListener.php +++ b/app/Listener/RegisterServiceListener.php @@ -5,6 +5,7 @@ use Swoft\Bean\Annotation\Mapping\Inject; +use Swoft\Co; use Swoft\Consul\Agent; use Swoft\Event\Annotation\Mapping\Listener; use Swoft\Event\EventHandlerInterface; @@ -12,6 +13,7 @@ use Swoft\Http\Server\HttpServer; use Swoft\Log\Helper\CLog; use Swoft\Server\Swoole\SwooleEvent; +use Swoole\Coroutine; /** * Class RegisterServiceListener @@ -56,12 +58,9 @@ public function handle(EventInterface $event): void ]; -// $scheduler = Swoole\Coroutine\Scheduler(); -// $scheduler->add(function () use ($service) { -// // Register -// $this->agent->registerService($service); -// CLog::info('Swoft http register service success by consul!'); -// }); -// $scheduler->start(); + // Register +// $this->agent->registerService($service); +// CLog::info('Swoft http register service success by consul!'); + } } \ No newline at end of file From f4badd6fa17fe40e79abde9c068c9a90533c5aba Mon Sep 17 00:00:00 2001 From: Inhere Date: Sat, 13 Jul 2019 14:34:55 +0800 Subject: [PATCH 015/211] Update Dockerfile --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 496c5e22..ef58af06 100644 --- a/Dockerfile +++ b/Dockerfile @@ -83,4 +83,5 @@ RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ WORKDIR /var/www/swoft EXPOSE 18306 18307 18308 -ENTRYPOINT ["php", "/var/www/swoft/bin/swoft", "http:start"] +# ENTRYPOINT ["php", "/var/www/swoft/bin/swoft", "http:start"] +CMD ["php", "/var/www/swoft/bin/swoft", "http:start"] From e0146dbffdcffcc395b96cc5db76847bd844a836 Mon Sep 17 00:00:00 2001 From: inhere Date: Sat, 13 Jul 2019 18:32:20 +0800 Subject: [PATCH 016/211] update some info --- Dockerfile | 3 ++- app/Application.php | 6 ++++++ app/Http/Controller/LimiterController.php | 2 +- test/bootstrap.php | 2 -- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 496c5e22..c2508c09 100644 --- a/Dockerfile +++ b/Dockerfile @@ -83,4 +83,5 @@ RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ WORKDIR /var/www/swoft EXPOSE 18306 18307 18308 -ENTRYPOINT ["php", "/var/www/swoft/bin/swoft", "http:start"] +#ENTRYPOINT ["php", "/var/www/swoft/bin/swoft", "http:start"] +CMD ["php", "/var/www/swoft/bin/swoft", "http:start"] diff --git a/app/Application.php b/app/Application.php index c7003af9..43f71606 100644 --- a/app/Application.php +++ b/app/Application.php @@ -3,6 +3,7 @@ namespace App; use Swoft\SwoftApplication; +use function date_default_timezone_set; /** * Class Application @@ -11,5 +12,10 @@ */ class Application extends SwoftApplication { + protected function beforeInit(): void + { + parent::beforeInit(); + date_default_timezone_set('Asia/Shanghai'); + } } diff --git a/app/Http/Controller/LimiterController.php b/app/Http/Controller/LimiterController.php index 615bf987..6796e168 100644 --- a/app/Http/Controller/LimiterController.php +++ b/app/Http/Controller/LimiterController.php @@ -69,4 +69,4 @@ public function limiterFallback(Request $request): array $uri = $request->getUriPath(); return ['limiterFallback', $uri]; } -} \ No newline at end of file +} diff --git a/test/bootstrap.php b/test/bootstrap.php index 7cd4eefb..a4abe2da 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -1,4 +1,2 @@ Date: Sat, 13 Jul 2019 23:39:53 +0800 Subject: [PATCH 017/211] update some bean config --- app/Console/Command/TestCommand.php | 56 ++--------------------------- app/bean.php | 9 ++++- 2 files changed, 11 insertions(+), 54 deletions(-) diff --git a/app/Console/Command/TestCommand.php b/app/Console/Command/TestCommand.php index a3e52a5f..24da8bca 100644 --- a/app/Console/Command/TestCommand.php +++ b/app/Console/Command/TestCommand.php @@ -1,20 +1,15 @@ getSameOpt(['host', 'H'], '127.0.0.1'); - $port = $input->getSameOpt(['port', 'p'], 18309); - - if (!$ok = $cli->connect((string)$host, (int)$port, 5.0)) { - $code = $cli->errCode; - $msg = socket_strerror($code); - Show::error("Connect failed. Error($code): $msg"); - return; - } - - $addr = $host . ':' . $port; - $output->colored('Successful connect to tcp server ' . $addr, 'success'); - - while (true) { - if (!$msg = $input->read('> ')) { - $output->liteWarning('Please input message for send'); - continue; - } - - // Exit interactive terminal - if ($msg === 'quit' || $msg === 'exit') { - $output->colored('Quit, Bye!'); - break; - } - - $cli->send($msg); - - $res = $cli->recv(); - $output->writef('Return: %s', $res); - } - - $cli->close(); - } } diff --git a/app/bean.php b/app/bean.php index 0a184a8b..617b24f0 100644 --- a/app/bean.php +++ b/app/bean.php @@ -10,7 +10,7 @@ use Swoft\Rpc\Server\ServiceServer; use Swoft\Http\Server\Swoole\RequestListener; use Swoft\WebSocket\Server\WebSocketServer; -use Swoft\Server\Swoole\SwooleEvent; +use Swoft\Server\SwooleEvent; use Swoft\Db\Database; use Swoft\Redis\RedisDb; @@ -100,6 +100,7 @@ ], 'wsServer' => [ 'class' => WebSocketServer::class, + 'port' => 18308, 'on' => [ // Enable http handle SwooleEvent::REQUEST => bean(RequestListener::class), @@ -110,6 +111,12 @@ 'log_file' => alias('@runtime/swoole.log'), ], ], + 'tcpServer' => [ + 'port' => 18309, + ], + 'tcpServerProtocol' => [ + 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, + ], 'cliRouter' => [ // 'disabledGroups' => ['demo', 'test'], ] From 711f798019fb1bf03252877a9fce651e53bb1ae5 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Sun, 14 Jul 2019 17:15:24 +0800 Subject: [PATCH 018/211] Add user process --- app/Listener/UserSavingListener.php | 18 +++++------ app/Model/Logic/MonitorLogic.php | 47 +++++++++++++++++++++++++++++ app/Process/MonitorProcess.php | 39 ++++++++++++++++++++++++ app/bean.php | 12 +++++--- 4 files changed, 103 insertions(+), 13 deletions(-) create mode 100644 app/Model/Logic/MonitorLogic.php create mode 100644 app/Process/MonitorProcess.php diff --git a/app/Listener/UserSavingListener.php b/app/Listener/UserSavingListener.php index 23c7957f..263bd099 100644 --- a/app/Listener/UserSavingListener.php +++ b/app/Listener/UserSavingListener.php @@ -22,14 +22,14 @@ class UserSavingListener implements EventHandlerInterface */ public function handle(EventInterface $event): void { - /* @var User $user */ - $user = $event->getTarget(); - - if ($user->getAge() > 100) { - // stopping saving - $event->stopPropagation(true); - - $user->setAdd(100); - } +// /* @var User $user */ +// $user = $event->getTarget(); +// +// if ($user->getAge() > 100) { +// // stopping saving +// $event->stopPropagation(true); +// +// $user->setAdd(100); +// } } } diff --git a/app/Model/Logic/MonitorLogic.php b/app/Model/Logic/MonitorLogic.php new file mode 100644 index 00000000..23bfa5c8 --- /dev/null +++ b/app/Model/Logic/MonitorLogic.php @@ -0,0 +1,47 @@ +name('swoft-monitor'); + + while (true) { + $connections = context()->getServer()->getSwooleServer()->connections; + CLog::info('monitor = ' . json_encode($connections)); + + // Database + $user = User::find(1)->toArray(); + CLog::info('user='.json_encode($user)); + + // Redis + Redis::set('test', 'ok'); + CLog::info('test='.Redis::get('test')); + + Coroutine::sleep(3); + } + } +} \ No newline at end of file diff --git a/app/Process/MonitorProcess.php b/app/Process/MonitorProcess.php new file mode 100644 index 00000000..d9b1650a --- /dev/null +++ b/app/Process/MonitorProcess.php @@ -0,0 +1,39 @@ +logic->monitor($process); + } +} \ No newline at end of file diff --git a/app/bean.php b/app/bean.php index 0a184a8b..f38b6325 100644 --- a/app/bean.php +++ b/app/bean.php @@ -1,6 +1,7 @@ [ 'flushRequest' => true, - 'enable' => false, + 'enable' => true, 'json' => false, ], 'httpServer' => [ @@ -26,6 +27,9 @@ 'listener' => [ 'rpc' => bean('rpcServer') ], + 'process' => [ + 'monitor' => bean(MonitorProcess::class) + ], 'on' => [ SwooleEvent::TASK => bean(TaskListener::class), // Enable task must task and finish event SwooleEvent::FINISH => bean(FinishListener::class) @@ -45,13 +49,13 @@ ], 'db' => [ 'class' => Database::class, - 'dsn' => 'mysql:dbname=test;host=192.168.4.11', + 'dsn' => 'mysql:dbname=test;host=172.17.0.2', 'username' => 'root', 'password' => 'swoft123456', ], 'db2' => [ 'class' => Database::class, - 'dsn' => 'mysql:dbname=test2;host=192.168.4.11', + 'dsn' => 'mysql:dbname=test2;host=172.17.0.2', 'username' => 'root', 'password' => 'swoft123456', 'dbSelector' => bean(DbSelector::class) @@ -62,7 +66,7 @@ ], 'db3' => [ 'class' => Database::class, - 'dsn' => 'mysql:dbname=test2;host=192.168.4.11', + 'dsn' => 'mysql:dbname=test2;host=172.17.0.2', 'username' => 'root', 'password' => 'swoft123456' ], From 0f9ce68212e1cba7c397847002c510e682e00a08 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Mon, 15 Jul 2019 20:29:41 +0800 Subject: [PATCH 019/211] Add process pool demo --- app/Process/Worker1Process.php | 34 ++++++++++++++++++++++++++++++++++ app/Process/Worker2Process.php | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 app/Process/Worker1Process.php create mode 100644 app/Process/Worker2Process.php diff --git a/app/Process/Worker1Process.php b/app/Process/Worker1Process.php new file mode 100644 index 00000000..7d4eb23e --- /dev/null +++ b/app/Process/Worker1Process.php @@ -0,0 +1,34 @@ + Date: Tue, 16 Jul 2019 14:58:04 +0800 Subject: [PATCH 020/211] Add demo --- app/Console/Command/TestCommand.php | 3 ++ app/Http/Controller/TaskController.php | 18 ++++++++++ app/Process/Worker1Process.php | 4 +-- app/Process/Worker2Process.php | 4 +-- app/Task/Task/SyncTask.php | 49 ++++++++++++++++++++++++++ app/bean.php | 10 +++--- 6 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 app/Task/Task/SyncTask.php diff --git a/app/Console/Command/TestCommand.php b/app/Console/Command/TestCommand.php index a3e52a5f..f730e516 100644 --- a/app/Console/Command/TestCommand.php +++ b/app/Console/Command/TestCommand.php @@ -15,6 +15,7 @@ use Swoft\Console\Output\Output; use Swoft\Http\Server\Router\Route; use Swoole\Client; +use Swoole\Coroutine; /** * Class TestCommand @@ -53,6 +54,8 @@ public function ab() output()->writeln('执行URL:' . $abShell . PHP_EOL); exec($abShell, $abResult); + + sleep(1); } } diff --git a/app/Http/Controller/TaskController.php b/app/Http/Controller/TaskController.php index e3015f9d..0168e143 100644 --- a/app/Http/Controller/TaskController.php +++ b/app/Http/Controller/TaskController.php @@ -95,4 +95,22 @@ public function returnVoid(): array $result = Task::co('testTask', 'returnVoid', ['name']); return [$result]; } + + /** + * @RequestMapping() + * + * @return array + * @throws TaskException + */ + public function syncTask(): array + { + $result = Task::co('sync', 'test', ['name']); + $result2 = Task::co('sync', 'testBool', []); + $result3 = Task::co('sync', 'testNull', []); + + $data[] = $result; + $data[] = $result2; + $data[] = $result3; + return $data; + } } \ No newline at end of file diff --git a/app/Process/Worker1Process.php b/app/Process/Worker1Process.php index 7d4eb23e..3d2e36c8 100644 --- a/app/Process/Worker1Process.php +++ b/app/Process/Worker1Process.php @@ -25,8 +25,8 @@ class Worker1Process implements ProcessInterface */ public function run(Pool $pool, int $workerId): void { - while (true){ - CLog::info('worker-1'); + while (true) { + CLog::info('worker-' . $workerId); Coroutine::sleep(3); } diff --git a/app/Process/Worker2Process.php b/app/Process/Worker2Process.php index 4904358c..54d0835a 100644 --- a/app/Process/Worker2Process.php +++ b/app/Process/Worker2Process.php @@ -25,8 +25,8 @@ class Worker2Process implements ProcessInterface */ public function run(Pool $pool, int $workerId): void { - while (true){ - CLog::info('worker-2'); + while (true) { + CLog::info('worker-' . $workerId); Coroutine::sleep(3); } diff --git a/app/Task/Task/SyncTask.php b/app/Task/Task/SyncTask.php new file mode 100644 index 00000000..3c68b5ec --- /dev/null +++ b/app/Task/Task/SyncTask.php @@ -0,0 +1,49 @@ + bean('rpcServer') ], 'process' => [ - 'monitor' => bean(MonitorProcess::class) +// 'monitor' => bean(MonitorProcess::class) ], 'on' => [ - SwooleEvent::TASK => bean(TaskListener::class), // Enable task must task and finish event - SwooleEvent::FINISH => bean(FinishListener::class) + SwooleEvent::TASK => bean(SyncTaskListener::class), // Enable sync task +// SwooleEvent::TASK => bean(TaskListener::class), // Enable task must task and finish event +// SwooleEvent::FINISH => bean(FinishListener::class) ], /* @see HttpServer::$setting */ 'setting' => [ 'task_worker_num' => 3, - 'task_enable_coroutine' => true +// 'task_enable_coroutine' => true ] ], 'httpDispatcher' => [ From b80968e914ad7b58902abde15c3959e8591e29a1 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Tue, 16 Jul 2019 15:35:28 +0800 Subject: [PATCH 021/211] Set default co task --- app/bean.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/bean.php b/app/bean.php index aeaa0bbf..5245b456 100644 --- a/app/bean.php +++ b/app/bean.php @@ -32,14 +32,14 @@ // 'monitor' => bean(MonitorProcess::class) ], 'on' => [ - SwooleEvent::TASK => bean(SyncTaskListener::class), // Enable sync task -// SwooleEvent::TASK => bean(TaskListener::class), // Enable task must task and finish event -// SwooleEvent::FINISH => bean(FinishListener::class) +// SwooleEvent::TASK => bean(SyncTaskListener::class), // Enable sync task + SwooleEvent::TASK => bean(TaskListener::class), // Enable task must task and finish event + SwooleEvent::FINISH => bean(FinishListener::class) ], /* @see HttpServer::$setting */ 'setting' => [ - 'task_worker_num' => 3, -// 'task_enable_coroutine' => true + 'task_worker_num' => 12, + 'task_enable_coroutine' => true ] ], 'httpDispatcher' => [ From 5239a2a5c19f779ed55fdec8c993837b716d1e9a Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Tue, 16 Jul 2019 17:09:16 +0800 Subject: [PATCH 022/211] Modify demo --- app/Process/Worker1Process.php | 2 +- app/Process/Worker2Process.php | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/Process/Worker1Process.php b/app/Process/Worker1Process.php index 3d2e36c8..c802ff73 100644 --- a/app/Process/Worker1Process.php +++ b/app/Process/Worker1Process.php @@ -15,7 +15,7 @@ * * @since 2.0 * - * @Process(workerId=1) + * @Process(workerId=0) */ class Worker1Process implements ProcessInterface { diff --git a/app/Process/Worker2Process.php b/app/Process/Worker2Process.php index 54d0835a..a811174f 100644 --- a/app/Process/Worker2Process.php +++ b/app/Process/Worker2Process.php @@ -4,9 +4,12 @@ namespace App\Process; +use App\Model\Entity\User; +use Swoft\Db\Exception\DbException; use Swoft\Log\Helper\CLog; use Swoft\Process\Annotation\Mapping\Process; use Swoft\Process\Contract\ProcessInterface; +use Swoft\Redis\Redis; use Swoole\Coroutine; use Swoole\Process\Pool; @@ -15,18 +18,29 @@ * * @since 2.0 * - * @Process(workerId=2) + * @Process(workerId={1,2}) */ class Worker2Process implements ProcessInterface { /** * @param Pool $pool * @param int $workerId + * + * @throws DbException */ public function run(Pool $pool, int $workerId): void { while (true) { - CLog::info('worker-' . $workerId); + + // Database + $user = User::find(1)->toArray(); + CLog::info('user='.json_encode($user)); + + // Redis + Redis::set('test', 'ok'); + CLog::info('test='.Redis::get('test')); + + CLog::info('worker-' . $workerId.' context='.context()->getWorkerId()); Coroutine::sleep(3); } From 27c6d57771c7d81dce08ecb4dd1ee1dabaa2f8ff Mon Sep 17 00:00:00 2001 From: beckjiang Date: Wed, 17 Jul 2019 18:53:22 +0800 Subject: [PATCH 023/211] =?UTF-8?q?=E4=BC=98=E5=8C=96Dockerfile=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0gitignore=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- Dockerfile | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index efc949ab..734bd182 100644 --- a/.gitignore +++ b/.gitignore @@ -7,9 +7,10 @@ runtime/ vendor/ temp/ +tmp/ *.lock .phpintel/ .env .phpstorm.meta.php .DS_Store -public/devtool/ \ No newline at end of file +public/devtool/ diff --git a/Dockerfile b/Dockerfile index ef58af06..26037162 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,8 +26,6 @@ ENV APP_ENV=${app_env:-"prod"} \ SWOOLE_VERSION=4.3.5 \ COMPOSER_ALLOW_SUPERUSER=1 -ADD . /var/www/swoft - # Timezone RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo 'Asia/Shanghai' > /etc/timezone \ @@ -74,9 +72,11 @@ RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ # Timezone && cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \ && echo "${TIMEZONE}" > /etc/timezone \ - && echo "[Date]\ndate.timezone=${TIMEZONE}" > /usr/local/etc/php/conf.d/timezone.ini \ + && echo "[Date]\ndate.timezone=${TIMEZONE}" > /usr/local/etc/php/conf.d/timezone.ini + # Install composer deps - && cd /var/www/swoft \ +ADD . /var/www/swoft +RUN cd /var/www/swoft \ && composer install \ && composer clearcache @@ -85,3 +85,4 @@ EXPOSE 18306 18307 18308 # ENTRYPOINT ["php", "/var/www/swoft/bin/swoft", "http:start"] CMD ["php", "/var/www/swoft/bin/swoft", "http:start"] + From 03bb46e8fc4816e94a66563603927d323789c3de Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 17 Jul 2019 19:33:51 +0800 Subject: [PATCH 024/211] Update docker-compose.yml --- docker-compose.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 49003d59..0149d563 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,8 +16,8 @@ services: - "18308:18308" volumes: - ./:/var/www/swoft - # - ./tmp/ng-conf:/etc/nginx - # - ./tmp/logs:/var/log + # - ./runtime/ng-conf:/etc/nginx + # - ./runtime/logs:/var/log mysql: image: mysql @@ -27,7 +27,7 @@ services: ports: - "13306:3306" volumes: - - ./tmp/data/mysql:/var/lib/mysql + - ./runtime/data/mysql:/var/lib/mysql restart: always redis: From 22011c395ee24d5f606e2d141f41bb5373c89762 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 17 Jul 2019 19:36:07 +0800 Subject: [PATCH 025/211] Update .gitignore --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index 734bd182..fa561a74 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,6 @@ .git/ runtime/ vendor/ -temp/ -tmp/ *.lock .phpintel/ .env From 0cd11d8b0975d23f2a49293e91244f145a230187 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Wed, 17 Jul 2019 20:37:50 +0800 Subject: [PATCH 026/211] Add lua pre --- app/bean.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/bean.php b/app/bean.php index 5245b456..5300227c 100644 --- a/app/bean.php +++ b/app/bean.php @@ -84,6 +84,9 @@ 'host' => '127.0.0.1', 'port' => 6379, 'database' => 0, + 'option' => [ + 'prefix' => 'swoft:prefix:' + ] ], 'user' => [ 'class' => ServiceClient::class, From a0e53829d49a8e55b501abc21035a54f78b9f826 Mon Sep 17 00:00:00 2001 From: zhenghongyang Date: Wed, 17 Jul 2019 21:11:48 +0800 Subject: [PATCH 027/211] add sql parse --- app/Listener/RanListener.php | 51 +++++++++++++++++++++++++++-- app/Listener/UserSavingListener.php | 21 +++++++----- app/bean.php | 31 ++++++++++-------- 3 files changed, 78 insertions(+), 25 deletions(-) diff --git a/app/Listener/RanListener.php b/app/Listener/RanListener.php index 47560696..829ce42c 100644 --- a/app/Listener/RanListener.php +++ b/app/Listener/RanListener.php @@ -8,6 +8,7 @@ use Swoft\Event\Annotation\Mapping\Listener; use Swoft\Event\EventHandlerInterface; use Swoft\Event\EventInterface; +use Swoft\Stdlib\Helper\StringHelper; /** * Class RanListener @@ -18,16 +19,62 @@ */ class RanListener implements EventHandlerInterface { + /** + * SQL ran + * * @param EventInterface $event + * */ public function handle(EventInterface $event): void { - /* @var Connection $connection */ $connection = $event->getTarget(); - $querySql = $event->getParam(0); + $querySql = $event->getParam(0); $bindings = $event->getParam(1); + + $rawSql = $this->getRawSql($querySql, $bindings, $connection); + + output()->info($rawSql); + } + + /** + * Returns the raw SQL by inserting parameter values into the corresponding placeholders in [[sql]]. + * Note that the return value of this method should mainly be used for logging purpose. + * It is likely that this method returns an invalid SQL due to improper replacement of parameter placeholders. + * + * @param string $sql + * @param array $bindings + * @param Connection $connection + * + * @return string the raw SQL with parameter values inserted into the corresponding placeholders in [[sql]]. + */ + public function getRawSql(string $sql, array $bindings, Connection $connection) + { + if (empty($bindings)) { + return $sql; + } + foreach ($bindings as $name => $value) { + if (is_string($name) && strncmp(':', $name, 1)) { + $name = ':' . $name; + } else { + $name = '?'; + } + + if (is_string($value) || is_array($value)) { + $param = $connection->getQueryGrammar()->quoteString($value); + } elseif (is_bool($value)) { + $param = ($value ? 'TRUE' : 'FALSE'); + } elseif ($value === null) { + $param = 'NULL'; + } else { + $param = (string)$value; + } + + $sql = StringHelper::replaceFirst($name, $param, $sql); + } + + return $sql; } } diff --git a/app/Listener/UserSavingListener.php b/app/Listener/UserSavingListener.php index 263bd099..cf278e4f 100644 --- a/app/Listener/UserSavingListener.php +++ b/app/Listener/UserSavingListener.php @@ -22,14 +22,17 @@ class UserSavingListener implements EventHandlerInterface */ public function handle(EventInterface $event): void { -// /* @var User $user */ -// $user = $event->getTarget(); -// -// if ($user->getAge() > 100) { -// // stopping saving -// $event->stopPropagation(true); -// -// $user->setAdd(100); -// } + + /* @var User $user */ + $user = $event->getTarget(); + + /** + if ($user->getAge() > 100) { + // stopping saving + $event->stopPropagation(true); + + $user->setAdd(100); + } + */ } } diff --git a/app/bean.php b/app/bean.php index 5245b456..287ab3fa 100644 --- a/app/bean.php +++ b/app/bean.php @@ -17,12 +17,12 @@ use Swoft\Redis\RedisDb; return [ - 'logger' => [ + 'logger' => [ 'flushRequest' => true, 'enable' => true, 'json' => false, ], - 'httpServer' => [ + 'httpServer' => [ 'class' => HttpServer::class, 'port' => 18306, 'listener' => [ @@ -42,50 +42,53 @@ 'task_enable_coroutine' => true ] ], - 'httpDispatcher' => [ + 'httpDispatcher' => [ // Add global http middleware 'middlewares' => [ // Allow use @View tag \Swoft\View\Middleware\ViewMiddleware::class, ], ], - 'db' => [ + 'db' => [ 'class' => Database::class, 'dsn' => 'mysql:dbname=test;host=172.17.0.2', 'username' => 'root', 'password' => 'swoft123456', ], - 'db2' => [ + 'db2' => [ 'class' => Database::class, 'dsn' => 'mysql:dbname=test2;host=172.17.0.2', 'username' => 'root', 'password' => 'swoft123456', 'dbSelector' => bean(DbSelector::class) ], - 'db2.pool' => [ + 'db2.pool' => [ 'class' => Pool::class, 'database' => bean('db2') ], - 'db3' => [ + 'db3' => [ 'class' => Database::class, 'dsn' => 'mysql:dbname=test2;host=172.17.0.2', 'username' => 'root', 'password' => 'swoft123456' ], - 'db3.pool' => [ + 'db3.pool' => [ 'class' => Pool::class, 'database' => bean('db3') ], 'migrationManager' => [ 'migrationPath' => '@app/Migration', ], - 'redis' => [ + 'redis' => [ 'class' => RedisDb::class, 'host' => '127.0.0.1', 'port' => 6379, 'database' => 0, + 'option' => [ + 'prefix' => "swoft" + ] ], - 'user' => [ + 'user' => [ 'class' => ServiceClient::class, 'host' => '127.0.0.1', 'port' => 18307, @@ -97,14 +100,14 @@ ], 'packet' => bean('rpcClientPacket') ], - 'user.pool' => [ + 'user.pool' => [ 'class' => ServicePool::class, 'client' => bean('user') ], - 'rpcServer' => [ + 'rpcServer' => [ 'class' => ServiceServer::class, ], - 'wsServer' => [ + 'wsServer' => [ 'class' => WebSocketServer::class, 'on' => [ // Enable http handle @@ -116,7 +119,7 @@ 'log_file' => alias('@runtime/swoole.log'), ], ], - 'cliRouter' => [ + 'cliRouter' => [ // 'disabledGroups' => ['demo', 'test'], ] ]; From 930bbd04dd5aed767af4978f7ac62cf54163d2c2 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Thu, 18 Jul 2019 17:06:54 +0800 Subject: [PATCH 028/211] Update swooleEvent --- app/Listener/DeregisterServiceListener.php | 2 +- app/Listener/RegisterServiceListener.php | 2 +- app/bean.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Listener/DeregisterServiceListener.php b/app/Listener/DeregisterServiceListener.php index 78ace1ae..5aab5a6b 100644 --- a/app/Listener/DeregisterServiceListener.php +++ b/app/Listener/DeregisterServiceListener.php @@ -15,7 +15,7 @@ use Swoft\Event\EventHandlerInterface; use Swoft\Event\EventInterface; use Swoft\Http\Server\HttpServer; -use Swoft\Server\Swoole\SwooleEvent; +use Swoft\Server\SwooleEvent; use Swoole\Coroutine; /** diff --git a/app/Listener/RegisterServiceListener.php b/app/Listener/RegisterServiceListener.php index 9bdce35d..e7e1f90a 100644 --- a/app/Listener/RegisterServiceListener.php +++ b/app/Listener/RegisterServiceListener.php @@ -12,7 +12,7 @@ use Swoft\Event\EventInterface; use Swoft\Http\Server\HttpServer; use Swoft\Log\Helper\CLog; -use Swoft\Server\Swoole\SwooleEvent; +use Swoft\Server\SwooleEvent; use Swoole\Coroutine; /** diff --git a/app/bean.php b/app/bean.php index 5300227c..4cdf55d1 100644 --- a/app/bean.php +++ b/app/bean.php @@ -12,7 +12,7 @@ use Swoft\Rpc\Server\ServiceServer; use Swoft\Http\Server\Swoole\RequestListener; use Swoft\WebSocket\Server\WebSocketServer; -use Swoft\Server\Swoole\SwooleEvent; +use Swoft\Server\SwooleEvent; use Swoft\Db\Database; use Swoft\Redis\RedisDb; From 80b5541ca9ddf1bbb39bcaf674d69e51bfcbab65 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Thu, 18 Jul 2019 17:18:08 +0800 Subject: [PATCH 029/211] Add log demo --- app/Http/Controller/LogController.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/Http/Controller/LogController.php b/app/Http/Controller/LogController.php index aedcb8d2..121d4f5a 100644 --- a/app/Http/Controller/LogController.php +++ b/app/Http/Controller/LogController.php @@ -7,6 +7,7 @@ use Swoft\Bean\Exception\ContainerException; use Swoft\Http\Server\Annotation\Mapping\Controller; use Swoft\Http\Server\Annotation\Mapping\RequestMapping; +use Swoft\Log\Helper\CLog; use Swoft\Log\Helper\Log; /** @@ -41,6 +42,10 @@ public function test(): array Log::alert('this %s log', 'alert'); Log::emergency('this %s log', 'emergency'); + Log::error('Special message user@%'); + + CLog::info('Special message user@%'); + // Tag end Log::profileEnd('tagName'); From dd912f6fbc41a6a05cb91e5fae666ad2e5a1a0ba Mon Sep 17 00:00:00 2001 From: zhenghongyang Date: Thu, 18 Jul 2019 18:24:09 +0800 Subject: [PATCH 030/211] add demo --- app/Http/Controller/RedisController.php | 17 +++++++++++++++-- app/Listener/RanListener.php | 4 +--- app/Process/MonitorProcess.php | 2 +- app/Process/Worker1Process.php | 2 +- app/Process/Worker2Process.php | 2 +- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/app/Http/Controller/RedisController.php b/app/Http/Controller/RedisController.php index f30d19db..3ae8dfba 100644 --- a/app/Http/Controller/RedisController.php +++ b/app/Http/Controller/RedisController.php @@ -40,7 +40,13 @@ public function poolSet(): array $get = $this->redis->get($key); - return [$get, $value]; + $isError = $this->redis->call(function (\Redis $redis) { + $redis->eval('returnxxxx 1'); + + return $redis->getLastError(); + }); + + return [$get, $value, $isError]; } /** @@ -73,9 +79,16 @@ public function str(): array $keyVal = Redis::get($key); + $isError = Redis::call(function (\Redis $redis) { + $redis->eval('return 1'); + + return $redis->getLastError(); + }); + $data = [ $result, - $keyVal + $keyVal, + $isError ]; return $data; diff --git a/app/Listener/RanListener.php b/app/Listener/RanListener.php index 829ce42c..aa235707 100644 --- a/app/Listener/RanListener.php +++ b/app/Listener/RanListener.php @@ -56,9 +56,7 @@ public function getRawSql(string $sql, array $bindings, Connection $connection) return $sql; } foreach ($bindings as $name => $value) { - if (is_string($name) && strncmp(':', $name, 1)) { - $name = ':' . $name; - } else { + if (is_int($name)) { $name = '?'; } diff --git a/app/Process/MonitorProcess.php b/app/Process/MonitorProcess.php index d9b1650a..2af256ad 100644 --- a/app/Process/MonitorProcess.php +++ b/app/Process/MonitorProcess.php @@ -36,4 +36,4 @@ public function run(Process $process): void { $this->logic->monitor($process); } -} \ No newline at end of file +} diff --git a/app/Process/Worker1Process.php b/app/Process/Worker1Process.php index c802ff73..b90a6969 100644 --- a/app/Process/Worker1Process.php +++ b/app/Process/Worker1Process.php @@ -31,4 +31,4 @@ public function run(Pool $pool, int $workerId): void Coroutine::sleep(3); } } -} \ No newline at end of file +} diff --git a/app/Process/Worker2Process.php b/app/Process/Worker2Process.php index a811174f..a4bd00ce 100644 --- a/app/Process/Worker2Process.php +++ b/app/Process/Worker2Process.php @@ -45,4 +45,4 @@ public function run(Pool $pool, int $workerId): void Coroutine::sleep(3); } } -} \ No newline at end of file +} From 1623528e2186070df4223b789b23d2a952a18026 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Thu, 18 Jul 2019 20:23:20 +0800 Subject: [PATCH 031/211] Add Listener test --- app/Listener/Test/ShutDownListener.php | 31 +++++++++++++++++++++++ app/Listener/Test/StartListener.php | 31 +++++++++++++++++++++++ app/Listener/Test/TaskProcessListener.php | 29 +++++++++++++++++++++ app/Listener/Test/WorkerStartListener.php | 30 ++++++++++++++++++++++ app/Listener/Test/WorkerStopListener.php | 31 +++++++++++++++++++++++ 5 files changed, 152 insertions(+) create mode 100644 app/Listener/Test/ShutDownListener.php create mode 100644 app/Listener/Test/StartListener.php create mode 100644 app/Listener/Test/TaskProcessListener.php create mode 100644 app/Listener/Test/WorkerStartListener.php create mode 100644 app/Listener/Test/WorkerStopListener.php diff --git a/app/Listener/Test/ShutDownListener.php b/app/Listener/Test/ShutDownListener.php new file mode 100644 index 00000000..f7515cad --- /dev/null +++ b/app/Listener/Test/ShutDownListener.php @@ -0,0 +1,31 @@ + Date: Thu, 18 Jul 2019 22:11:00 +0800 Subject: [PATCH 032/211] update some --- app/Tcp/Controller/DemoController.php | 35 +++++++++++++++++- app/bean.php | 53 ++++++++++++++------------- 2 files changed, 61 insertions(+), 27 deletions(-) diff --git a/app/Tcp/Controller/DemoController.php b/app/Tcp/Controller/DemoController.php index 3c8734a8..b5e635c5 100644 --- a/app/Tcp/Controller/DemoController.php +++ b/app/Tcp/Controller/DemoController.php @@ -4,6 +4,8 @@ use Swoft\Tcp\Server\Annotation\Mapping\TcpController; use Swoft\Tcp\Server\Annotation\Mapping\TcpMapping; +use Swoft\Tcp\Server\Request; +use Swoft\Tcp\Server\Response; /** * Class DemoController @@ -12,19 +14,48 @@ */ class DemoController { + /** + * @TcpMapping("list", root=true) + * @param Response $response + */ + public function list(Response $response): void + { + $response->setData('[list]allow command: list, echo, demo.echo'); + } + /** * @TcpMapping("echo") + * @param Request $request + * @param Response $response + */ + public function index(Request $request, Response $response): void + { + $str = $request->getPackage()->getDataString(); + + $response->setData('[demo.echo]hi, we received your message: ' . $str); + } + + /** + * @TcpMapping("strrev", root=true) + * @param Request $request + * @param Response $response */ - public function index(): void + public function strRev(Request $request, Response $response): void { + $str = $request->getPackage()->getDataString(); + $response->setData(\strrev($str)); } /** * @TcpMapping("echo", root=true) + * @param Request $request + * @param Response $response */ - public function echo(): void + public function echo(Request $request, Response $response): void { + $str = $request->getRawData(); + $response->setData('[echo]hi, we received your message: ' . $str); } } diff --git a/app/bean.php b/app/bean.php index 617b24f0..46cec974 100644 --- a/app/bean.php +++ b/app/bean.php @@ -1,26 +1,26 @@ [ + 'logger' => [ 'flushRequest' => true, 'enable' => false, 'json' => false, ], - 'httpServer' => [ + 'httpServer' => [ 'class' => HttpServer::class, 'port' => 18306, 'listener' => [ @@ -36,50 +36,50 @@ 'task_enable_coroutine' => true ] ], - 'httpDispatcher' => [ + 'httpDispatcher' => [ // Add global http middleware 'middlewares' => [ // Allow use @View tag \Swoft\View\Middleware\ViewMiddleware::class, ], ], - 'db' => [ + 'db' => [ 'class' => Database::class, 'dsn' => 'mysql:dbname=test;host=192.168.4.11', 'username' => 'root', 'password' => 'swoft123456', ], - 'db2' => [ + 'db2' => [ 'class' => Database::class, 'dsn' => 'mysql:dbname=test2;host=192.168.4.11', 'username' => 'root', 'password' => 'swoft123456', 'dbSelector' => bean(DbSelector::class) ], - 'db2.pool' => [ + 'db2.pool' => [ 'class' => Pool::class, 'database' => bean('db2') ], - 'db3' => [ + 'db3' => [ 'class' => Database::class, 'dsn' => 'mysql:dbname=test2;host=192.168.4.11', 'username' => 'root', 'password' => 'swoft123456' ], - 'db3.pool' => [ + 'db3.pool' => [ 'class' => Pool::class, 'database' => bean('db3') ], - 'migrationManager' => [ + 'migrationManager' => [ 'migrationPath' => '@app/Migration', ], - 'redis' => [ + 'redis' => [ 'class' => RedisDb::class, 'host' => '127.0.0.1', 'port' => 6379, 'database' => 0, ], - 'user' => [ + 'user' => [ 'class' => ServiceClient::class, 'host' => '127.0.0.1', 'port' => 18307, @@ -91,16 +91,16 @@ ], 'packet' => bean('rpcClientPacket') ], - 'user.pool' => [ + 'user.pool' => [ 'class' => ServicePool::class, 'client' => bean('user') ], - 'rpcServer' => [ + 'rpcServer' => [ 'class' => ServiceServer::class, ], - 'wsServer' => [ + 'wsServer' => [ 'class' => WebSocketServer::class, - 'port' => 18308, + 'port' => 18308, 'on' => [ // Enable http handle SwooleEvent::REQUEST => bean(RequestListener::class), @@ -111,13 +111,16 @@ 'log_file' => alias('@runtime/swoole.log'), ], ], - 'tcpServer' => [ - 'port' => 18309, + 'tcpServer' => [ + 'port' => 18309, + 'debug' => 1, ], + /** @see \Swoft\Tcp\Protocol */ 'tcpServerProtocol' => [ - 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, + 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, + // 'openLengthCheck' => true, ], - 'cliRouter' => [ + 'cliRouter' => [ // 'disabledGroups' => ['demo', 'test'], ] ]; From 840aab9ba8f030ec00f057b08e58f4e39d16fca8 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Thu, 18 Jul 2019 23:15:23 +0800 Subject: [PATCH 033/211] add --- app/bean.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/bean.php b/app/bean.php index 670d86ec..83d87c64 100644 --- a/app/bean.php +++ b/app/bean.php @@ -84,13 +84,8 @@ 'host' => '127.0.0.1', 'port' => 6379, 'database' => 0, -<<<<<<< HEAD 'option' => [ - 'prefix' => 'swoft:prefix:' -======= - 'option' => [ - 'prefix' => "swoft" ->>>>>>> 31b0690969adf32c1a57c7c63a21052f6c377f91 + 'prefix' => 'swoft:' ] ], 'user' => [ From 46f6c3e2fea791552f325bd94ea046061f22f523 Mon Sep 17 00:00:00 2001 From: inhere Date: Thu, 18 Jul 2019 23:41:54 +0800 Subject: [PATCH 034/211] update home page --- .editorconfig | 2 +- resource/views/home/index.php | 401 ++++++++++++++++++++-------------- 2 files changed, 236 insertions(+), 167 deletions(-) diff --git a/.editorconfig b/.editorconfig index b59a85f8..8a4c76fa 100644 --- a/.editorconfig +++ b/.editorconfig @@ -16,6 +16,6 @@ trim_trailing_whitespace = false [*.php] indent_size = 4 -[resource/views/*.php] +[resource/views/*/*.php] indent_size = 2 diff --git a/resource/views/home/index.php b/resource/views/home/index.php index 2bd08446..b69d4055 100644 --- a/resource/views/home/index.php +++ b/resource/views/home/index.php @@ -1,175 +1,244 @@ - - - - Swoft Framework 2.0 - + + + + Swoft Framework 2.0 - PHP microservices coroutine framework +
-

Swoft Framework

+ +
+

Swoft Framework + 2.x +

+
+ From e7eb4205977d1d8be662d9e65c0f499c2773a361 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Thu, 18 Jul 2019 23:55:08 +0800 Subject: [PATCH 035/211] Add push --- app/Console/Command/TestCommand.php | 2 +- app/Listener/RanListener.php | 2 +- app/bean.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Console/Command/TestCommand.php b/app/Console/Command/TestCommand.php index 8130b7c5..8a113171 100644 --- a/app/Console/Command/TestCommand.php +++ b/app/Console/Command/TestCommand.php @@ -104,7 +104,7 @@ private function uris(): array '/rpc/getList', '/rpc/returnBool', '/rpc/bigString', - '/rpc/sendBigString', +// '/rpc/sendBigString', '/rpc/returnNull' ], 'co' => [ diff --git a/app/Listener/RanListener.php b/app/Listener/RanListener.php index aa235707..6bf3a49e 100644 --- a/app/Listener/RanListener.php +++ b/app/Listener/RanListener.php @@ -36,7 +36,7 @@ public function handle(EventInterface $event): void $rawSql = $this->getRawSql($querySql, $bindings, $connection); - output()->info($rawSql); +// output()->info($rawSql); } /** diff --git a/app/bean.php b/app/bean.php index 83d87c64..5f3398b8 100644 --- a/app/bean.php +++ b/app/bean.php @@ -18,8 +18,8 @@ return [ 'logger' => [ - 'flushRequest' => true, - 'enable' => true, + 'flushRequest' => false, + 'enable' => false, 'json' => false, ], 'httpServer' => [ From 1dbdec54aec6e0e6dfa887e4ee2b8d83377609fc Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Fri, 19 Jul 2019 19:29:04 +0800 Subject: [PATCH 036/211] Add process --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 1d0aec11..10a6985c 100644 --- a/composer.json +++ b/composer.json @@ -25,6 +25,7 @@ "swoft/rpc-server": "~2.0.0", "swoft/websocket-server": "~2.0.0", "swoft/tcp-server": "~2.0.0", + "swoft/process": "~2.0.0", "swoft/apollo": "~2.0.0", "swoft/consul": "~2.0.0", "swoft/limiter": "~2.0.0", From 8d81583449194727cb207d449c3169eb1d5bac1d Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Fri, 19 Jul 2019 19:33:34 +0800 Subject: [PATCH 037/211] Modify swoole version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4eb911d5..375286a2 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![Build Status](https://travis-ci.org/swoft-cloud/swoft.svg?branch=master)](https://travis-ci.org/swoft-cloud/swoft) [![Docker Build Status](https://img.shields.io/docker/build/swoft/swoft.svg)](https://hub.docker.com/r/swoft/swoft/) [![Php Version](https://img.shields.io/badge/php-%3E=7.1-brightgreen.svg?maxAge=2592000)](https://secure.php.net/) -[![Swoole Version](https://img.shields.io/badge/swoole-%3E=4.3.3-brightgreen.svg?maxAge=2592000)](https://github.com/swoole/swoole-src) +[![Swoole Version](https://img.shields.io/badge/swoole-%3E=4.4.1-brightgreen.svg?maxAge=2592000)](https://github.com/swoole/swoole-src) [![Swoft Doc](https://img.shields.io/badge/docs-passing-green.svg?maxAge=2592000)](https://www.swoft.org/docs) [![Swoft License](https://img.shields.io/hexpm/l/plug.svg?maxAge=2592000)](https://github.com/swoft-cloud/swoft/blob/master/LICENSE) [![Gitter](https://img.shields.io/gitter/room/swoft-cloud/swoft.svg)](https://gitter.im/swoft-cloud/community) From 446589e5df5b8d4f13e728e167bc8b73c1438b2c Mon Sep 17 00:00:00 2001 From: Inhere Date: Fri, 19 Jul 2019 20:54:11 +0800 Subject: [PATCH 038/211] upgrade swoole to 4.4.1 --- Dockerfile | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8bec0c16..91cae2fd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,14 +23,11 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"prod"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=4.3.0 \ - SWOOLE_VERSION=4.3.5 \ + SWOOLE_VERSION=4.4.1 \ COMPOSER_ALLOW_SUPERUSER=1 -# Timezone -RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ - && echo 'Asia/Shanghai' > /etc/timezone \ # Libs -y --no-install-recommends - && apt-get update \ +RUN apt-get update \ && apt-get install -y \ curl wget git zip unzip less vim openssl \ libz-dev \ From 22e7a906527314f470fa4d2863cb00592f4081d8 Mon Sep 17 00:00:00 2001 From: inhere Date: Thu, 25 Jul 2019 19:49:08 +0800 Subject: [PATCH 039/211] update some for tcp demo --- app/Tcp/Controller/DemoController.php | 6 ++++-- app/bean.php | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/Tcp/Controller/DemoController.php b/app/Tcp/Controller/DemoController.php index b5e635c5..e0f0a629 100644 --- a/app/Tcp/Controller/DemoController.php +++ b/app/Tcp/Controller/DemoController.php @@ -6,6 +6,7 @@ use Swoft\Tcp\Server\Annotation\Mapping\TcpMapping; use Swoft\Tcp\Server\Request; use Swoft\Tcp\Server\Response; +use function strrev; /** * Class DemoController @@ -44,7 +45,7 @@ public function strRev(Request $request, Response $response): void { $str = $request->getPackage()->getDataString(); - $response->setData(\strrev($str)); + $response->setData(strrev($str)); } /** @@ -54,7 +55,8 @@ public function strRev(Request $request, Response $response): void */ public function echo(Request $request, Response $response): void { - $str = $request->getRawData(); + // $str = $request->getRawData(); + $str = $request->getPackage()->getDataString(); $response->setData('[echo]hi, we received your message: ' . $str); } diff --git a/app/bean.php b/app/bean.php index 5f3398b8..5a715efd 100644 --- a/app/bean.php +++ b/app/bean.php @@ -126,7 +126,8 @@ ], /** @see \Swoft\Tcp\Protocol */ 'tcpServerProtocol' => [ - 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, + 'type' => \Swoft\Tcp\Packer\JsonPacker::TYPE, + // 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, // 'openLengthCheck' => true, ], 'cliRouter' => [ From ac835dc84cf1a43e795cc036585e2cd399f695e1 Mon Sep 17 00:00:00 2001 From: inhere Date: Thu, 25 Jul 2019 19:54:03 +0800 Subject: [PATCH 040/211] format some code --- app/AutoLoader.php | 4 +--- app/Exception/Handler/ApiExceptionHandler.php | 7 +++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/AutoLoader.php b/app/AutoLoader.php index 8e72de28..c04475c2 100644 --- a/app/AutoLoader.php +++ b/app/AutoLoader.php @@ -1,9 +1,7 @@ sprintf('At %s line %d', $except->getFile(), $except->getLine()), 'trace' => $except->getTraceAsString(), ]; - return $response->withData($data); + + return $response->withData($data); } } From b35fa285bdf1353a57136995c85433a50e10700e Mon Sep 17 00:00:00 2001 From: inhere Date: Thu, 25 Jul 2019 20:54:11 +0800 Subject: [PATCH 041/211] log error message on http error --- app/Exception/Handler/HttpExceptionHandler.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Exception/Handler/HttpExceptionHandler.php b/app/Exception/Handler/HttpExceptionHandler.php index 19571b3f..10d22edd 100644 --- a/app/Exception/Handler/HttpExceptionHandler.php +++ b/app/Exception/Handler/HttpExceptionHandler.php @@ -11,6 +11,7 @@ use Swoft\Http\Message\Response; use Swoft\Http\Server\Exception\Handler\AbstractHttpErrorHandler; use Swoft\Log\Helper\CLog; +use Swoft\Log\Helper\Log; use Throwable; /** @@ -31,6 +32,7 @@ class HttpExceptionHandler extends AbstractHttpErrorHandler public function handle(Throwable $e, Response $response): Response { // Log + Log::error($e->getMessage()); CLog::error($e->getMessage()); // Debug is false From 32c76d1fa09744bf34f171fda479709b912dc4a1 Mon Sep 17 00:00:00 2001 From: inhere Date: Thu, 25 Jul 2019 23:09:11 +0800 Subject: [PATCH 042/211] add an default http middleware --- app/Http/Middleware/ControllerMiddleware.php | 10 ------ app/Http/Middleware/FavIconMiddleware.php | 38 ++++++++++++++++++++ app/bean.php | 1 + 3 files changed, 39 insertions(+), 10 deletions(-) delete mode 100644 app/Http/Middleware/ControllerMiddleware.php create mode 100644 app/Http/Middleware/FavIconMiddleware.php diff --git a/app/Http/Middleware/ControllerMiddleware.php b/app/Http/Middleware/ControllerMiddleware.php deleted file mode 100644 index d6097b5e..00000000 --- a/app/Http/Middleware/ControllerMiddleware.php +++ /dev/null @@ -1,10 +0,0 @@ -getUriPath() === '/favicon.ico') { + return context()->getResponse()->withStatus(404); + } + + return $handler->handle($request); + } +} diff --git a/app/bean.php b/app/bean.php index 5a715efd..ae7d54ca 100644 --- a/app/bean.php +++ b/app/bean.php @@ -45,6 +45,7 @@ 'httpDispatcher' => [ // Add global http middleware 'middlewares' => [ + \App\Http\Middleware\FavIconMiddleware::class, // Allow use @View tag \Swoft\View\Middleware\ViewMiddleware::class, ], From cfa8cea07337ba8631e98a413f57ac66825044b7 Mon Sep 17 00:00:00 2001 From: inhere Date: Thu, 25 Jul 2019 23:58:36 +0800 Subject: [PATCH 043/211] update some --- app/Http/Middleware/FavIconMiddleware.php | 1 - resource/views/home/index.php | 41 ++++++++++++++++++++--- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/app/Http/Middleware/FavIconMiddleware.php b/app/Http/Middleware/FavIconMiddleware.php index 1ae2ea80..3e149ae9 100644 --- a/app/Http/Middleware/FavIconMiddleware.php +++ b/app/Http/Middleware/FavIconMiddleware.php @@ -1,6 +1,5 @@ @@ -227,7 +260,7 @@
-

Swoft Framework +

Swoft Framework 2.x

From 423472bddb3042901bf0ab7c7ac8b8f4572b7c7e Mon Sep 17 00:00:00 2001 From: Inhere Date: Mon, 29 Jul 2019 17:07:21 +0800 Subject: [PATCH 044/211] upgrade swoole to 4.4.2 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 91cae2fd..1b210d38 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"prod"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=4.3.0 \ - SWOOLE_VERSION=4.4.1 \ + SWOOLE_VERSION=4.4.2 \ COMPOSER_ALLOW_SUPERUSER=1 # Libs -y --no-install-recommends From 2539a3e787ad62d2e8fc49652dbdcd905e8571ec Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Tue, 30 Jul 2019 17:47:17 +0800 Subject: [PATCH 045/211] Add timer dmeo --- app/Http/Controller/TimerController.php | 79 +++++++++++++++++++++++++ app/bean.php | 10 ++-- 2 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 app/Http/Controller/TimerController.php diff --git a/app/Http/Controller/TimerController.php b/app/Http/Controller/TimerController.php new file mode 100644 index 00000000..d8378a8b --- /dev/null +++ b/app/Http/Controller/TimerController.php @@ -0,0 +1,79 @@ +setAge(mt_rand(1, 100)); + $user->setUserDesc('desc'); + + $user->save(); + $id = $user->getId(); + + Redis::set("$id", $user->toArray()); + Log::info("用户ID=" . $id . " timerId=" . $timerId); + sgo(function () use ($id) { + $user = User::find($id)->toArray(); + Log::info(JsonHelper::encode($user)); + Redis::del("$id"); + }); + }); + + return ['after']; + } + + /** + * @RequestMapping() + * + * @return array + * @throws Exception + */ + public function tick(): array + { + Timer::tick(3 * 1000, function (int $timerId) { + $user = new User(); + $user->setAge(mt_rand(1, 100)); + $user->setUserDesc('desc'); + + $user->save(); + $id = $user->getId(); + + Redis::set("$id", $user->toArray()); + Log::info("用户ID=" . $id . " timerId=" . $timerId); + sgo(function () use ($id) { + $user = User::find($id)->toArray(); + Log::info(JsonHelper::encode($user)); + Redis::del("$id"); + }); + }); + + return ['tick']; + } +} \ No newline at end of file diff --git a/app/bean.php b/app/bean.php index 5f3398b8..f76083a5 100644 --- a/app/bean.php +++ b/app/bean.php @@ -18,8 +18,8 @@ return [ 'logger' => [ - 'flushRequest' => false, - 'enable' => false, + 'flushRequest' => true, + 'enable' => true, 'json' => false, ], 'httpServer' => [ @@ -51,13 +51,13 @@ ], 'db' => [ 'class' => Database::class, - 'dsn' => 'mysql:dbname=test;host=172.17.0.2', + 'dsn' => 'mysql:dbname=test;host=127.0.0.1', 'username' => 'root', 'password' => 'swoft123456', ], 'db2' => [ 'class' => Database::class, - 'dsn' => 'mysql:dbname=test2;host=172.17.0.2', + 'dsn' => 'mysql:dbname=test2;host=127.0.0.1', 'username' => 'root', 'password' => 'swoft123456', 'dbSelector' => bean(DbSelector::class) @@ -68,7 +68,7 @@ ], 'db3' => [ 'class' => Database::class, - 'dsn' => 'mysql:dbname=test2;host=172.17.0.2', + 'dsn' => 'mysql:dbname=test2;host=127.0.0.1', 'username' => 'root', 'password' => 'swoft123456' ], From 376346e3ad4935a027813ad44579efe90e3fa109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Sz=C3=A9pe?= Date: Wed, 31 Jul 2019 05:01:55 +0000 Subject: [PATCH 046/211] Introduce PHPStan --- .travis.yml | 4 +++- app/Console/Command/AgentCommand.php | 2 +- app/Http/Controller/BeanController.php | 2 +- app/Http/Controller/DbModelController.php | 2 +- app/Http/Controller/RespController.php | 2 +- app/Listener/DeregisterServiceListener.php | 2 +- app/Listener/ModelSavedListener.php | 2 +- app/Listener/RanListener.php | 2 +- app/Listener/RegisterServiceListener.php | 2 +- app/Listener/UserSavingListener.php | 2 +- app/WebSocket/Chat/HomeController.php | 4 ++-- composer.json | 5 ++++- phpstan.neon.dist | 16 ++++++++++++++++ test/bootstrap.php | 1 + 14 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 phpstan.neon.dist diff --git a/.travis.yml b/.travis.yml index 07ca29df..d4cd3523 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,10 @@ php: - 7.1 - 7.2 - 7.3 + services: - redis + install: - echo 'no' | pecl install -f redis - wget https://github.com/swoole/swoole-src/archive/v4.3.3.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - @@ -13,8 +15,8 @@ install: before_script: - composer config -g process-timeout 900 && composer update + - composer require --dev phpstan/phpstan-shim - phpenv config-rm xdebug.ini - script: - composer test diff --git a/app/Console/Command/AgentCommand.php b/app/Console/Command/AgentCommand.php index 86fec6e1..2e9819e7 100644 --- a/app/Console/Command/AgentCommand.php +++ b/app/Console/Command/AgentCommand.php @@ -76,7 +76,7 @@ public function updateConfigFile(array $data): void // $server = bean('rpcServer'); // $server->restart(); - /* @var WebSocketServer $server */ + /** @var WebSocketServer $server */ $server = bean('wsServer'); $server->restart(); } diff --git a/app/Http/Controller/BeanController.php b/app/Http/Controller/BeanController.php index 5dc0d584..b9610e5f 100644 --- a/app/Http/Controller/BeanController.php +++ b/app/Http/Controller/BeanController.php @@ -32,7 +32,7 @@ public function request(): array { $id = (string)Co::tid(); - /* @var RequestBean $request*/ + /** @var RequestBean $request*/ $request = BeanFactory::getRequestBean('requestBean', $id); return $request->getData(); } diff --git a/app/Http/Controller/DbModelController.php b/app/Http/Controller/DbModelController.php index 0728feb6..6f5fc97c 100644 --- a/app/Http/Controller/DbModelController.php +++ b/app/Http/Controller/DbModelController.php @@ -130,7 +130,7 @@ public function batchUpdate() $users = User::find(array_column($values, 'id')); $updateResults = []; - /* @var User $user */ + /** @var User $user */ foreach ($users as $user) { $updateResults[$user->getId()] = true; if ($user->getAge() != $values[$user->getId()]['age']) { diff --git a/app/Http/Controller/RespController.php b/app/Http/Controller/RespController.php index 5527b754..0afa02d6 100644 --- a/app/Http/Controller/RespController.php +++ b/app/Http/Controller/RespController.php @@ -24,7 +24,7 @@ class RespController */ public function cookie(): Response { - /* @var Response $resp */ + /** @var Response $resp */ $resp = Context::mustGet()->getResponse(); return $resp->setCookie('c-name', 'c-value')->withData(['hello']); diff --git a/app/Listener/DeregisterServiceListener.php b/app/Listener/DeregisterServiceListener.php index 5aab5a6b..84ebee42 100644 --- a/app/Listener/DeregisterServiceListener.php +++ b/app/Listener/DeregisterServiceListener.php @@ -44,7 +44,7 @@ class DeregisterServiceListener implements EventHandlerInterface */ public function handle(EventInterface $event): void { - /* @var HttpServer $httpServer */ + /** @var HttpServer $httpServer */ $httpServer = $event->getTarget(); // $this->agent->deregisterService('swoft'); diff --git a/app/Listener/ModelSavedListener.php b/app/Listener/ModelSavedListener.php index 0741ff82..d9cc9be0 100644 --- a/app/Listener/ModelSavedListener.php +++ b/app/Listener/ModelSavedListener.php @@ -24,7 +24,7 @@ class ModelSavedListener implements EventHandlerInterface */ public function handle(EventInterface $event): void { - /* @var Model $modelStatic */ + /** @var Model $modelStatic */ $modelStatic = $event->getTarget(); if ($modelStatic instanceof User) { diff --git a/app/Listener/RanListener.php b/app/Listener/RanListener.php index 6bf3a49e..c1c5bcea 100644 --- a/app/Listener/RanListener.php +++ b/app/Listener/RanListener.php @@ -28,7 +28,7 @@ class RanListener implements EventHandlerInterface */ public function handle(EventInterface $event): void { - /* @var Connection $connection */ + /** @var Connection $connection */ $connection = $event->getTarget(); $querySql = $event->getParam(0); diff --git a/app/Listener/RegisterServiceListener.php b/app/Listener/RegisterServiceListener.php index e7e1f90a..24c84089 100644 --- a/app/Listener/RegisterServiceListener.php +++ b/app/Listener/RegisterServiceListener.php @@ -36,7 +36,7 @@ class RegisterServiceListener implements EventHandlerInterface */ public function handle(EventInterface $event): void { - /* @var HttpServer $httpServer */ + /** @var HttpServer $httpServer */ $httpServer = $event->getTarget(); $service = [ diff --git a/app/Listener/UserSavingListener.php b/app/Listener/UserSavingListener.php index cf278e4f..d92b01a6 100644 --- a/app/Listener/UserSavingListener.php +++ b/app/Listener/UserSavingListener.php @@ -23,7 +23,7 @@ class UserSavingListener implements EventHandlerInterface public function handle(EventInterface $event): void { - /* @var User $user */ + /** @var User $user */ $user = $event->getTarget(); /** diff --git a/app/WebSocket/Chat/HomeController.php b/app/WebSocket/Chat/HomeController.php index ef2ac788..6360cb0d 100644 --- a/app/WebSocket/Chat/HomeController.php +++ b/app/WebSocket/Chat/HomeController.php @@ -27,7 +27,7 @@ public function index(): void /** * Message command is: 'home.echo' * - * @param $data + * @param string $data * @MessageMapping() */ public function echo($data): void @@ -38,7 +38,7 @@ public function echo($data): void /** * Message command is: 'home.ar' * - * @param $data + * @param string $data * @MessageMapping("ar") * * @return string diff --git a/composer.json b/composer.json index 10a6985c..8eeb1c02 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,10 @@ "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], - "test": "./vendor/bin/phpunit -c phpunit.xml", + "test": [ + "./vendor/bin/phpstan analyze", + "./vendor/bin/phpunit -c phpunit.xml", + ], "cs-fix": "./vendor/bin/php-cs-fixer fix $1" } } diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 100644 index 00000000..458cf0ce --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1,16 @@ +includes: + - phar://phpstan.phar/conf/bleedingEdge.neon +parameters: + level: max + inferPrivatePropertyTypeFromConstructor: true + paths: + - %currentWorkingDirectory%/app/ + autoload_files: + - %currentWorkingDirectory%/test/bootstrap.php + autoload_directories: + - %currentWorkingDirectory%/vendor/swoft/swoole-ide-helper/src/namespace/ + dynamicConstantNames: + - APP_DEBUG + ignoreErrors: + # Variable type + - '#^Call to an undefined method Swoft\\Contract\\ContextInterface::get\S+\(\)\.$#' diff --git a/test/bootstrap.php b/test/bootstrap.php index a4abe2da..ba7b26ad 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -1,2 +1,3 @@ Date: Wed, 31 Jul 2019 05:04:45 +0000 Subject: [PATCH 047/211] Fix composer typo --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8eeb1c02..7d44d5bf 100644 --- a/composer.json +++ b/composer.json @@ -56,7 +56,7 @@ ], "test": [ "./vendor/bin/phpstan analyze", - "./vendor/bin/phpunit -c phpunit.xml", + "./vendor/bin/phpunit -c phpunit.xml" ], "cs-fix": "./vendor/bin/php-cs-fixer fix $1" } From e94e2d07948a9d5c3210768f8e1035c93201ebdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Sz=C3=A9pe?= Date: Thu, 1 Aug 2019 05:36:20 +0200 Subject: [PATCH 048/211] Ignore current 17 static analysis errors @inhere https://github.com/swoft-cloud/swoft/pull/864#issuecomment-516722647 --- phpstan.neon.dist | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 458cf0ce..4a69c118 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -14,3 +14,40 @@ parameters: ignoreErrors: # Variable type - '#^Call to an undefined method Swoft\\Contract\\ContextInterface::get\S+\(\)\.$#' + # These are ignored for now + - + path: %currentWorkingDirectory%/app/Exception/Handler/WsMessageExceptionHandler.php + message: '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' + - + path: %currentWorkingDirectory%/app/Http/Controller/DbModelController.php + message: '#^Method App\\Http\\Controller\\DbModelController::getId\(\) should return int but returns int\|null\.$#' + - + path: %currentWorkingDirectory%/app/Http/Controller/DbModelController.php + message: '#^Argument of an invalid type App\\Model\\Entity\\User supplied for foreach, only iterables are supported\.$#' + - + path: %currentWorkingDirectory%/app/Http/Controller/DbTransactionController.php + message: '#^Method App\\Http\\Controller\\DbTransactionController::getId\(\) should return int but returns int\|null\.$#' + - + path: %currentWorkingDirectory%/app/Http/Controller/RpcController.php + message: '#^Unreachable statement - code above always terminates\.$#' + - + path: %currentWorkingDirectory%/app/Http/Controller/SelectDbController.php + message: '#^Method App\\Http\\Controller\\SelectDbController::getId\(\) should return int but returns int\|null\.$#' + - + path: %currentWorkingDirectory%/app/Http/Controller/ValidatorController.php + message: '#^Method App\\Http\\Controller\\ValidatorController::(validateAll|validateType|validatePassword|validateCustomer)\(\) should return array but returns array\|object\|null\.$#' + - + path: %currentWorkingDirectory%/app/Task/Task/SyncTask.php + message: '#^Method App\\Task\\Task\\SyncTask::testNull\(\) should return bool but returns null\.$#' + - + path: %currentWorkingDirectory%/app/Validator/Rule/AlphaDashRule.php + message: '#^Call to an undefined method object::getMessage\(\)\.$#' + - + path: %currentWorkingDirectory%/app/WebSocket/Chat/HomeController.php + message: '#^Call to an undefined method Swoft\\Session\\SessionInterface::push\(\)\.$#' + - + path: %currentWorkingDirectory%/app/WebSocket/ChatModule.php + message: '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' + - + path: %currentWorkingDirectory%/app/WebSocket/EchoModule.php + message: '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' From 55d0dfc2561af639ccf4941f4e91e7f49ed221cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Sz=C3=A9pe?= Date: Thu, 1 Aug 2019 04:05:02 +0000 Subject: [PATCH 049/211] Check coding style --- .gitignore | 1 + .travis.yml | 14 ++++++++++---- composer.json | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index fa561a74..c9e57566 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ vendor/ .phpstorm.meta.php .DS_Store public/devtool/ +bin/php-cs-fixer diff --git a/.travis.yml b/.travis.yml index d4cd3523..96b02161 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,14 +9,20 @@ services: - redis install: - - echo 'no' | pecl install -f redis - - wget https://github.com/swoole/swoole-src/archive/v4.3.3.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - - - echo "extension = swoole.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini + - | + echo "no" | pecl install -f redis + - | + wget https://github.com/swoole/swoole-src/archive/v4.3.3.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - + echo "extension = swoole.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini + - | + wget -O bin/php-cs-fixer "https://cs.symfony.com/download/php-cs-fixer-v2.phar" + chmod +x bin/php-cs-fixer before_script: + - phpenv config-rm xdebug.ini - composer config -g process-timeout 900 && composer update - composer require --dev phpstan/phpstan-shim - - phpenv config-rm xdebug.ini script: + - composer cs-fix - composer test diff --git a/composer.json b/composer.json index 7d44d5bf..08654cc2 100644 --- a/composer.json +++ b/composer.json @@ -58,6 +58,6 @@ "./vendor/bin/phpstan analyze", "./vendor/bin/phpunit -c phpunit.xml" ], - "cs-fix": "./vendor/bin/php-cs-fixer fix $1" + "cs-fix": "./bin/php-cs-fixer fix --dry-run --diff --diff-format=udiff" } } From 416f57f4954a5286d0d2db5b8e7dd6191ef9e6db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Sz=C3=A9pe?= Date: Thu, 1 Aug 2019 04:13:44 +0000 Subject: [PATCH 050/211] Remove swool extension directory as is contains a PHP file breaking php-cs-fixer --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 96b02161..4d7fae11 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ install: - | echo "no" | pecl install -f redis - | - wget https://github.com/swoole/swoole-src/archive/v4.3.3.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - + wget https://github.com/swoole/swoole-src/archive/v4.3.3.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - && rm -rf swoole echo "extension = swoole.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - | wget -O bin/php-cs-fixer "https://cs.symfony.com/download/php-cs-fixer-v2.phar" From b51c6224e4afeb21285c9dbe623111e568f65cc9 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Thu, 1 Aug 2019 16:02:15 +0800 Subject: [PATCH 051/211] Add request demo --- app/Console/Command/TestCommand.php | 3 ++- app/Http/Controller/BeanController.php | 19 ++++++++++++++++++- app/Model/Logic/RequestBeanTwo.php | 24 ++++++++++++++++++++++++ app/bean.php | 4 ++-- composer.json | 2 ++ 5 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 app/Model/Logic/RequestBeanTwo.php diff --git a/app/Console/Command/TestCommand.php b/app/Console/Command/TestCommand.php index 8a113171..90b4b666 100644 --- a/app/Console/Command/TestCommand.php +++ b/app/Console/Command/TestCommand.php @@ -111,7 +111,8 @@ private function uris(): array '/co/multi' ], 'bean' => [ - '/bean/request' + '/bean/request', + '/bean/requestClass' ], 'breaker' => [ '/breaker/unbreak', diff --git a/app/Http/Controller/BeanController.php b/app/Http/Controller/BeanController.php index 5dc0d584..f08ae817 100644 --- a/app/Http/Controller/BeanController.php +++ b/app/Http/Controller/BeanController.php @@ -4,6 +4,7 @@ namespace App\Http\Controller; use App\Model\Logic\RequestBean; +use App\Model\Logic\RequestBeanTwo; use ReflectionException; use Swoft\Bean\Annotation\Mapping\Bean; use Swoft\Bean\BeanFactory; @@ -32,8 +33,24 @@ public function request(): array { $id = (string)Co::tid(); - /* @var RequestBean $request*/ + /* @var RequestBean $request */ $request = BeanFactory::getRequestBean('requestBean', $id); return $request->getData(); } + + /** + * @return array + * @throws ContainerException + * @throws ReflectionException + * + * @RequestMapping() + */ + public function requestClass(): array + { + $id = (string)Co::tid(); + + /* @var RequestBeanTwo $request */ + $request = BeanFactory::getRequestBean(RequestBeanTwo::class, $id); + return $request->getData(); + } } \ No newline at end of file diff --git a/app/Model/Logic/RequestBeanTwo.php b/app/Model/Logic/RequestBeanTwo.php new file mode 100644 index 00000000..8243d822 --- /dev/null +++ b/app/Model/Logic/RequestBeanTwo.php @@ -0,0 +1,24 @@ + [ - 'flushRequest' => true, - 'enable' => true, + 'flushRequest' => false, + 'enable' => false, 'json' => false, ], 'httpServer' => [ diff --git a/composer.json b/composer.json index 10a6985c..ac3f41dd 100644 --- a/composer.json +++ b/composer.json @@ -13,6 +13,8 @@ "ext-pdo": "*", "ext-redis": "*", "ext-json": "*", + "ext-simplexml": "*", + "ext-libxml": "*", "ext-mbstring": "*", "swoft/db": "~2.0.0", "swoft/i18n": "~2.0.0", From 7c410e45b2d3d5fb7b48f3c910c48b0d53907601 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Thu, 1 Aug 2019 16:25:47 +0800 Subject: [PATCH 052/211] Validator not must --- app/bean.php | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/app/bean.php b/app/bean.php index ac1f2663..30b5b0c2 100644 --- a/app/bean.php +++ b/app/bean.php @@ -17,18 +17,18 @@ use Swoft\Redis\RedisDb; return [ - 'logger' => [ + 'logger' => [ 'flushRequest' => false, 'enable' => false, 'json' => false, ], - 'httpServer' => [ + 'httpServer' => [ 'class' => HttpServer::class, 'port' => 18306, 'listener' => [ 'rpc' => bean('rpcServer') ], - 'process' => [ + 'process' => [ // 'monitor' => bean(MonitorProcess::class) ], 'on' => [ @@ -42,53 +42,56 @@ 'task_enable_coroutine' => true ] ], - 'httpDispatcher' => [ + 'httpDispatcher' => [ // Add global http middleware - 'middlewares' => [ + 'middlewares' => [ // Allow use @View tag \Swoft\View\Middleware\ViewMiddleware::class, ], + 'afterMiddlewares' => [ + \Swoft\Http\Server\Middleware\ValidatorMiddleware::class + ] ], - 'db' => [ + 'db' => [ 'class' => Database::class, 'dsn' => 'mysql:dbname=test;host=127.0.0.1', 'username' => 'root', 'password' => 'swoft123456', ], - 'db2' => [ + 'db2' => [ 'class' => Database::class, 'dsn' => 'mysql:dbname=test2;host=127.0.0.1', 'username' => 'root', 'password' => 'swoft123456', 'dbSelector' => bean(DbSelector::class) ], - 'db2.pool' => [ + 'db2.pool' => [ 'class' => Pool::class, 'database' => bean('db2') ], - 'db3' => [ + 'db3' => [ 'class' => Database::class, 'dsn' => 'mysql:dbname=test2;host=127.0.0.1', 'username' => 'root', 'password' => 'swoft123456' ], - 'db3.pool' => [ + 'db3.pool' => [ 'class' => Pool::class, 'database' => bean('db3') ], - 'migrationManager' => [ + 'migrationManager' => [ 'migrationPath' => '@app/Migration', ], - 'redis' => [ + 'redis' => [ 'class' => RedisDb::class, 'host' => '127.0.0.1', 'port' => 6379, 'database' => 0, - 'option' => [ + 'option' => [ 'prefix' => 'swoft:' ] ], - 'user' => [ + 'user' => [ 'class' => ServiceClient::class, 'host' => '127.0.0.1', 'port' => 18307, @@ -100,14 +103,14 @@ ], 'packet' => bean('rpcClientPacket') ], - 'user.pool' => [ + 'user.pool' => [ 'class' => ServicePool::class, 'client' => bean('user') ], - 'rpcServer' => [ + 'rpcServer' => [ 'class' => ServiceServer::class, ], - 'wsServer' => [ + 'wsServer' => [ 'class' => WebSocketServer::class, 'port' => 18308, 'on' => [ @@ -126,7 +129,7 @@ ], /** @see \Swoft\Tcp\Protocol */ 'tcpServerProtocol' => [ - 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, + 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, // 'openLengthCheck' => true, ], 'cliRouter' => [ From 72824025a0295d17169a895c2569b12577a2904f Mon Sep 17 00:00:00 2001 From: JasonYHZ Date: Fri, 2 Aug 2019 18:24:26 +0800 Subject: [PATCH 053/211] add Crontab Example --- app/Crontab/CronTask.php | 31 +++++++++++++++++++++++++++++++ app/bean.php | 2 ++ 2 files changed, 33 insertions(+) create mode 100644 app/Crontab/CronTask.php diff --git a/app/Crontab/CronTask.php b/app/Crontab/CronTask.php new file mode 100644 index 00000000..75ae2b65 --- /dev/null +++ b/app/Crontab/CronTask.php @@ -0,0 +1,31 @@ + [ @@ -30,6 +31,7 @@ ], 'process' => [ // 'monitor' => bean(MonitorProcess::class) +// 'crontab' => bean(Crontab::class) ], 'on' => [ // SwooleEvent::TASK => bean(SyncTaskListener::class), // Enable sync task From a2fa75e733e058b272202b6842a98cbbf04454aa Mon Sep 17 00:00:00 2001 From: JasonYHZ Date: Fri, 2 Aug 2019 18:26:31 +0800 Subject: [PATCH 054/211] fix code format --- app/Crontab/CronTask.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/Crontab/CronTask.php b/app/Crontab/CronTask.php index 75ae2b65..2e536c3f 100644 --- a/app/Crontab/CronTask.php +++ b/app/Crontab/CronTask.php @@ -1,5 +1,4 @@ - Date: Fri, 2 Aug 2019 20:45:53 +0800 Subject: [PATCH 055/211] import Annotaion --- app/Crontab/CronTask.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Crontab/CronTask.php b/app/Crontab/CronTask.php index 2e536c3f..bc127bc0 100644 --- a/app/Crontab/CronTask.php +++ b/app/Crontab/CronTask.php @@ -2,6 +2,9 @@ namespace App\Crontab; +use Swoft\Crontab\Annotaion\Mapping\Cron; +use Swoft\Crontab\Annotaion\Mapping\Scheduled; + /** * Class CronTask * From f3021296661d6008c2000197337b1b8db7fb9117 Mon Sep 17 00:00:00 2001 From: inhere Date: Sat, 3 Aug 2019 23:46:52 +0800 Subject: [PATCH 056/211] update some ws demo --- app/WebSocket/ChatModule.php | 4 +- app/WebSocket/EchoModule.php | 2 +- app/WebSocket/Test/TestController.php | 121 ++++++++++++++++++++++++++ app/WebSocket/TestModule.php | 33 +++++++ app/bean.php | 8 +- 5 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 app/WebSocket/Test/TestController.php create mode 100644 app/WebSocket/TestModule.php diff --git a/app/WebSocket/ChatModule.php b/app/WebSocket/ChatModule.php index 07cd3177..45b79522 100644 --- a/app/WebSocket/ChatModule.php +++ b/app/WebSocket/ChatModule.php @@ -6,7 +6,7 @@ use Swoft\Http\Message\Request; use Swoft\WebSocket\Server\Annotation\Mapping\OnOpen; use Swoft\WebSocket\Server\Annotation\Mapping\WsModule; -use Swoft\WebSocket\Server\MessageParser\TokenTextParser; +use Swoft\WebSocket\Server\MessageParser\JsonParser; use function server; /** @@ -14,7 +14,7 @@ * * @WsModule( * "/chat", - * messageParser=TokenTextParser::class, + * messageParser=JsonParser::class, * controllers={HomeController::class} * ) */ diff --git a/app/WebSocket/EchoModule.php b/app/WebSocket/EchoModule.php index 0e1dc80a..4aa6ae3f 100644 --- a/app/WebSocket/EchoModule.php +++ b/app/WebSocket/EchoModule.php @@ -13,7 +13,7 @@ /** * Class EchoModule * - * @WsModule() + * @WsModule("echo") */ class EchoModule { diff --git a/app/WebSocket/Test/TestController.php b/app/WebSocket/Test/TestController.php new file mode 100644 index 00000000..c83e9856 --- /dev/null +++ b/app/WebSocket/Test/TestController.php @@ -0,0 +1,121 @@ +push('hi, this is test.index'); + } + + /** + * Message command is: 'test.index' + * @param Message $msg + * + * @return void + * @MessageMapping("close") + */ + public function close(Message $msg): void + { + $data = $msg->getData(); + $conn = Session::mustGet(); + + $fd = \is_numeric($data) ? (int)$data : $conn->getFd(); + + $conn->push("hi, will close conn $fd"); + + // disconnect + \server()->disconnect($fd); + } + + /** + * Message command is: 'test.req' + * + * @param Request $req + * + * @return void + * @MessageMapping("req") + */ + public function injectRequest(Request $req): void + { + $fd = $req->getFd(); + + Session::mustGet()->push("(your FD: $fd)message data: " . \json_encode($req->getMessage()->toArray())); + } + + /** + * Message command is: 'test.msg' + * + * @param Message $msg + * + * @return void + * @MessageMapping("msg") + */ + public function injectMessage(Message $msg): void + { + Session::mustGet()->push('message data: ' . \json_encode($msg->toArray())); + } + + /** + * Message command is: 'echo' + * + * @param $data + * @MessageMapping(root=true) + */ + public function echo($data): void + { + Session::mustGet()->push('(echo)Recv: ' . $data); + } + + /** + * Message command is: 'bin' + * + * @param $data + * @MessageMapping("bin", root=true) + */ + public function binary($data): void + { + Session::mustGet()->push('Binary: ' . $data, \WEBSOCKET_OPCODE_BINARY); + } + + /** + * Message command is: 'ping' + * + * @MessageMapping("ping", root=true) + */ + public function pong(): void + { + Session::mustGet()->push('pong!', \WEBSOCKET_OPCODE_PONG); + } + + /** + * Message command is: 'test.ar' + * + * @param $data + * @MessageMapping("ar") + * + * @return string + */ + public function autoReply($data): string + { + return '(home.ar)Recv: ' . $data; + } +} diff --git a/app/WebSocket/TestModule.php b/app/WebSocket/TestModule.php new file mode 100644 index 00000000..10dfde70 --- /dev/null +++ b/app/WebSocket/TestModule.php @@ -0,0 +1,33 @@ +push($request->getFd(), "Opened, welcome!(FD: $fd)"); + } +} diff --git a/app/bean.php b/app/bean.php index ae7d54ca..25f9abd9 100644 --- a/app/bean.php +++ b/app/bean.php @@ -46,6 +46,7 @@ // Add global http middleware 'middlewares' => [ \App\Http\Middleware\FavIconMiddleware::class, + \Swoft\Whoops\WhoopsMiddleware::class, // Allow use @View tag \Swoft\View\Middleware\ViewMiddleware::class, ], @@ -115,7 +116,8 @@ // Enable http handle SwooleEvent::REQUEST => bean(RequestListener::class), ], - 'debug' => env('SWOFT_DEBUG', 0), + 'debug' => 1, + // 'debug' => env('SWOFT_DEBUG', 0), /* @see WebSocketServer::$setting */ 'setting' => [ 'log_file' => alias('@runtime/swoole.log'), @@ -127,8 +129,8 @@ ], /** @see \Swoft\Tcp\Protocol */ 'tcpServerProtocol' => [ - 'type' => \Swoft\Tcp\Packer\JsonPacker::TYPE, - // 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, + // 'type' => \Swoft\Tcp\Packer\JsonPacker::TYPE, + 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, // 'openLengthCheck' => true, ], 'cliRouter' => [ From 8cb6ba67ecb9010f8cf92ff3fc7b11dee230454d Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 5 Aug 2019 20:55:33 +0800 Subject: [PATCH 057/211] add some demo method for ws server --- app/WebSocket/EchoModule.php | 3 ++- app/WebSocket/Test/TestController.php | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/WebSocket/EchoModule.php b/app/WebSocket/EchoModule.php index 4aa6ae3f..4a72a537 100644 --- a/app/WebSocket/EchoModule.php +++ b/app/WebSocket/EchoModule.php @@ -3,6 +3,7 @@ namespace App\WebSocket; use Swoft\Http\Message\Request; +use Swoft\Session\Session; use Swoft\WebSocket\Server\Annotation\Mapping\OnMessage; use Swoft\WebSocket\Server\Annotation\Mapping\OnOpen; use Swoft\WebSocket\Server\Annotation\Mapping\WsModule; @@ -24,7 +25,7 @@ class EchoModule */ public function onOpen(Request $request, int $fd): void { - server()->push($request->getFd(), "Opened, welcome!(FD: $fd)"); + Session::mustGet()->push("Opened, welcome #{$fd}!"); } /** diff --git a/app/WebSocket/Test/TestController.php b/app/WebSocket/Test/TestController.php index c83e9856..b160b82a 100644 --- a/app/WebSocket/Test/TestController.php +++ b/app/WebSocket/Test/TestController.php @@ -7,6 +7,7 @@ use Swoft\WebSocket\Server\Annotation\Mapping\WsController; use Swoft\WebSocket\Server\Message\Message; use Swoft\WebSocket\Server\Message\Request; +use Swoft\WebSocket\Server\Message\Response; /** * Class HomeController @@ -85,6 +86,26 @@ public function echo($data): void Session::mustGet()->push('(echo)Recv: ' . $data); } + /** + * Message command is: 'echo' + * + * @param Request $req + * @param Response $res + * @MessageMapping(root=true) + */ + public function hi(Request $req, Response $res): void + { + $fd = $req->getFd(); + $ufd = (int)$req->getMessage()->getData(); + + if ($ufd < 1) { + Session::mustGet()->push('data must be an integer'); + return; + } + + $res->setFd($ufd)->setContent("Hi #{$ufd}, I am #{$fd}"); + } + /** * Message command is: 'bin' * From 4740e3bcfadcef3b2d71deacc5b15eec90088cba Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 5 Aug 2019 21:02:00 +0800 Subject: [PATCH 058/211] update demo --- app/WebSocket/TestModule.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/WebSocket/TestModule.php b/app/WebSocket/TestModule.php index 10dfde70..4a1a718f 100644 --- a/app/WebSocket/TestModule.php +++ b/app/WebSocket/TestModule.php @@ -4,10 +4,10 @@ use App\WebSocket\Test\TestController; use Swoft\Http\Message\Request; +use Swoft\Session\Session; use Swoft\WebSocket\Server\Annotation\Mapping\OnOpen; use Swoft\WebSocket\Server\Annotation\Mapping\WsModule; use Swoft\WebSocket\Server\MessageParser\TokenTextParser; -use function server; /** * Class TestModule @@ -28,6 +28,6 @@ class TestModule */ public function onOpen(Request $request, int $fd): void { - server()->push($request->getFd(), "Opened, welcome!(FD: $fd)"); + Session::mustGet()->push("Opened, welcome!(FD: $fd)"); } } From 190a1a5d0a0992af73aabfab5152b9e71bcb0fd0 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Tue, 6 Aug 2019 20:18:04 +0800 Subject: [PATCH 059/211] Add crontab demo --- app/Crontab/CronTask.php | 17 +++++++++++++++-- app/bean.php | 4 ++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/Crontab/CronTask.php b/app/Crontab/CronTask.php index bc127bc0..b6eafc7a 100644 --- a/app/Crontab/CronTask.php +++ b/app/Crontab/CronTask.php @@ -2,8 +2,11 @@ namespace App\Crontab; +use App\Model\Entity\User; use Swoft\Crontab\Annotaion\Mapping\Cron; use Swoft\Crontab\Annotaion\Mapping\Scheduled; +use Swoft\Log\Helper\CLog; +use Swoft\Stdlib\Helper\JsonHelper; /** * Class CronTask @@ -19,7 +22,17 @@ class CronTask */ public function secondTask() { - printf("second task run: %s ", date('Y-m-d H:i:s', time())); + $user = new User(); + $user->setAge(mt_rand(1, 100)); + $user->setUserDesc('desc'); + + $user->save(); + + $id = $user->getId(); + $user = User::find($id)->toArray(); + + CLog::info("second task run: %s ", date('Y-m-d H:i:s', time())); + CLog::info(JsonHelper::encode($user)); } /** @@ -27,7 +40,7 @@ public function secondTask() */ public function minuteTask() { - printf("minute task run: %s ", date('Y-m-d H:i:s', time())); + CLog::info("minute task run: %s ", date('Y-m-d H:i:s', time())); } } \ No newline at end of file diff --git a/app/bean.php b/app/bean.php index 80a50f54..22a631dd 100644 --- a/app/bean.php +++ b/app/bean.php @@ -2,6 +2,7 @@ use App\Common\DbSelector; use App\Process\MonitorProcess; +use Swoft\Crontab\Process\CrontabProcess; use Swoft\Db\Pool; use Swoft\Http\Server\HttpServer; use Swoft\Task\Swoole\SyncTaskListener; @@ -15,7 +16,6 @@ use Swoft\Server\SwooleEvent; use Swoft\Db\Database; use Swoft\Redis\RedisDb; -use Swoft\Crontab\Crontab; return [ 'logger' => [ @@ -31,7 +31,7 @@ ], 'process' => [ // 'monitor' => bean(MonitorProcess::class) -// 'crontab' => bean(Crontab::class) +// 'crontab' => bean(CrontabProcess::class) ], 'on' => [ // SwooleEvent::TASK => bean(SyncTaskListener::class), // Enable sync task From 67486cb4e4b7ba415dcb6357ee989f22325e3e67 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Tue, 6 Aug 2019 21:33:02 +0800 Subject: [PATCH 060/211] Modify worker num --- app/bean.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/bean.php b/app/bean.php index 22a631dd..b111ecca 100644 --- a/app/bean.php +++ b/app/bean.php @@ -41,12 +41,13 @@ /* @see HttpServer::$setting */ 'setting' => [ 'task_worker_num' => 12, - 'task_enable_coroutine' => true + 'task_enable_coroutine' => true, + 'worker_num' => 6, ] ], 'httpDispatcher' => [ // Add global http middleware - 'middlewares' => [ + 'middlewares' => [ \App\Http\Middleware\FavIconMiddleware::class, // \Swoft\Whoops\WhoopsMiddleware::class, // Allow use @View tag @@ -135,7 +136,7 @@ /** @see \Swoft\Tcp\Protocol */ 'tcpServerProtocol' => [ // 'type' => \Swoft\Tcp\Packer\JsonPacker::TYPE, - 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, + 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, // 'openLengthCheck' => true, ], 'cliRouter' => [ From 53f3ca3fb0ed8aafd4dce0d62e67a3f46f52ebbc Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Tue, 6 Aug 2019 21:51:21 +0800 Subject: [PATCH 061/211] add --- app/bean.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/bean.php b/app/bean.php index b111ecca..1213fa6c 100644 --- a/app/bean.php +++ b/app/bean.php @@ -42,7 +42,7 @@ 'setting' => [ 'task_worker_num' => 12, 'task_enable_coroutine' => true, - 'worker_num' => 6, + 'worker_num' => 2, ] ], 'httpDispatcher' => [ From a380dfa6a8c9666300b09d387fb6cbe0d25a0793 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Tue, 6 Aug 2019 21:51:59 +0800 Subject: [PATCH 062/211] add --- app/bean.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/bean.php b/app/bean.php index 1213fa6c..726c20f9 100644 --- a/app/bean.php +++ b/app/bean.php @@ -41,8 +41,7 @@ /* @see HttpServer::$setting */ 'setting' => [ 'task_worker_num' => 12, - 'task_enable_coroutine' => true, - 'worker_num' => 2, + 'task_enable_coroutine' => true ] ], 'httpDispatcher' => [ From 8bc9908768651a8e78f0ba90941203315a20e0fc Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Tue, 6 Aug 2019 22:45:03 +0800 Subject: [PATCH 063/211] add --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 2fc424de..86e33f9d 100644 --- a/composer.json +++ b/composer.json @@ -32,6 +32,7 @@ "swoft/consul": "~2.0.0", "swoft/limiter": "~2.0.0", "swoft/breaker": "~2.0.0", + "swoft/crontab": "~2.0.0", "swoft/devtool": "~2.0.0" }, "require-dev": { From b34f2c08e8016dc53f119c54854c5d86430b90c4 Mon Sep 17 00:00:00 2001 From: Inhere Date: Tue, 6 Aug 2019 22:54:16 +0800 Subject: [PATCH 064/211] upgrade swoole to 4.4.3 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1b210d38..191cb06e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"prod"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=4.3.0 \ - SWOOLE_VERSION=4.4.2 \ + SWOOLE_VERSION=4.4.3 \ COMPOSER_ALLOW_SUPERUSER=1 # Libs -y --no-install-recommends From 7036058e89fe80a64ab2a3daac27098d55355bd9 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 7 Aug 2019 12:22:28 +0800 Subject: [PATCH 065/211] update: install some tools for docker --- Dockerfile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 191cb06e..2997bc70 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,7 +29,7 @@ ENV APP_ENV=${app_env:-"prod"} \ # Libs -y --no-install-recommends RUN apt-get update \ && apt-get install -y \ - curl wget git zip unzip less vim openssl \ + curl wget git zip unzip less vim procps losf tcpdump htop openssl \ libz-dev \ libssl-dev \ libnghttp2-dev \ @@ -37,13 +37,14 @@ RUN apt-get update \ libjpeg-dev \ libpng-dev \ libfreetype6-dev \ +# Install PHP extensions + && docker-php-ext-install \ + bcmath gd pdo_mysql mbstring sockets zip sysvmsg sysvsem sysvshm + # Install composer - && curl -sS https://getcomposer.org/installer | php \ +Run curl -sS https://getcomposer.org/installer | php \ && mv composer.phar /usr/local/bin/composer \ && composer self-update --clean-backups \ -# Install PHP extensions - && docker-php-ext-install \ - bcmath gd pdo_mysql mbstring sockets zip sysvmsg sysvsem sysvshm \ # Install redis extension && wget http://pecl.php.net/get/redis-${PHPREDIS_VERSION}.tgz -O /tmp/redis.tar.tgz \ && pecl install /tmp/redis.tar.tgz \ From 510ccc5b4aeab4698f4028d159b622f0d921e4c1 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 7 Aug 2019 13:31:58 +0800 Subject: [PATCH 066/211] fix: tool name is error --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 2997bc70..cc9ce642 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,7 +29,7 @@ ENV APP_ENV=${app_env:-"prod"} \ # Libs -y --no-install-recommends RUN apt-get update \ && apt-get install -y \ - curl wget git zip unzip less vim procps losf tcpdump htop openssl \ + curl wget git zip unzip less vim procps lsof tcpdump htop openssl \ libz-dev \ libssl-dev \ libnghttp2-dev \ From f1272b312fa230edd55a2767d4a84711898df56e Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 7 Aug 2019 20:01:19 +0800 Subject: [PATCH 067/211] Update docker-compose.yml --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 0149d563..6b795d76 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,6 +2,8 @@ version: '3.4' services: swoft: image: swoft/swoft +# for local develop +# command: php -S 127.0.0.1:13300 container_name: swoft-srv environment: - APP_ENV=dev From 988ba946754dae194f8448e5d1cabef66bfca957 Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 8 Aug 2019 21:54:15 +0800 Subject: [PATCH 068/211] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 375286a2..f9dd258f 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Through three years of accumulation and direction exploration, Swoft has made Sw ## Feature -- Built-in high performance network server(Http/Websocket/RPC) +- Built-in high performance network server(Http/Websocket/RPC/TCP) - Flexible componentization - Flexible annotation function - Diversified command terminal(Console) @@ -43,6 +43,7 @@ Through three years of accumulation and direction exploration, Swoft has made Sw - Database is highly compatible Laravel - Cache Redis highly compatible Laravel - Efficient task processing +- Efficient seconds corntab - Flexible exception handling - Powerful log system - Service registration & discovery From 9fad9aa97659ede5b088693327cca3ee2956d684 Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 8 Aug 2019 22:20:02 +0800 Subject: [PATCH 069/211] Update README.md --- README.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/README.md b/README.md index f9dd258f..1fc24314 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,44 @@ composer create-project swoft/swoft swoft [root@swoft swoft]# php bin/swoft rpc:start ``` +## Components + +## Core Components + +Component Name | Packagist Version +--------------------|--------------------- +annotation | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/annotation.svg)](https://packagist.org/packages/swoft/annotation) +config | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/config.svg)](https://packagist.org/packages/swoft/config) +db | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/db.svg)](https://packagist.org/packages/swoft/db) +framework | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/framework.svg)](https://packagist.org/packages/swoft/framework) +i18n | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/i18n.svg)](https://packagist.org/packages/swoft/i18n) +proxy | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/proxy.svg)](https://packagist.org/packages/swoft/proxy) +rpc-client | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/rpc-client.svg)](https://packagist.org/packages/swoft/rpc-client) +stdlib | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/stdlib.svg)](https://packagist.org/packages/swoft/stdlib) +tcp-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp-server.svg)](https://packagist.org/packages/swoft/tcp-server) +aop | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/aop.svg)](https://packagist.org/packages/swoft/aop) +connection-pool | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/connection-pool.svg)](https://packagist.org/packages/swoft/connection-pool) +error | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/error.svg)](https://packagist.org/packages/swoft/error) +http-message | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/http-message.svg)](https://packagist.org/packages/swoft/http-message) +log | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/log.svg)](https://packagist.org/packages/swoft/log) +redis | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/redis.svg)](https://packagist.org/packages/swoft/redis) +rpc-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/rpc-server.svg)](https://packagist.org/packages/swoft/rpc-server) +task | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/task.svg)](https://packagist.org/packages/swoft/task) +validator | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/validator.svg)](https://packagist.org/packages/swoft/validator) +bean | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/bean.svg)](https://packagist.org/packages/swoft/bean) +console | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/console.svg)](https://packagist.org/packages/swoft/console) +event | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/event.svg)](https://packagist.org/packages/swoft/event) +http-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/http-server.svg)](https://packagist.org/packages/swoft/http-server) +process | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/process.svg)](https://packagist.org/packages/swoft/process) +rpc | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/rpc.svg)](https://packagist.org/packages/swoft/rpc) +server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/server.svg)](https://packagist.org/packages/swoft/server) +tcp | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/tcp) +websocket-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/websocket-server.svg)](https://packagist.org/packages/swoft/websocket-server) + +### Extension Components + + + ## License Swoft is an open-source software licensed under the [LICENSE](LICENSE) From 973e9c154bee372daefd69ec20c950caaa17e0f0 Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 8 Aug 2019 22:23:56 +0800 Subject: [PATCH 070/211] Update README.md --- README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1fc24314..b425f3aa 100644 --- a/README.md +++ b/README.md @@ -99,8 +99,6 @@ composer create-project swoft/swoft swoft [root@swoft swoft]# php bin/swoft rpc:start ``` -## Components - ## Core Components Component Name | Packagist Version @@ -133,9 +131,17 @@ server | [![Latest Stable Version](http://img.shields.io/packagis tcp | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/tcp) websocket-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/websocket-server.svg)](https://packagist.org/packages/swoft/websocket-server) -### Extension Components - +## Extension Components +Component Name | Packagist Version +-----------------|--------------------- +apollo | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/apollo) +breaker | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/breaker) +crontab | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/crontab) +consul | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/consul) +limiter | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/limiter) +view | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/view) +whoops | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/whoops) ## License From bd4cb56d0b52c979f7cf362357e4b09c3c66bb33 Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 8 Aug 2019 22:25:49 +0800 Subject: [PATCH 071/211] Update README.md --- README.md | 68 +++++++++++++++++++++++++++---------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index b425f3aa..6daf4855 100644 --- a/README.md +++ b/README.md @@ -103,45 +103,45 @@ composer create-project swoft/swoft swoft Component Name | Packagist Version --------------------|--------------------- -annotation | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/annotation.svg)](https://packagist.org/packages/swoft/annotation) -config | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/config.svg)](https://packagist.org/packages/swoft/config) -db | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/db.svg)](https://packagist.org/packages/swoft/db) -framework | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/framework.svg)](https://packagist.org/packages/swoft/framework) -i18n | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/i18n.svg)](https://packagist.org/packages/swoft/i18n) -proxy | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/proxy.svg)](https://packagist.org/packages/swoft/proxy) -rpc-client | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/rpc-client.svg)](https://packagist.org/packages/swoft/rpc-client) -stdlib | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/stdlib.svg)](https://packagist.org/packages/swoft/stdlib) -tcp-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp-server.svg)](https://packagist.org/packages/swoft/tcp-server) -aop | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/aop.svg)](https://packagist.org/packages/swoft/aop) -connection-pool | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/connection-pool.svg)](https://packagist.org/packages/swoft/connection-pool) -error | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/error.svg)](https://packagist.org/packages/swoft/error) -http-message | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/http-message.svg)](https://packagist.org/packages/swoft/http-message) -log | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/log.svg)](https://packagist.org/packages/swoft/log) -redis | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/redis.svg)](https://packagist.org/packages/swoft/redis) -rpc-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/rpc-server.svg)](https://packagist.org/packages/swoft/rpc-server) -task | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/task.svg)](https://packagist.org/packages/swoft/task) -validator | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/validator.svg)](https://packagist.org/packages/swoft/validator) -bean | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/bean.svg)](https://packagist.org/packages/swoft/bean) -console | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/console.svg)](https://packagist.org/packages/swoft/console) -event | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/event.svg)](https://packagist.org/packages/swoft/event) -http-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/http-server.svg)](https://packagist.org/packages/swoft/http-server) -process | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/process.svg)](https://packagist.org/packages/swoft/process) -rpc | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/rpc.svg)](https://packagist.org/packages/swoft/rpc) -server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/server.svg)](https://packagist.org/packages/swoft/server) -tcp | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/tcp) -websocket-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/websocket-server.svg)](https://packagist.org/packages/swoft/websocket-server) +swoft-annotation | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/annotation.svg)](https://packagist.org/packages/swoft/annotation) +swoft-config | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/config.svg)](https://packagist.org/packages/swoft/config) +swoft-db | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/db.svg)](https://packagist.org/packages/swoft/db) +swoft-framework | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/framework.svg)](https://packagist.org/packages/swoft/framework) +swoft-i18n | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/i18n.svg)](https://packagist.org/packages/swoft/i18n) +swoft-proxy | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/proxy.svg)](https://packagist.org/packages/swoft/proxy) +swoft-rpc-client | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/rpc-client.svg)](https://packagist.org/packages/swoft/rpc-client) +swoft-stdlib | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/stdlib.svg)](https://packagist.org/packages/swoft/stdlib) +swoft-tcp-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp-server.svg)](https://packagist.org/packages/swoft/tcp-server) +swoft-aop | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/aop.svg)](https://packagist.org/packages/swoft/aop) +swoft-connection-pool | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/connection-pool.svg)](https://packagist.org/packages/swoft/connection-pool) +swoft-error | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/error.svg)](https://packagist.org/packages/swoft/error) +swoft-http-message | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/http-message.svg)](https://packagist.org/packages/swoft/http-message) +swoft-log | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/log.svg)](https://packagist.org/packages/swoft/log) +swoft-redis | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/redis.svg)](https://packagist.org/packages/swoft/redis) +swoft-rpc-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/rpc-server.svg)](https://packagist.org/packages/swoft/rpc-server) +swoft-task | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/task.svg)](https://packagist.org/packages/swoft/task) +swoft-validator | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/validator.svg)](https://packagist.org/packages/swoft/validator) +swoft-bean | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/bean.svg)](https://packagist.org/packages/swoft/bean) +swoft-console | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/console.svg)](https://packagist.org/packages/swoft/console) +swoft-event | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/event.svg)](https://packagist.org/packages/swoft/event) +swoft-http-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/http-server.svg)](https://packagist.org/packages/swoft/http-server) +swoft-process | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/process.svg)](https://packagist.org/packages/swoft/process) +swoft-rpc | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/rpc.svg)](https://packagist.org/packages/swoft/rpc) +swoft-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/server.svg)](https://packagist.org/packages/swoft/server) +swoft-tcp | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/tcp) +swoft-websocket-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/websocket-server.svg)](https://packagist.org/packages/swoft/websocket-server) ## Extension Components Component Name | Packagist Version -----------------|--------------------- -apollo | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/apollo) -breaker | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/breaker) -crontab | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/crontab) -consul | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/consul) -limiter | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/limiter) -view | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/view) -whoops | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/whoops) +swoft-apollo | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/apollo) +swoft-breaker | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/breaker) +swoft-crontab | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/crontab) +swoft-consul | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/consul) +swoft-limiter | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/limiter) +swoft-view | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/view) +swoft-whoops | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/whoops) ## License From aa5af828ebf3a5da83c61c167f545445c2546894 Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 8 Aug 2019 22:27:18 +0800 Subject: [PATCH 072/211] Update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 6daf4855..1f815dd9 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/swoft.svg)](https://packagist.org/packages/swoft/swoft) [![Build Status](https://travis-ci.org/swoft-cloud/swoft.svg?branch=master)](https://travis-ci.org/swoft-cloud/swoft) -[![Docker Build Status](https://img.shields.io/docker/build/swoft/swoft.svg)](https://hub.docker.com/r/swoft/swoft/) +[![Docker Build Status](https://img.shields.io/docker/build/swoft/alphp.svg)](https://hub.docker.com/r/swoft/swoft/) [![Php Version](https://img.shields.io/badge/php-%3E=7.1-brightgreen.svg?maxAge=2592000)](https://secure.php.net/) [![Swoole Version](https://img.shields.io/badge/swoole-%3E=4.4.1-brightgreen.svg?maxAge=2592000)](https://github.com/swoole/swoole-src) [![Swoft Doc](https://img.shields.io/badge/docs-passing-green.svg?maxAge=2592000)](https://www.swoft.org/docs) @@ -135,13 +135,13 @@ swoft-websocket-server | [![Latest Stable Version](http://img.shields.io/pa Component Name | Packagist Version -----------------|--------------------- -swoft-apollo | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/apollo) -swoft-breaker | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/breaker) -swoft-crontab | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/crontab) -swoft-consul | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/consul) -swoft-limiter | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/limiter) -swoft-view | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/view) -swoft-whoops | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/whoops) +swoft-apollo | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/apollo.svg)](https://packagist.org/packages/swoft/apollo) +swoft-breaker | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/breaker.svg)](https://packagist.org/packages/swoft/breaker) +swoft-crontab | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/crontab.svg)](https://packagist.org/packages/swoft/crontab) +swoft-consul | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/consul.svg)](https://packagist.org/packages/swoft/consul) +swoft-limiter | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/limiter.svg)](https://packagist.org/packages/swoft/limiter) +swoft-view | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/view.svg)](https://packagist.org/packages/swoft/view) +swoft-whoops | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/whoops.svg)](https://packagist.org/packages/swoft/whoops) ## License From 8ec6d568dbb5a5e88fe14fb649cf176080ff54b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9C=96?= Date: Fri, 9 Aug 2019 08:47:15 +0800 Subject: [PATCH 073/211] Update README.zh-CN.md --- README.zh-CN.md | 52 +++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index b174d3e6..4a5eb12a 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -27,31 +27,33 @@ Swoft 通过长达三年的积累和方向的探索,把 Swoft 打造成 PHP ## 功能特色 - - 内置高性能网络服务器(Http/Websocket/RPC) - - 灵活的组件功能 - - 强大的注解功能 - - 多样化的命令终端(控制台) - - 强大的面向切面编程(AOP) - - 容器管理,依赖注入(DI) - - 灵活的事件机制 - - 基于PSR-7的HTTP消息的实现 - - 基于PSR-14的事件管理 - - 基于PSR-15的中间件 - - 国际化(i18n)支持 - - 简单有效的参数验证器 - - 高性能连接池(Mysql/Redis/RPC),自动重新连接 - - 数据库高度兼容Laravel的使用方式 - - Redis高度兼容Laravel的使用方式 - - 高效的任务处理 - - 灵活的异常处理 - - 强大的日志系统 - - 服务注册与发现 - - 配置中心 - - 服务限流 - - 服务降级 - - 服务熔断 - - Apollo - - Consul + - 内置高性能网络服务器(Http/Websocket/RPC/TCP) +- 灵活的组件功能 +- 强大的注解功能 +- 多样化的命令终端(控制台) +- 强大的面向切面编程(AOP) +- 容器管理,依赖注入(DI) +- 灵活的事件机制 +- 基于PSR-7的HTTP消息的实现 +- 基于PSR-14的事件管理 +- 基于PSR-15的中间件 +- 国际化(i18n)支持 +- 简单有效的参数验证器 +- 高性能连接池(Mysql/Redis/RPC),自动重新连接 +- 数据库高度兼容Laravel的使用方式 +- Redis高度兼容Laravel的使用方式 +- 秒级定时任务 +- 进程池 +- 高效的任务处理 +- 灵活的异常处理 +- 强大的日志系统 +- 服务注册与发现 +- 配置中心 +- 服务限流 +- 服务降级 +- 服务熔断 +- Apollo +- Consul ## 在线文档 From 79b05046c0b5da886b887c86c7fbdee2104de066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9C=96?= Date: Fri, 9 Aug 2019 08:49:02 +0800 Subject: [PATCH 074/211] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1f815dd9..8c74824e 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,7 @@ Through three years of accumulation and direction exploration, Swoft has made Sw - Cache Redis highly compatible Laravel - Efficient task processing - Efficient seconds corntab +- Process pool - Flexible exception handling - Powerful log system - Service registration & discovery From 62b9490d283eaa33875cec5806eaa2d80a95e797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9C=96?= Date: Fri, 9 Aug 2019 08:51:39 +0800 Subject: [PATCH 075/211] Update README.md --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 8c74824e..214f760f 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,18 @@ composer create-project swoft/swoft swoft [root@swoft swoft]# php bin/swoft rpc:start ``` +- TCP server + +```bash +[root@swoft swoft]# php bin/swoft tcp:start +``` + +- Process pool + +```bash +[root@swoft swoft]# php bin/swoft process:start +``` + ## Core Components Component Name | Packagist Version From 0f5dae493753f4b8fa78c72274eeb30d828397ae Mon Sep 17 00:00:00 2001 From: Inhere Date: Fri, 9 Aug 2019 10:37:02 +0800 Subject: [PATCH 076/211] up: remove ./vendor/bin/phpstan analyze --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index 86e33f9d..7a1d5d46 100644 --- a/composer.json +++ b/composer.json @@ -58,7 +58,6 @@ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], "test": [ - "./vendor/bin/phpstan analyze", "./vendor/bin/phpunit -c phpunit.xml" ], "cs-fix": "./vendor/bin/php-cs-fixer fix $1" From 70decf2dbe3627c2d87f87e80b8d5a5ad642fe7a Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Fri, 9 Aug 2019 20:29:59 +0800 Subject: [PATCH 077/211] add log file format --- app/Crontab/CronTask.php | 4 ++++ app/bean.php | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/Crontab/CronTask.php b/app/Crontab/CronTask.php index b6eafc7a..dced6283 100644 --- a/app/Crontab/CronTask.php +++ b/app/Crontab/CronTask.php @@ -6,6 +6,7 @@ use Swoft\Crontab\Annotaion\Mapping\Cron; use Swoft\Crontab\Annotaion\Mapping\Scheduled; use Swoft\Log\Helper\CLog; +use Swoft\Log\Helper\Log; use Swoft\Stdlib\Helper\JsonHelper; /** @@ -28,9 +29,12 @@ public function secondTask() $user->save(); + Log::profileStart("name"); $id = $user->getId(); $user = User::find($id)->toArray(); + Log::profileEnd("name"); + CLog::info("second task run: %s ", date('Y-m-d H:i:s', time())); CLog::info(JsonHelper::encode($user)); } diff --git a/app/bean.php b/app/bean.php index 726c20f9..b0040253 100644 --- a/app/bean.php +++ b/app/bean.php @@ -18,9 +18,15 @@ use Swoft\Redis\RedisDb; return [ + 'noticeHandler' => [ + 'logFile' => '@runtime/logs/notice-%d{Y-m-d-H}.log', + ], + 'applicationHandler' => [ + 'logFile' => '@runtime/logs/error-%d{Y-m-d}.log', + ], 'logger' => [ - 'flushRequest' => false, - 'enable' => false, + 'flushRequest' => true, + 'enable' => true, 'json' => false, ], 'httpServer' => [ From 18e82e1ad26858ca936e2f97ff2da436a5199c06 Mon Sep 17 00:00:00 2001 From: inhere Date: Sat, 10 Aug 2019 11:19:32 +0800 Subject: [PATCH 078/211] update some demo class --- app/Application.php | 14 ++++++++++++++ app/WebSocket/Test/TestController.php | 22 ++++++++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/app/Application.php b/app/Application.php index 43f71606..25b41540 100644 --- a/app/Application.php +++ b/app/Application.php @@ -16,6 +16,20 @@ protected function beforeInit(): void { parent::beforeInit(); + // you can init php setting. date_default_timezone_set('Asia/Shanghai'); } + + /** + * @return array + */ + public function getCLoggerConfig(): array + { + $config = parent::getCLoggerConfig(); + + // False: Dont print log to terminal + $config['enable'] = true; + + return $config; + } } diff --git a/app/WebSocket/Test/TestController.php b/app/WebSocket/Test/TestController.php index b160b82a..01f274b0 100644 --- a/app/WebSocket/Test/TestController.php +++ b/app/WebSocket/Test/TestController.php @@ -8,6 +8,9 @@ use Swoft\WebSocket\Server\Message\Message; use Swoft\WebSocket\Server\Message\Request; use Swoft\WebSocket\Server\Message\Response; +use function is_numeric; +use function json_encode; +use const WEBSOCKET_OPCODE_PONG; /** * Class HomeController @@ -39,12 +42,12 @@ public function close(Message $msg): void $data = $msg->getData(); $conn = Session::mustGet(); - $fd = \is_numeric($data) ? (int)$data : $conn->getFd(); + $fd = is_numeric($data) ? (int)$data : $conn->getFd(); $conn->push("hi, will close conn $fd"); // disconnect - \server()->disconnect($fd); + $conn->getServer()->disconnect($fd); } /** @@ -59,7 +62,7 @@ public function injectRequest(Request $req): void { $fd = $req->getFd(); - Session::mustGet()->push("(your FD: $fd)message data: " . \json_encode($req->getMessage()->toArray())); + Session::mustGet()->push("(your FD: $fd)message data: " . json_encode($req->getMessage()->toArray())); } /** @@ -72,7 +75,7 @@ public function injectRequest(Request $req): void */ public function injectMessage(Message $msg): void { - Session::mustGet()->push('message data: ' . \json_encode($msg->toArray())); + Session::mustGet()->push('message data: ' . json_encode($msg->toArray())); } /** @@ -110,11 +113,14 @@ public function hi(Request $req, Response $res): void * Message command is: 'bin' * * @param $data - * @MessageMapping("bin", root=true) + * @MessageMapping("bin", root=true, opcode=2) + * + * @return string */ - public function binary($data): void + public function binary($data): string { - Session::mustGet()->push('Binary: ' . $data, \WEBSOCKET_OPCODE_BINARY); + // Session::mustGet()->push('Binary: ' . $data, \WEBSOCKET_OPCODE_BINARY); + return 'Binary: ' . $data; } /** @@ -124,7 +130,7 @@ public function binary($data): void */ public function pong(): void { - Session::mustGet()->push('pong!', \WEBSOCKET_OPCODE_PONG); + Session::mustGet()->push('pong!', WEBSOCKET_OPCODE_PONG); } /** From 8262f5c1933c956242bb7dbc71ce96a08c9930d5 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Tue, 13 Aug 2019 19:11:31 +0800 Subject: [PATCH 079/211] add log --- app/Crontab/CronTask.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Crontab/CronTask.php b/app/Crontab/CronTask.php index dced6283..84dc982b 100644 --- a/app/Crontab/CronTask.php +++ b/app/Crontab/CronTask.php @@ -35,6 +35,8 @@ public function secondTask() Log::profileEnd("name"); + Log::info("info message", ['a' => 'b']); + CLog::info("second task run: %s ", date('Y-m-d H:i:s', time())); CLog::info(JsonHelper::encode($user)); } From 0b44b13711ed387c7f76d28ebacc7751aa97b8b5 Mon Sep 17 00:00:00 2001 From: inhere Date: Wed, 14 Aug 2019 10:33:26 +0800 Subject: [PATCH 080/211] up some --- app/Crontab/CronTask.php | 33 +++++++++++++++------------------ test/bootstrap.php | 2 +- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/app/Crontab/CronTask.php b/app/Crontab/CronTask.php index b6eafc7a..d90ce621 100644 --- a/app/Crontab/CronTask.php +++ b/app/Crontab/CronTask.php @@ -2,11 +2,9 @@ namespace App\Crontab; -use App\Model\Entity\User; use Swoft\Crontab\Annotaion\Mapping\Cron; use Swoft\Crontab\Annotaion\Mapping\Scheduled; use Swoft\Log\Helper\CLog; -use Swoft\Stdlib\Helper\JsonHelper; /** * Class CronTask @@ -20,27 +18,26 @@ class CronTask /** * @Cron("* * * * * *") */ - public function secondTask() + public function secondTask(): void { - $user = new User(); - $user->setAge(mt_rand(1, 100)); - $user->setUserDesc('desc'); - - $user->save(); - - $id = $user->getId(); - $user = User::find($id)->toArray(); - - CLog::info("second task run: %s ", date('Y-m-d H:i:s', time())); - CLog::info(JsonHelper::encode($user)); + // $user = new User(); + // $user->setAge(mt_rand(1, 100)); + // $user->setUserDesc('desc'); + // + // $user->save(); + // + // $id = $user->getId(); + // $user = User::find($id)->toArray(); + + CLog::info('second task run: %s ', date('Y-m-d H:i:s', time())); + // CLog::info(JsonHelper::encode($user)); } /** * @Cron("0 * * * * *") */ - public function minuteTask() + public function minuteTask(): void { - CLog::info("minute task run: %s ", date('Y-m-d H:i:s', time())); + CLog::info('minute task run: %s ', date('Y-m-d H:i:s', time())); } - -} \ No newline at end of file +} diff --git a/test/bootstrap.php b/test/bootstrap.php index ba7b26ad..a44b83c5 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -1,3 +1,3 @@ Date: Wed, 14 Aug 2019 12:36:48 +0800 Subject: [PATCH 081/211] Update CODE_OF_CONDUCT.md --- .github/CODE_OF_CONDUCT.md | 94 +++++++++++++++++++++++++++++++++++--- 1 file changed, 87 insertions(+), 7 deletions(-) diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index c2a23273..9f1ab7ba 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -1,12 +1,92 @@ -Contributor Code of Conduct -As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. +# Contributing -We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion. +When contributing to this repository, please first discuss the change you wish to make via issue, +email, or any other method with the owners of this repository before making a change. -Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct. +Please note we have a code of conduct, please follow it in all your interactions with the project. -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team. +## Pull Request Process -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers. +1. Ensure any install or build dependencies are removed before the end of the layer when doing a + build. +2. Update the README.md with details of changes to the interface, this includes new environment + variables, exposed ports, useful file locations and container parameters. +3. Increase the version numbers in any examples files and the README.md to the new version that this + Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). +4. You may merge the Pull Request in once you have the sign-off of two other developers, or if you + do not have permission to do that, you may request the second reviewer to merge it for you. -This Code of Conduct is adapted from the Contributor Covenant, version 1.0.0, available at http://contributor-covenant.org/version/1/0/0/ \ No newline at end of file +## Code of Conduct + +### Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +### Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +### Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +### Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +### Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at [INSERT EMAIL ADDRESS]. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +### Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ From b02571d31efb6d0bd1f427155ac16dacf7021090 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 14 Aug 2019 12:38:30 +0800 Subject: [PATCH 082/211] Update CODE_OF_CONDUCT.md --- .github/CODE_OF_CONDUCT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index 9f1ab7ba..a9668046 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -73,7 +73,7 @@ further defined and clarified by project maintainers. ### Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at [INSERT EMAIL ADDRESS]. All +reported by contacting the project team at group@swoft.org . All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. From f5ad98fb8b6967ff9cf0d28ad6b64a7f59c3b2f6 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 14 Aug 2019 20:03:58 +0800 Subject: [PATCH 083/211] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 214f760f..ffba7b46 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Through three years of accumulation and direction exploration, Swoft has made Sw ## Document -- [中文文档](https://www.swoft.org/docs/2.x/zh-CN/README.html) +- [中文文档](https://www.swoft.org/docs) - [English](https://en.swoft.org/docs) ## Discuss From c59795e2327ede2dce16d1f0130fb04ca8c7fbb4 Mon Sep 17 00:00:00 2001 From: inhere Date: Sun, 18 Aug 2019 11:49:39 +0800 Subject: [PATCH 084/211] fix: #903 env data format error on startup by docker compose --- .env.example | 7 +++++-- app/Console/Command/AgentCommand.php | 26 +++++++++--------------- app/Listener/RegisterServiceListener.php | 3 +-- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/.env.example b/.env.example index 7f3f9910..9ef091fa 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,5 @@ -APP_DEBUG = 0 -SWOFT_DEBUG = 0 +# basic +APP_DEBUG=0 +SWOFT_DEBUG=0 + +# more ... diff --git a/app/Console/Command/AgentCommand.php b/app/Console/Command/AgentCommand.php index 2e9819e7..b2d423a8 100644 --- a/app/Console/Command/AgentCommand.php +++ b/app/Console/Command/AgentCommand.php @@ -1,19 +1,14 @@ restart(); + // /** @var HttpServer $server */ + // $server = bean('httpServer'); + // $server->restart(); -// /** @var ServiceServer $server */ -// $server = bean('rpcServer'); -// $server->restart(); + // /** @var ServiceServer $server */ + // $server = bean('rpcServer'); + // $server->restart(); /** @var WebSocketServer $server */ $server = bean('wsServer'); $server->restart(); } } -} \ No newline at end of file +} diff --git a/app/Listener/RegisterServiceListener.php b/app/Listener/RegisterServiceListener.php index 24c84089..a92ae6c2 100644 --- a/app/Listener/RegisterServiceListener.php +++ b/app/Listener/RegisterServiceListener.php @@ -5,7 +5,6 @@ use Swoft\Bean\Annotation\Mapping\Inject; -use Swoft\Co; use Swoft\Consul\Agent; use Swoft\Event\Annotation\Mapping\Listener; use Swoft\Event\EventHandlerInterface; @@ -63,4 +62,4 @@ public function handle(EventInterface $event): void // CLog::info('Swoft http register service success by consul!'); } -} \ No newline at end of file +} From 9a66f83344819af91433109d61c2def8421764f5 Mon Sep 17 00:00:00 2001 From: Inhere Date: Sun, 18 Aug 2019 16:45:06 +0800 Subject: [PATCH 085/211] Delete start-http-server.jpg --- public/image/start-http-server.jpg | Bin 74998 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 public/image/start-http-server.jpg diff --git a/public/image/start-http-server.jpg b/public/image/start-http-server.jpg deleted file mode 100644 index 1e38f23a56b15db764c9de70b55e3d08780faa1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74998 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 From 9eecbbaab4c73d93ff2b2b79fdd3e8fedd9eb9ee Mon Sep 17 00:00:00 2001 From: Inhere Date: Sun, 18 Aug 2019 16:46:01 +0800 Subject: [PATCH 086/211] up: upload new start-http-server.jpg --- public/start-http-server.jpg | Bin 0 -> 123829 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/start-http-server.jpg diff --git a/public/start-http-server.jpg b/public/start-http-server.jpg new file mode 100644 index 0000000000000000000000000000000000000000..baa3b2b89e6a108918e626b6e8b68a31785812ae GIT binary patch literal 123829 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[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
    o(f!JOi#*7uSUWS6ZT!$GlFd7ZgBFGokh5nRW+R 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 f4mQny!-0-msDK))b5Yd!KoX* Date: Sun, 18 Aug 2019 16:47:41 +0800 Subject: [PATCH 087/211] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ffba7b46..f9e1b2fc 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ [![Swoft License](https://img.shields.io/hexpm/l/plug.svg?maxAge=2592000)](https://github.com/swoft-cloud/swoft/blob/master/LICENSE) [![Gitter](https://img.shields.io/gitter/room/swoft-cloud/swoft.svg)](https://gitter.im/swoft-cloud/community) -![start-http-server](https://raw.githubusercontent.com/swoft-cloud/swoft/master/public/image/start-http-server.jpg) +![start-http-server](https://raw.githubusercontent.com/swoft-cloud/swoft/master/public/start-http-server.jpg) PHP microservices coroutine framework From 8c7ac3a6691f73f1532935345b85b4068bfcd5d8 Mon Sep 17 00:00:00 2001 From: inhere Date: Sun, 18 Aug 2019 16:51:55 +0800 Subject: [PATCH 088/211] update image on readme --- README.md | 2 +- public/image/start-http-server.jpg | Bin 0 -> 113531 bytes public/start-http-server.jpg | Bin 123829 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 public/image/start-http-server.jpg delete mode 100644 public/start-http-server.jpg diff --git a/README.md b/README.md index f9e1b2fc..ffba7b46 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ [![Swoft License](https://img.shields.io/hexpm/l/plug.svg?maxAge=2592000)](https://github.com/swoft-cloud/swoft/blob/master/LICENSE) [![Gitter](https://img.shields.io/gitter/room/swoft-cloud/swoft.svg)](https://gitter.im/swoft-cloud/community) -![start-http-server](https://raw.githubusercontent.com/swoft-cloud/swoft/master/public/start-http-server.jpg) +![start-http-server](https://raw.githubusercontent.com/swoft-cloud/swoft/master/public/image/start-http-server.jpg) PHP microservices coroutine framework diff --git a/public/image/start-http-server.jpg b/public/image/start-http-server.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19810bb920954b12d84f844c0f7802d1d0a72c73 GIT binary patch literal 113531 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

    #&PeMLkLP}j0iSz6>VZ(AThW95TQ}Js~cY;Fn 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

    mu!%J@+^?eC_C{w>QVilBPjSO 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[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

      o(f!JOi#*7uSUWS6ZT!$GlFd7ZgBFGokh5nRW+R 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 f4mQny!-0-msDK))b5Yd!KoX* Date: Sun, 18 Aug 2019 16:57:42 +0800 Subject: [PATCH 089/211] up: update readme image --- public/image/start-http-server.jpg | Bin 113531 -> 104461 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/image/start-http-server.jpg b/public/image/start-http-server.jpg index 19810bb920954b12d84f844c0f7802d1d0a72c73..c596bc6d0d67882dac47b6a7e484bf62342feb0a 100644 GIT binary patch literal 104461 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

      GVY~;_@y3kO=ll5Ygl{O2 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 literal 113531 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

      #&PeMLkLP}j0iSz6>VZ(AThW95TQ}Js~cY;Fn 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

      mu!%J@+^?eC_C{w>QVilBPjSO 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 Date: Wed, 28 Aug 2019 19:14:51 +0800 Subject: [PATCH 090/211] format codes, remove some invalid comments --- app/Http/Controller/BeanController.php | 12 ++-------- app/Http/Controller/BreakerController.php | 3 +-- app/Http/Controller/CoController.php | 9 ++++---- app/Http/Controller/DbBuilderController.php | 6 ++--- app/Http/Controller/DbModelController.php | 8 +++---- .../Controller/DbTransactionController.php | 3 +-- app/Http/Controller/ExceptionController.php | 3 ++- app/Http/Controller/HomeController.php | 23 +++++++++++++------ app/Http/Controller/LogController.php | 9 +------- app/Http/Controller/RedisController.php | 13 +++++------ app/Http/Controller/RespController.php | 6 ++--- app/Http/Controller/RpcController.php | 3 +-- app/Http/Controller/SelectDbController.php | 5 ++-- app/Http/Controller/TaskController.php | 11 ++++----- app/Http/Controller/TimerController.php | 7 +++--- app/Http/Controller/ValidatorController.php | 8 +++---- app/Http/Controller/ViewController.php | 5 ---- app/Http/Middleware/FavIconMiddleware.php | 6 +++-- app/Listener/DeregisterServiceListener.php | 4 +--- app/Listener/RanListener.php | 3 +-- app/Listener/Test/ShutDownListener.php | 7 +++--- 21 files changed, 67 insertions(+), 87 deletions(-) diff --git a/app/Http/Controller/BeanController.php b/app/Http/Controller/BeanController.php index c7b6cd27..1f7f7efd 100644 --- a/app/Http/Controller/BeanController.php +++ b/app/Http/Controller/BeanController.php @@ -1,14 +1,10 @@ getData(); } /** * @return array - * @throws ContainerException - * @throws ReflectionException * * @RequestMapping() */ @@ -53,4 +45,4 @@ public function requestClass(): array $request = BeanFactory::getRequestBean(RequestBeanTwo::class, $id); return $request->getData(); } -} \ No newline at end of file +} diff --git a/app/Http/Controller/BreakerController.php b/app/Http/Controller/BreakerController.php index 96373323..4c7b81e6 100644 --- a/app/Http/Controller/BreakerController.php +++ b/app/Http/Controller/BreakerController.php @@ -1,6 +1,5 @@ logic->unFallback(); } -} \ No newline at end of file +} diff --git a/app/Http/Controller/CoController.php b/app/Http/Controller/CoController.php index f78912cc..dde0e358 100644 --- a/app/Http/Controller/CoController.php +++ b/app/Http/Controller/CoController.php @@ -11,6 +11,7 @@ use Swoft\Redis\Redis; use Swoole\Coroutine\Http\Client; use Throwable; +use function random_int; /** * Class CoController @@ -43,9 +44,7 @@ public function multi(): array } ]; - $response = Co::multi($requests); - - return $response; + return Co::multi($requests); } /** @@ -65,7 +64,7 @@ public static function getUser(): array public function addUser(): array { $user = User::new(); - $user->setAge(mt_rand(1, 100)); + $user->setAge(random_int(1, 100)); $user->setUserDesc('desc'); // Save result @@ -73,4 +72,4 @@ public function addUser(): array return [$result, $user->getId()]; } -} \ No newline at end of file +} diff --git a/app/Http/Controller/DbBuilderController.php b/app/Http/Controller/DbBuilderController.php index d0ec77bc..49374f95 100644 --- a/app/Http/Controller/DbBuilderController.php +++ b/app/Http/Controller/DbBuilderController.php @@ -1,10 +1,9 @@ increments('id'); diff --git a/app/Http/Controller/DbModelController.php b/app/Http/Controller/DbModelController.php index 6f5fc97c..e7f06969 100644 --- a/app/Http/Controller/DbModelController.php +++ b/app/Http/Controller/DbModelController.php @@ -1,6 +1,5 @@ setAge(mt_rand(1, 100)); + $user->setAge(random_int(1, 100)); $user->setUserDesc('desc'); $user->save(); @@ -99,7 +99,7 @@ public function delete(): array public function getId(): int { $user = new User(); - $user->setAge(mt_rand(1, 100)); + $user->setAge(random_int(1, 100)); $user->setUserDesc('desc'); $user->save(); @@ -113,7 +113,7 @@ public function getId(): int * @return array * @throws Throwable */ - public function batchUpdate() + public function batchUpdate(): array { // User::truncate(); User::updateOrCreate(['id' => 1], ['age' => 23]); diff --git a/app/Http/Controller/DbTransactionController.php b/app/Http/Controller/DbTransactionController.php index 048689a9..b1560c41 100644 --- a/app/Http/Controller/DbTransactionController.php +++ b/app/Http/Controller/DbTransactionController.php @@ -1,6 +1,5 @@ getId(); } -} \ No newline at end of file +} diff --git a/app/Http/Controller/ExceptionController.php b/app/Http/Controller/ExceptionController.php index 0fe8f281..7a1ee974 100644 --- a/app/Http/Controller/ExceptionController.php +++ b/app/Http/Controller/ExceptionController.php @@ -1,4 +1,5 @@ -render('home/index'); - return Context::mustGet()->getResponse()->withContentType(ContentType::HTML)->withContent($content); + return context()->getResponse()->withContentType(ContentType::HTML)->withContent($content); + } + + /** + * @RequestMapping("/hi") + * + * @return Response + * @throws SwoftException + */ + public function hi(): Response + { + return context()->getResponse()->withContent('hi'); } /** @@ -37,11 +47,10 @@ public function index(): Response * @param string $name * * @return Response - * @throws ReflectionException - * @throws ContainerException + * @throws SwoftException */ public function hello(string $name): Response { - return Context::mustGet()->getResponse()->withContent('Hello' . ($name === '' ? '' : ", {$name}")); + return context()->getResponse()->withContent('Hello' . ($name === '' ? '' : ", {$name}")); } } diff --git a/app/Http/Controller/LogController.php b/app/Http/Controller/LogController.php index 121d4f5a..20c11b10 100644 --- a/app/Http/Controller/LogController.php +++ b/app/Http/Controller/LogController.php @@ -1,10 +1,7 @@ getResponse(); + $resp = context()->getResponse(); return $resp->setCookie('c-name', 'c-value')->withData(['hello']); } diff --git a/app/Http/Controller/RpcController.php b/app/Http/Controller/RpcController.php index 18cd0e04..bb80f291 100644 --- a/app/Http/Controller/RpcController.php +++ b/app/Http/Controller/RpcController.php @@ -1,6 +1,5 @@ uniqid(), 'password' => md5(uniqid()), - 'age' => mt_rand(1, 100), + 'age' => random_int(1, 100), 'user_desc' => 'u desc', 'foo' => 'bar' ] @@ -257,4 +256,4 @@ public function getId(): int return $user->getId(); } -} \ No newline at end of file +} diff --git a/app/Http/Controller/TaskController.php b/app/Http/Controller/TaskController.php index 0168e143..116d91cb 100644 --- a/app/Http/Controller/TaskController.php +++ b/app/Http/Controller/TaskController.php @@ -1,6 +1,5 @@ setAge(mt_rand(1, 100)); + $user->setAge(random_int(1, 100)); $user->setUserDesc('desc'); $user->save(); @@ -59,7 +60,7 @@ public function tick(): array { Timer::tick(3 * 1000, function (int $timerId) { $user = new User(); - $user->setAge(mt_rand(1, 100)); + $user->setAge(random_int(1, 100)); $user->setUserDesc('desc'); $user->save(); @@ -76,4 +77,4 @@ public function tick(): array return ['tick']; } -} \ No newline at end of file +} diff --git a/app/Http/Controller/ValidatorController.php b/app/Http/Controller/ValidatorController.php index 213e3143..43b7ff10 100644 --- a/app/Http/Controller/ValidatorController.php +++ b/app/Http/Controller/ValidatorController.php @@ -24,7 +24,7 @@ class ValidatorController * * @return array */ - function validateAll(Request $request): array + public function validateAll(Request $request): array { return $request->getParsedBody(); } @@ -39,7 +39,7 @@ function validateAll(Request $request): array * * @return array */ - function validateType(Request $request): array + public function validateType(Request $request): array { return $request->getParsedBody(); } @@ -54,7 +54,7 @@ function validateType(Request $request): array * * @return array */ - function validatePassword(Request $request): array + public function validatePassword(Request $request): array { return $request->getParsedBody(); } @@ -69,7 +69,7 @@ function validatePassword(Request $request): array * * @return array */ - function validateCustomer(Request $request): array + public function validateCustomer(Request $request): array { return $request->getParsedBody(); } diff --git a/app/Http/Controller/ViewController.php b/app/Http/Controller/ViewController.php index 56797e4c..6a292d20 100644 --- a/app/Http/Controller/ViewController.php +++ b/app/Http/Controller/ViewController.php @@ -1,10 +1,7 @@ agent->deregisterService('swoft'); } -} \ No newline at end of file +} diff --git a/app/Listener/RanListener.php b/app/Listener/RanListener.php index c1c5bcea..0fc2eb47 100644 --- a/app/Listener/RanListener.php +++ b/app/Listener/RanListener.php @@ -1,6 +1,5 @@ getRawSql($querySql, $bindings, $connection); -// output()->info($rawSql); + // output()->info($rawSql); } /** diff --git a/app/Listener/Test/ShutDownListener.php b/app/Listener/Test/ShutDownListener.php index f7515cad..77f1870d 100644 --- a/app/Listener/Test/ShutDownListener.php +++ b/app/Listener/Test/ShutDownListener.php @@ -1,12 +1,11 @@ Date: Sat, 31 Aug 2019 00:14:49 +0800 Subject: [PATCH 091/211] Add files via upload --- public/image/swoft-logo-mdl.png | Bin 0 -> 99340 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/image/swoft-logo-mdl.png diff --git a/public/image/swoft-logo-mdl.png b/public/image/swoft-logo-mdl.png new file mode 100644 index 0000000000000000000000000000000000000000..0e27cf0d216b1bd1876e2b4ff336a64d6d20e3c7 GIT binary patch literal 99340 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 Date: Sat, 31 Aug 2019 00:17:49 +0800 Subject: [PATCH 092/211] Update README.md --- README.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index ffba7b46..79d27fc9 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,4 @@ -

      - - swoft - -

      +![swoft-logo](https://raw.githubusercontent.com/swoft-cloud/swoft/master/public/image/swoft-logo-mdl.png) [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/swoft.svg)](https://packagist.org/packages/swoft/swoft) [![Build Status](https://travis-ci.org/swoft-cloud/swoft.svg?branch=master)](https://travis-ci.org/swoft-cloud/swoft) @@ -15,7 +11,7 @@ ![start-http-server](https://raw.githubusercontent.com/swoft-cloud/swoft/master/public/image/start-http-server.jpg) -PHP microservices coroutine framework +PHP microservice coroutine framework > **[中文说明](README.zh-CN.md)** @@ -82,31 +78,31 @@ composer create-project swoft/swoft swoft ## Start -- Http server +- Http Server ```bash [root@swoft swoft]# php bin/swoft http:start ``` -- WebSocket server +- WebSocket Server ```bash [root@swoft swoft]# php bin/swoft ws:start ``` -- RPC server +- RPC Server ```bash [root@swoft swoft]# php bin/swoft rpc:start ``` -- TCP server +- TCP Server ```bash [root@swoft swoft]# php bin/swoft tcp:start ``` -- Process pool +- Process Pool ```bash [root@swoft swoft]# php bin/swoft process:start From 414e9aa49ac447808cf72d0df6b4dd08b852da8d Mon Sep 17 00:00:00 2001 From: Inhere Date: Sat, 7 Sep 2019 20:35:32 +0800 Subject: [PATCH 093/211] update: upgrade swoole to 4.4.5 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index cc9ce642..05ae0362 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"prod"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=4.3.0 \ - SWOOLE_VERSION=4.4.3 \ + SWOOLE_VERSION=4.4.5 \ COMPOSER_ALLOW_SUPERUSER=1 # Libs -y --no-install-recommends From 03bd31b41318d715af38a2dee494e298c6d9d301 Mon Sep 17 00:00:00 2001 From: wvfeng Date: Thu, 12 Sep 2019 09:21:33 +0800 Subject: [PATCH 094/211] Fixing the use of validation rules (\App\Validator\Rule\AlphaDashRule) will cause the Request to get data error --- app/Validator/Rule/AlphaDashRule.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Validator/Rule/AlphaDashRule.php b/app/Validator/Rule/AlphaDashRule.php index 5a920095..a815fe76 100644 --- a/app/Validator/Rule/AlphaDashRule.php +++ b/app/Validator/Rule/AlphaDashRule.php @@ -33,7 +33,7 @@ public function validate(array $data, string $propertyName, $item, $default = nu $rule = '/^[A-Za-z0-9\-\_]+$/'; if (preg_match($rule, $data[$propertyName])) { - return [$data]; + return $data; } $message = (empty($message)) ? sprintf('%s must be a email', $propertyName) : $message; From c7ba0c05b0af85ff40aebd1aa1f1c15b5722b7df Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Fri, 13 Sep 2019 18:10:40 +0800 Subject: [PATCH 095/211] Modify demo --- app/Crontab/CronTask.php | 3 +++ app/Listener/Test/ShutDownListener.php | 5 ++++- app/Listener/Test/StartListener.php | 5 ++++- app/Listener/Test/TaskProcessListener.php | 2 +- app/Listener/Test/WorkerStartListener.php | 5 ++++- app/Listener/Test/WorkerStopListener.php | 5 ++++- app/bean.php | 13 +++++++------ 7 files changed, 27 insertions(+), 11 deletions(-) diff --git a/app/Crontab/CronTask.php b/app/Crontab/CronTask.php index 84dc982b..0df57685 100644 --- a/app/Crontab/CronTask.php +++ b/app/Crontab/CronTask.php @@ -3,6 +3,7 @@ namespace App\Crontab; use App\Model\Entity\User; +use Exception; use Swoft\Crontab\Annotaion\Mapping\Cron; use Swoft\Crontab\Annotaion\Mapping\Scheduled; use Swoft\Log\Helper\CLog; @@ -20,6 +21,8 @@ class CronTask { /** * @Cron("* * * * * *") + * + * @throws Exception */ public function secondTask() { diff --git a/app/Listener/Test/ShutDownListener.php b/app/Listener/Test/ShutDownListener.php index f7515cad..56cd6f4b 100644 --- a/app/Listener/Test/ShutDownListener.php +++ b/app/Listener/Test/ShutDownListener.php @@ -7,6 +7,7 @@ use Swoft\Event\Annotation\Mapping\Listener; use Swoft\Event\EventHandlerInterface; use Swoft\Event\EventInterface; +use Swoft\Exception\SwoftException; use Swoft\Log\Helper\CLog; use Swoft\Server\SwooleEvent; @@ -21,11 +22,13 @@ class ShutDownListener implements EventHandlerInterface { /** * @param EventInterface $event + * + * @throws SwoftException */ public function handle(EventInterface $event): void { $context = context(); - CLog::info(' Shut down context=' . get_class($context)); + CLog::debug(' Shut down context=' . get_class($context)); } } \ No newline at end of file diff --git a/app/Listener/Test/StartListener.php b/app/Listener/Test/StartListener.php index 6c7f5377..b6a51316 100644 --- a/app/Listener/Test/StartListener.php +++ b/app/Listener/Test/StartListener.php @@ -7,6 +7,7 @@ use Swoft\Event\Annotation\Mapping\Listener; use Swoft\Event\EventHandlerInterface; use Swoft\Event\EventInterface; +use Swoft\Exception\SwoftException; use Swoft\Log\Helper\CLog; use Swoft\Server\SwooleEvent; @@ -21,11 +22,13 @@ class StartListener implements EventHandlerInterface { /** * @param EventInterface $event + * + * @throws SwoftException */ public function handle(EventInterface $event): void { $context = context(); - CLog::info('Start context=' . get_class($context)); + CLog::debug('Start context=' . get_class($context)); } } \ No newline at end of file diff --git a/app/Listener/Test/TaskProcessListener.php b/app/Listener/Test/TaskProcessListener.php index 3abb46b5..74d3e73a 100644 --- a/app/Listener/Test/TaskProcessListener.php +++ b/app/Listener/Test/TaskProcessListener.php @@ -24,6 +24,6 @@ class TaskProcessListener implements EventHandlerInterface */ public function handle(EventInterface $event): void { - CLog::info('Task worker start'); + CLog::debug('Task worker start'); } } \ No newline at end of file diff --git a/app/Listener/Test/WorkerStartListener.php b/app/Listener/Test/WorkerStartListener.php index 97b6ee5a..3943860e 100644 --- a/app/Listener/Test/WorkerStartListener.php +++ b/app/Listener/Test/WorkerStartListener.php @@ -6,6 +6,7 @@ use Swoft\Event\Annotation\Mapping\Listener; use Swoft\Event\EventHandlerInterface; use Swoft\Event\EventInterface; +use Swoft\Exception\SwoftException; use Swoft\Log\Helper\CLog; use Swoft\Server\ServerEvent; @@ -20,11 +21,13 @@ class WorkerStartListener implements EventHandlerInterface { /** * @param EventInterface $event + * + * @throws SwoftException */ public function handle(EventInterface $event): void { $context = context(); - CLog::info('Worker Start context=' . get_class($context)); + CLog::debug('Worker Start context=' . get_class($context)); } } \ No newline at end of file diff --git a/app/Listener/Test/WorkerStopListener.php b/app/Listener/Test/WorkerStopListener.php index 397192e5..196f67ae 100644 --- a/app/Listener/Test/WorkerStopListener.php +++ b/app/Listener/Test/WorkerStopListener.php @@ -7,6 +7,7 @@ use Swoft\Event\Annotation\Mapping\Listener; use Swoft\Event\EventHandlerInterface; use Swoft\Event\EventInterface; +use Swoft\Exception\SwoftException; use Swoft\Log\Helper\CLog; use Swoft\Server\SwooleEvent; @@ -21,11 +22,13 @@ class WorkerStopListener implements EventHandlerInterface { /** * @param EventInterface $event + * + * @throws SwoftException */ public function handle(EventInterface $event): void { $context = context(); - CLog::info('Worker Start context=' . get_class($context)); + CLog::debug('Worker Start context=' . get_class($context)); } } \ No newline at end of file diff --git a/app/bean.php b/app/bean.php index b0040253..924704c0 100644 --- a/app/bean.php +++ b/app/bean.php @@ -45,9 +45,10 @@ SwooleEvent::FINISH => bean(FinishListener::class) ], /* @see HttpServer::$setting */ - 'setting' => [ + 'setting' => [ 'task_worker_num' => 12, - 'task_enable_coroutine' => true + 'task_enable_coroutine' => true, + 'worker_num' => 6 ] ], 'httpDispatcher' => [ @@ -73,11 +74,11 @@ 'dsn' => 'mysql:dbname=test2;host=127.0.0.1', 'username' => 'root', 'password' => 'swoft123456', - 'dbSelector' => bean(DbSelector::class) +// 'dbSelector' => bean(DbSelector::class) ], - 'db2.pool' => [ + 'db2.pool' => [ 'class' => Pool::class, - 'database' => bean('db2') + 'database' => bean('db2'), ], 'db3' => [ 'class' => Database::class, @@ -115,7 +116,7 @@ ], 'user.pool' => [ 'class' => ServicePool::class, - 'client' => bean('user') + 'client' => bean('user'), ], 'rpcServer' => [ 'class' => ServiceServer::class, From 0b341de2a17af00e74d64f5e174819d1b27b2922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Sz=C3=A9pe?= Date: Fri, 13 Sep 2019 15:25:32 +0000 Subject: [PATCH 096/211] Fix all stlye issues --- app/Annotation/Mapping/AlphaDash.php | 8 +++++ app/Annotation/Parser/AlphaDashParser.php | 8 +++++ app/Application.php | 8 +++++ app/Aspect/AnnotationAspect.php | 12 ++++++-- app/AutoLoader.php | 8 +++++ app/Common/DbSelector.php | 12 ++++++-- app/Common/RpcProvider.php | 12 ++++++-- app/Console/Command/AgentCommand.php | 12 ++++++-- app/Console/Command/DemoCommand.php | 8 +++++ app/Console/Command/TestCommand.php | 8 +++++ app/Crontab/CronTask.php | 21 ++++++++----- app/Exception/ApiException.php | 9 +++++- app/Exception/Handler/ApiExceptionHandler.php | 8 +++++ .../Handler/HttpExceptionHandler.php | 8 +++++ app/Exception/Handler/RpcExceptionHandler.php | 13 +++++--- .../Handler/WsHandshakeExceptionHandler.php | 13 +++++++- .../Handler/WsMessageExceptionHandler.php | 8 +++++ app/Helper/Functions.php | 7 ++++- app/Http/Controller/BeanController.php | 11 +++++-- app/Http/Controller/BreakerController.php | 11 +++++-- app/Http/Controller/CoController.php | 11 +++++-- app/Http/Controller/DbBuilderController.php | 10 +++++-- app/Http/Controller/DbModelController.php | 9 +++++- .../Controller/DbTransactionController.php | 11 +++++-- app/Http/Controller/ExceptionController.php | 8 +++++ app/Http/Controller/HomeController.php | 8 +++++ app/Http/Controller/LimiterController.php | 9 +++++- app/Http/Controller/LogController.php | 11 +++++-- app/Http/Controller/RedisController.php | 11 +++++-- app/Http/Controller/RespController.php | 9 +++++- app/Http/Controller/RpcController.php | 11 +++++-- app/Http/Controller/SelectDbController.php | 21 ++++++++----- app/Http/Controller/TaskController.php | 11 +++++-- app/Http/Controller/TimerController.php | 15 +++++++--- app/Http/Controller/ValidatorController.php | 16 +++++++--- app/Http/Controller/ViewController.php | 9 +++++- app/Http/Middleware/FavIconMiddleware.php | 8 +++++ app/Listener/DeregisterServiceListener.php | 14 +++++---- app/Listener/ModelSavedListener.php | 9 +++++- app/Listener/RanListener.php | 10 +++++-- app/Listener/RegisterServiceListener.php | 15 ++++++---- app/Listener/Test/ShutDownListener.php | 12 ++++++-- app/Listener/Test/StartListener.php | 12 ++++++-- app/Listener/Test/TaskProcessListener.php | 12 ++++++-- app/Listener/Test/WorkerStartListener.php | 11 +++++-- app/Listener/Test/WorkerStopListener.php | 12 ++++++-- app/Listener/UserSavingListener.php | 9 +++++- app/Migration/AddMsg.php | 11 +++++-- app/Migration/AddUser.php | 10 +++++-- app/Migration/Message.php | 10 +++++-- app/Model/Dao/UserDao.php | 13 +++++--- app/Model/Data/UserData.php | 13 +++++--- app/Model/Entity/Count.php | 13 +++++--- app/Model/Entity/Count2.php | 12 ++++++-- app/Model/Entity/Desc.php | 11 +++++-- app/Model/Entity/User.php | 30 +++++++++++-------- app/Model/Entity/User3.php | 13 +++++--- app/Model/Logic/ApolloLogic.php | 11 +++++-- app/Model/Logic/BreakerLogic.php | 11 +++++-- app/Model/Logic/ConsulLogic.php | 12 ++++++-- app/Model/Logic/LimiterLogic.php | 11 +++++-- app/Model/Logic/MonitorLogic.php | 11 +++++-- app/Model/Logic/RequestBean.php | 14 +++++++-- app/Model/Logic/RequestBeanTwo.php | 11 +++++-- app/Model/Logic/UserLogic.php | 13 +++++--- app/Process/MonitorProcess.php | 10 +++++-- app/Process/Worker1Process.php | 10 +++++-- app/Process/Worker2Process.php | 10 +++++-- app/Rpc/Lib/UserInterface.php | 11 +++++-- app/Rpc/Middleware/ServiceMiddleware.php | 12 ++++++-- app/Rpc/Service/UserService.php | 12 ++++++-- app/Rpc/Service/UserServiceV2.php | 12 ++++++-- app/Task/Listener/FinishListener.php | 11 +++++-- app/Task/Task/SyncTask.php | 11 +++++-- app/Task/Task/TestTask.php | 11 +++++-- app/Tcp/Controller/DemoController.php | 8 +++++ app/Validator/CustomerValidator.php | 8 +++++ app/Validator/Rule/AlphaDashRule.php | 8 +++++ app/Validator/TestValidator.php | 8 +++++ app/WebSocket/Chat/HomeController.php | 8 +++++ app/WebSocket/ChatModule.php | 8 +++++ app/WebSocket/EchoModule.php | 8 +++++ app/WebSocket/Test/TestController.php | 8 +++++ app/WebSocket/TestModule.php | 8 +++++ app/bean.php | 9 +++++- bin/bootstrap.php | 11 +++++-- test/bootstrap.php | 9 +++++- 87 files changed, 769 insertions(+), 181 deletions(-) diff --git a/app/Annotation/Mapping/AlphaDash.php b/app/Annotation/Mapping/AlphaDash.php index 67bb235b..45aeeab4 100644 --- a/app/Annotation/Mapping/AlphaDash.php +++ b/app/Annotation/Mapping/AlphaDash.php @@ -1,4 +1,12 @@ restart(); } } -} \ No newline at end of file +} diff --git a/app/Console/Command/DemoCommand.php b/app/Console/Command/DemoCommand.php index 683c505c..4bf9b0fc 100644 --- a/app/Console/Command/DemoCommand.php +++ b/app/Console/Command/DemoCommand.php @@ -1,4 +1,12 @@ save(); - Log::profileStart("name"); + Log::profileStart('name'); $id = $user->getId(); $user = User::find($id)->toArray(); - Log::profileEnd("name"); + Log::profileEnd('name'); - Log::info("info message", ['a' => 'b']); + Log::info('info message', ['a' => 'b']); - CLog::info("second task run: %s ", date('Y-m-d H:i:s', time())); + CLog::info('second task run: %s ', date('Y-m-d H:i:s', time())); CLog::info(JsonHelper::encode($user)); } @@ -49,7 +57,6 @@ public function secondTask() */ public function minuteTask() { - CLog::info("minute task run: %s ", date('Y-m-d H:i:s', time())); + CLog::info('minute task run: %s ', date('Y-m-d H:i:s', time())); } - -} \ No newline at end of file +} diff --git a/app/Exception/ApiException.php b/app/Exception/ApiException.php index bae2e370..e995d7b9 100644 --- a/app/Exception/ApiException.php +++ b/app/Exception/ApiException.php @@ -1,4 +1,12 @@ withStatus(500)->withContent(sprintf( - '%s At %s line %d', $e->getMessage(), $e->getFile(), $e->getLine() + '%s At %s line %d', + $e->getMessage(), + $e->getFile(), + $e->getLine() )); } diff --git a/app/Exception/Handler/WsMessageExceptionHandler.php b/app/Exception/Handler/WsMessageExceptionHandler.php index 1b533f6c..df3abd1c 100644 --- a/app/Exception/Handler/WsMessageExceptionHandler.php +++ b/app/Exception/Handler/WsMessageExceptionHandler.php @@ -1,4 +1,12 @@ getData(); } -} \ No newline at end of file +} diff --git a/app/Http/Controller/BreakerController.php b/app/Http/Controller/BreakerController.php index 96373323..59c141e3 100644 --- a/app/Http/Controller/BreakerController.php +++ b/app/Http/Controller/BreakerController.php @@ -1,5 +1,12 @@ logic->unFallback(); } -} \ No newline at end of file +} diff --git a/app/Http/Controller/CoController.php b/app/Http/Controller/CoController.php index f78912cc..c3328435 100644 --- a/app/Http/Controller/CoController.php +++ b/app/Http/Controller/CoController.php @@ -1,5 +1,12 @@ getId()]; } -} \ No newline at end of file +} diff --git a/app/Http/Controller/DbBuilderController.php b/app/Http/Controller/DbBuilderController.php index d0ec77bc..1fb59bd5 100644 --- a/app/Http/Controller/DbBuilderController.php +++ b/app/Http/Controller/DbBuilderController.php @@ -1,5 +1,12 @@ getId(); } -} \ No newline at end of file +} diff --git a/app/Http/Controller/ExceptionController.php b/app/Http/Controller/ExceptionController.php index 0fe8f281..2599ee61 100644 --- a/app/Http/Controller/ExceptionController.php +++ b/app/Http/Controller/ExceptionController.php @@ -1,4 +1,12 @@ toArray(); - User::db("test_error"); - User::db("test_error")->find($id); + User::db('test_error'); + User::db('test_error')->find($id); }); - User::db("test_error"); - User::db("test_error")->find($id); + User::db('test_error'); + User::db('test_error')->find($id); return $user; } @@ -237,7 +244,7 @@ public function insertId2(): bool public function desc(): array { $desc = new Desc(); - $desc->setDesc("desc"); + $desc->setDesc('desc'); $desc->save(); return Desc::find($desc->getId())->toArray(); @@ -257,4 +264,4 @@ public function getId(): int return $user->getId(); } -} \ No newline at end of file +} diff --git a/app/Http/Controller/TaskController.php b/app/Http/Controller/TaskController.php index 0168e143..241f8b64 100644 --- a/app/Http/Controller/TaskController.php +++ b/app/Http/Controller/TaskController.php @@ -1,5 +1,12 @@ getId(); Redis::set("$id", $user->toArray()); - Log::info("用户ID=" . $id . " timerId=" . $timerId); + Log::info('用户ID=' . $id . ' timerId=' . $timerId); sgo(function () use ($id) { $user = User::find($id)->toArray(); Log::info(JsonHelper::encode($user)); @@ -66,7 +73,7 @@ public function tick(): array $id = $user->getId(); Redis::set("$id", $user->toArray()); - Log::info("用户ID=" . $id . " timerId=" . $timerId); + Log::info('用户ID=' . $id . ' timerId=' . $timerId); sgo(function () use ($id) { $user = User::find($id)->toArray(); Log::info(JsonHelper::encode($user)); @@ -76,4 +83,4 @@ public function tick(): array return ['tick']; } -} \ No newline at end of file +} diff --git a/app/Http/Controller/ValidatorController.php b/app/Http/Controller/ValidatorController.php index 213e3143..a0f6a95f 100644 --- a/app/Http/Controller/ValidatorController.php +++ b/app/Http/Controller/ValidatorController.php @@ -1,4 +1,12 @@ getParsedBody(); } @@ -39,7 +47,7 @@ function validateAll(Request $request): array * * @return array */ - function validateType(Request $request): array + public function validateType(Request $request): array { return $request->getParsedBody(); } @@ -54,7 +62,7 @@ function validateType(Request $request): array * * @return array */ - function validatePassword(Request $request): array + public function validatePassword(Request $request): array { return $request->getParsedBody(); } @@ -69,7 +77,7 @@ function validatePassword(Request $request): array * * @return array */ - function validateCustomer(Request $request): array + public function validateCustomer(Request $request): array { return $request->getParsedBody(); } diff --git a/app/Http/Controller/ViewController.php b/app/Http/Controller/ViewController.php index 56797e4c..99f12436 100644 --- a/app/Http/Controller/ViewController.php +++ b/app/Http/Controller/ViewController.php @@ -1,5 +1,12 @@ agent->deregisterService('swoft'); } -} \ No newline at end of file +} diff --git a/app/Listener/ModelSavedListener.php b/app/Listener/ModelSavedListener.php index d9cc9be0..191ddb35 100644 --- a/app/Listener/ModelSavedListener.php +++ b/app/Listener/ModelSavedListener.php @@ -1,5 +1,12 @@ agent->registerService($service); // CLog::info('Swoft http register service success by consul!'); - } -} \ No newline at end of file +} diff --git a/app/Listener/Test/ShutDownListener.php b/app/Listener/Test/ShutDownListener.php index 56cd6f4b..4853cc3f 100644 --- a/app/Listener/Test/ShutDownListener.php +++ b/app/Listener/Test/ShutDownListener.php @@ -1,9 +1,15 @@ updateTime; } - } diff --git a/app/Model/Entity/Count2.php b/app/Model/Entity/Count2.php index 71f4ed65..1ab210e6 100644 --- a/app/Model/Entity/Count2.php +++ b/app/Model/Entity/Count2.php @@ -1,9 +1,15 @@ attributes = $attributes; } -} \ No newline at end of file +} diff --git a/app/Model/Entity/Desc.php b/app/Model/Entity/Desc.php index b9e0254d..df3e1a48 100644 --- a/app/Model/Entity/Desc.php +++ b/app/Model/Entity/Desc.php @@ -1,5 +1,12 @@ desc = $desc; } -} \ No newline at end of file +} diff --git a/app/Model/Entity/User.php b/app/Model/Entity/User.php index abc07444..67e40020 100644 --- a/app/Model/Entity/User.php +++ b/app/Model/Entity/User.php @@ -1,5 +1,12 @@ testJson; } - } diff --git a/app/Model/Entity/User3.php b/app/Model/Entity/User3.php index f310c2c0..07195bbd 100644 --- a/app/Model/Entity/User3.php +++ b/app/Model/Entity/User3.php @@ -1,15 +1,20 @@ userDesc = $userDesc; } -} \ No newline at end of file +} diff --git a/app/Model/Logic/ApolloLogic.php b/app/Model/Logic/ApolloLogic.php index 1316b622..1e6421b5 100644 --- a/app/Model/Logic/ApolloLogic.php +++ b/app/Model/Logic/ApolloLogic.php @@ -1,5 +1,12 @@ kv->get('/test/my/key'); var_dump($response->getBody(), $response->getResult()); } -} \ No newline at end of file +} diff --git a/app/Model/Logic/LimiterLogic.php b/app/Model/Logic/LimiterLogic.php index 90cec5fd..57c79bd6 100644 --- a/app/Model/Logic/LimiterLogic.php +++ b/app/Model/Logic/LimiterLogic.php @@ -1,5 +1,12 @@ handle($request); } -} \ No newline at end of file +} diff --git a/app/Rpc/Service/UserService.php b/app/Rpc/Service/UserService.php index cd30e12c..10123836 100644 --- a/app/Rpc/Service/UserService.php +++ b/app/Rpc/Service/UserService.php @@ -1,9 +1,15 @@ getTaskUniqid()); } -} \ No newline at end of file +} diff --git a/app/Task/Task/SyncTask.php b/app/Task/Task/SyncTask.php index 3c68b5ec..8f3441b9 100644 --- a/app/Task/Task/SyncTask.php +++ b/app/Task/Task/SyncTask.php @@ -1,5 +1,12 @@ Date: Fri, 13 Sep 2019 23:49:38 +0800 Subject: [PATCH 097/211] optimization demo database --- app/Listener/RanListener.php | 41 +---------- app/Migration/AddUser.php | 58 --------------- app/Migration/{AddMsg.php => User.php} | 7 +- app/Model/Entity/User.php | 72 +++---------------- app/bean.php | 2 +- composer.json | 3 +- database/AutoLoader.php | 43 +++++++++++ database/Migration/Count.php | 53 ++++++++++++++ .../Migration/Desc.php | 26 ++++--- 9 files changed, 125 insertions(+), 180 deletions(-) delete mode 100644 app/Migration/AddUser.php rename app/Migration/{AddMsg.php => User.php} (88%) create mode 100644 database/AutoLoader.php create mode 100644 database/Migration/Count.php rename app/Migration/Message.php => database/Migration/Desc.php (62%) diff --git a/app/Listener/RanListener.php b/app/Listener/RanListener.php index c1c5bcea..a9f77fd0 100644 --- a/app/Listener/RanListener.php +++ b/app/Listener/RanListener.php @@ -34,45 +34,8 @@ public function handle(EventInterface $event): void $querySql = $event->getParam(0); $bindings = $event->getParam(1); - $rawSql = $this->getRawSql($querySql, $bindings, $connection); + $rawSql = $connection->getRawSql($querySql, $bindings); -// output()->info($rawSql); - } - - /** - * Returns the raw SQL by inserting parameter values into the corresponding placeholders in [[sql]]. - * Note that the return value of this method should mainly be used for logging purpose. - * It is likely that this method returns an invalid SQL due to improper replacement of parameter placeholders. - * - * @param string $sql - * @param array $bindings - * @param Connection $connection - * - * @return string the raw SQL with parameter values inserted into the corresponding placeholders in [[sql]]. - */ - public function getRawSql(string $sql, array $bindings, Connection $connection) - { - if (empty($bindings)) { - return $sql; - } - foreach ($bindings as $name => $value) { - if (is_int($name)) { - $name = '?'; - } - - if (is_string($value) || is_array($value)) { - $param = $connection->getQueryGrammar()->quoteString($value); - } elseif (is_bool($value)) { - $param = ($value ? 'TRUE' : 'FALSE'); - } elseif ($value === null) { - $param = 'NULL'; - } else { - $param = (string)$value; - } - - $sql = StringHelper::replaceFirst($name, $param, $sql); - } - - return $sql; + // output()->info($rawSql); } } diff --git a/app/Migration/AddUser.php b/app/Migration/AddUser.php deleted file mode 100644 index acba4585..00000000 --- a/app/Migration/AddUser.php +++ /dev/null @@ -1,58 +0,0 @@ -increments('id'); - $blueprint->smallInteger('age'); - $blueprint->string('label', 10); - $blueprint->integer('balance'); - }); - - Schema::getSchemaBuilder('db.pool')->table('user', function (Blueprint $blueprint) { - $blueprint->comment('base user tables'); - }); - } - - /** - * @return void - * - * @throws ReflectionException - * @throws ContainerException - * @throws DbException - */ - public function down(): void - { - Schema::dropIfExists('users'); - - Schema::getSchemaBuilder('db.pool')->dropIfExists('users'); - } -} diff --git a/app/Migration/AddMsg.php b/app/Migration/User.php similarity index 88% rename from app/Migration/AddMsg.php rename to app/Migration/User.php index 3fd8b10d..6fc64539 100644 --- a/app/Migration/AddMsg.php +++ b/app/Migration/User.php @@ -14,7 +14,7 @@ * * @Migration(20190630164222) */ -class AddMsg extends BaseMigration +class User extends BaseMigration { /** * @return void @@ -22,12 +22,13 @@ class AddMsg extends BaseMigration public function up(): void { $sql = <<execute($dropSql); } diff --git a/app/Model/Entity/User.php b/app/Model/Entity/User.php index abc07444..3ff2ffa9 100644 --- a/app/Model/Entity/User.php +++ b/app/Model/Entity/User.php @@ -10,7 +10,7 @@ /** - * + * * Class User * * @since 2.0 @@ -20,65 +20,45 @@ class User extends Model { /** - * * @Id() + * * @Column() + * * @var int|null */ private $id; /** - * - * * @Column() + * * @var string */ private $name; /** - * - * * @Column() + * * @var int */ private $age; /** - * - * * @Column(hidden=true) + * * @var string */ private $password; /** - * - * * @Column(name="user_desc", prop="userDesc") + * * @var string */ private $userDesc; /** - * - * - * @Column() - * @var int|null - */ - private $add; - - /** - * - * - * @Column() - * @var int|null - */ - private $hahh; - - /** - * - * * @Column(name="test_json", prop="testJson") + * * @var array|null */ private $testJson; @@ -134,26 +114,6 @@ public function setUserDesc(string $userDesc): void $this->userDesc = $userDesc; } - /** - * @param int|null $add - * - * @return void - */ - public function setAdd(?int $add): void - { - $this->add = $add; - } - - /** - * @param int|null $hahh - * - * @return void - */ - public function setHahh(?int $hahh): void - { - $this->hahh = $hahh; - } - /** * @param array|null $testJson * @@ -204,22 +164,6 @@ public function getUserDesc(): string return $this->userDesc; } - /** - * @return int|null - */ - public function getAdd(): ?int - { - return $this->add; - } - - /** - * @return int|null - */ - public function getHahh(): ?int - { - return $this->hahh; - } - /** * @return array|null */ diff --git a/app/bean.php b/app/bean.php index 924704c0..b6a8aa85 100644 --- a/app/bean.php +++ b/app/bean.php @@ -91,7 +91,7 @@ 'database' => bean('db3') ], 'migrationManager' => [ - 'migrationPath' => '@app/Migration', + 'migrationPath' => '@database/Migration', ], 'redis' => [ 'class' => RedisDb::class, diff --git a/composer.json b/composer.json index 7a1d5d46..095fe9ef 100644 --- a/composer.json +++ b/composer.json @@ -41,7 +41,8 @@ }, "autoload": { "psr-4": { - "App\\": "app/" + "App\\": "app/", + "Database\\": "database/" }, "files": [ "app/Helper/Functions.php" diff --git a/database/AutoLoader.php b/database/AutoLoader.php new file mode 100644 index 00000000..3ad86973 --- /dev/null +++ b/database/AutoLoader.php @@ -0,0 +1,43 @@ + __DIR__, + ]; + } + + /** + * @return array + */ + public function metadata(): array + { + return []; + } +} diff --git a/database/Migration/Count.php b/database/Migration/Count.php new file mode 100644 index 00000000..a43bfd3f --- /dev/null +++ b/database/Migration/Count.php @@ -0,0 +1,53 @@ +schema->createIfNotExists('count', function (Blueprint $blueprint) { + $blueprint->comment('user count comment ...'); + + $blueprint->increments('id')->comment('primary'); + $blueprint->integer('user_id')->default('0')->comment('user table primary'); + $blueprint->integer('create_time')->default('0')->comment('create time'); + $blueprint->timestamp('update_time')->comment('update timestamp'); + + $blueprint->index(['user_id', 'create_time']); + + $blueprint->engine = 'Innodb'; + $blueprint->charset = 'utf8mb4'; + }); + } + + /** + * @throws ReflectionException + * @throws ContainerException + * @throws DbException + */ + public function down(): void + { + $this->schema->dropIfExists('count'); + } +} diff --git a/app/Migration/Message.php b/database/Migration/Desc.php similarity index 62% rename from app/Migration/Message.php rename to database/Migration/Desc.php index c5b4bb05..b8415b1a 100644 --- a/app/Migration/Message.php +++ b/database/Migration/Desc.php @@ -1,7 +1,7 @@ schema->createIfNotExists('messages', function (Blueprint $blueprint) { + $this->schema->createIfNotExists('desc', function (Blueprint $blueprint) { + $blueprint->comment = 'user desc'; + $blueprint->increments('id'); - $blueprint->text('content'); - $blueprint->timestamps(); + $blueprint->string('desc', 30); }); } /** - * @return void - * - * @throws ReflectionException * @throws ContainerException * @throws DbException + * @throws ReflectionException */ public function down(): void { - $this->schema->dropIfExists('messages'); + + $this->schema->dropIfExists('desc'); } } From 283ee7663e000cd995b75876245f9749999d70e0 Mon Sep 17 00:00:00 2001 From: Inhere Date: Sat, 14 Sep 2019 10:02:09 +0800 Subject: [PATCH 098/211] up: revert vendor/bin/phpstan analyze --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 955f5c1b..ebc8174c 100644 --- a/composer.json +++ b/composer.json @@ -58,6 +58,7 @@ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], "test": [ + "./vendor/bin/phpstan analyze", "./vendor/bin/phpunit -c phpunit.xml" ], "cs-fix": "./bin/php-cs-fixer fix --dry-run --diff --diff-format=udiff" From dd32a74bf93204da87efb648e8b182c1c92116c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Sz=C3=A9pe?= Date: Sat, 14 Sep 2019 04:24:00 +0200 Subject: [PATCH 099/211] Follow changes in swoole-ide-helper /src -> /output --- phpstan.neon.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 4a69c118..1691c3ee 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -8,7 +8,7 @@ parameters: autoload_files: - %currentWorkingDirectory%/test/bootstrap.php autoload_directories: - - %currentWorkingDirectory%/vendor/swoft/swoole-ide-helper/src/namespace/ + - %currentWorkingDirectory%/vendor/swoft/swoole-ide-helper/output/namespace/ dynamicConstantNames: - APP_DEBUG ignoreErrors: From 914918fc2bbd5efd4cb0f4b91c13e50b13881dc5 Mon Sep 17 00:00:00 2001 From: Inhere Date: Sun, 15 Sep 2019 10:43:42 +0800 Subject: [PATCH 100/211] fix phpstan error --- app/WebSocket/Test/TestController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/WebSocket/Test/TestController.php b/app/WebSocket/Test/TestController.php index ad489a30..c6080d57 100644 --- a/app/WebSocket/Test/TestController.php +++ b/app/WebSocket/Test/TestController.php @@ -86,7 +86,7 @@ public function injectMessage(Message $msg): void /** * Message command is: 'echo' * - * @param $data + * @param string $data * @MessageMapping(root=true) */ public function echo($data): void @@ -117,7 +117,7 @@ public function hi(Request $req, Response $res): void /** * Message command is: 'bin' * - * @param $data + * @param string $data * @MessageMapping("bin", root=true) */ public function binary($data): void @@ -138,7 +138,7 @@ public function pong(): void /** * Message command is: 'test.ar' * - * @param $data + * @param string $data * @MessageMapping("ar") * * @return string From 7a905f1feb93d3ba04ff9a839842be31515ee4bb Mon Sep 17 00:00:00 2001 From: Inhere Date: Sun, 15 Sep 2019 11:03:41 +0800 Subject: [PATCH 101/211] Update phpstan.neon.dist --- phpstan.neon.dist | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 1691c3ee..d8ee581c 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -14,6 +14,8 @@ parameters: ignoreErrors: # Variable type - '#^Call to an undefined method Swoft\\Contract\\ContextInterface::get\S+\(\)\.$#' + - '#^Call to an undefined method Swoft\\Session\\SessionInterface::push\(\)#' + - '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' # These are ignored for now - path: %currentWorkingDirectory%/app/Exception/Handler/WsMessageExceptionHandler.php @@ -48,6 +50,3 @@ parameters: - path: %currentWorkingDirectory%/app/WebSocket/ChatModule.php message: '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' - - - path: %currentWorkingDirectory%/app/WebSocket/EchoModule.php - message: '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' From a182d9e140e1f7530ea917f42acd7cf335918772 Mon Sep 17 00:00:00 2001 From: Inhere Date: Sun, 15 Sep 2019 11:24:47 +0800 Subject: [PATCH 102/211] fix phpstan analyze error --- phpstan.neon.dist | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index d8ee581c..a3981a6c 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -15,11 +15,11 @@ parameters: # Variable type - '#^Call to an undefined method Swoft\\Contract\\ContextInterface::get\S+\(\)\.$#' - '#^Call to an undefined method Swoft\\Session\\SessionInterface::push\(\)#' + - '#^Call to an undefined method Swoft\\Session\\SessionInterface::getFd\(\)#' - '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' + - '#^Call to an undefined method Swoft\\Server\\Server::disconnect\(\)\.$#' + - '#^Call to an undefined method Psr\Http\Message\ServerRequestInterface::getUriPath\(\)#' # These are ignored for now - - - path: %currentWorkingDirectory%/app/Exception/Handler/WsMessageExceptionHandler.php - message: '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' - path: %currentWorkingDirectory%/app/Http/Controller/DbModelController.php message: '#^Method App\\Http\\Controller\\DbModelController::getId\(\) should return int but returns int\|null\.$#' @@ -44,9 +44,4 @@ parameters: - path: %currentWorkingDirectory%/app/Validator/Rule/AlphaDashRule.php message: '#^Call to an undefined method object::getMessage\(\)\.$#' - - - path: %currentWorkingDirectory%/app/WebSocket/Chat/HomeController.php - message: '#^Call to an undefined method Swoft\\Session\\SessionInterface::push\(\)\.$#' - - - path: %currentWorkingDirectory%/app/WebSocket/ChatModule.php - message: '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' + From 0ac96207ed2f9ead28b308fb7b2e20ec9014d95e Mon Sep 17 00:00:00 2001 From: Inhere Date: Sun, 15 Sep 2019 12:04:02 +0800 Subject: [PATCH 103/211] Update phpstan.neon.dist --- phpstan.neon.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index a3981a6c..a0b60b58 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -18,7 +18,7 @@ parameters: - '#^Call to an undefined method Swoft\\Session\\SessionInterface::getFd\(\)#' - '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' - '#^Call to an undefined method Swoft\\Server\\Server::disconnect\(\)\.$#' - - '#^Call to an undefined method Psr\Http\Message\ServerRequestInterface::getUriPath\(\)#' + - '#^Call to an undefined method\sPsr\\Http\\Message\\ServerRequestInterface::getUriPath\(\)#' # These are ignored for now - path: %currentWorkingDirectory%/app/Http/Controller/DbModelController.php From ca25c71263993be34bfb44ada5e54c91522ef2cb Mon Sep 17 00:00:00 2001 From: Inhere Date: Tue, 17 Sep 2019 17:25:12 +0800 Subject: [PATCH 104/211] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..dd84ea78 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. From 321991de5657b5555f04bd31d9831bb3bff2b41a Mon Sep 17 00:00:00 2001 From: Inhere Date: Tue, 17 Sep 2019 19:01:11 +0800 Subject: [PATCH 105/211] Update bug_report.md --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index dd84ea78..689db0a8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,32 +7,34 @@ assignees: '' --- +| Q | A +| ------------------- | ----- +| Bug report? | yes/no +| Feature request? | yes/no +| Swoft version | x.y.z +| Swoole version | x.y.z (by `php --ri swoole`) +| PHP version | x.y.z (by `php -v`) +| Runtime environment | Win10/Mac/CentOS 7/Ubuntu/Docker etc. + **Describe the bug** A clear and concise description of what the bug is. -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] +**Details** + +> Describe what you are trying to achieve and what goes wrong. + +```php +// paste output here +``` -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] +> Provide minimal script to reproduce the issue -**Additional context** -Add any other context about the problem here. +```php +// paste code +``` From afa80504b5e4c28f24da419d4b5bfea2bfb7bd80 Mon Sep 17 00:00:00 2001 From: Inhere Date: Tue, 17 Sep 2019 19:01:34 +0800 Subject: [PATCH 106/211] Delete ISSUE_TEMPLATE.md --- .github/ISSUE_TEMPLATE.md | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index be97a863..00000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,23 +0,0 @@ -| Q | A -| ------------------- | ----- -| Bug report? | yes/no -| Feature request? | yes/no -| Swoft version | x.y.z -| Swoole version | x.y.z (by `php --ri swoole`) -| PHP version | x.y.z (by `php -v`) -| Runtime environment | Win10/Mac/CentOS 7/Ubuntu/Docker etc. - -**Details** - -> Describe what you are trying to achieve and what goes wrong. - -```php -// paste output here -``` - -> Provide minimal script to reproduce the issue - -```php -// paste code -``` - From a558f1e0d2c4bafc7d5d26e12cf3dce7aef174f4 Mon Sep 17 00:00:00 2001 From: Inhere Date: Tue, 17 Sep 2019 21:16:34 +0800 Subject: [PATCH 107/211] Create CONTRIBUTING.md --- CONTRIBUTING.md | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..b2b3990b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,65 @@ +# CONTRIBUTING + +## Contributing code via Github + +Swoft currently uses Git to control the version of the program. If you want to contribute source code to Swoft, please get an overview of how Git is used. We currently host the project on GitHub, and any GitHub user can contribute code to us. + +The way to participate is very simple, fork a swoft-component or swoft-ext code into your warehouse, modify and submit, and send us a pull request, we will promptly review the code and process your application. After the review, your code will be merged into our repository, so you will automatically appear on the contributor list, very convenient. + +We hope that the code you contributed will be: + +- Swoft's coding specification +- Appropriate comments that others can read +- Follow the Apache2 open source protocol +- Submit a commit message must be in English + +> If you would like more details or have any questions, please continue reading below + +Precautions + +- PSR-2 is selected for the code formatting standard of this project; +- class name and class file name follow PSR-4; +- For the processing of Issues, use the commit title such as `fix swoft-cloud/swoft#xxx(Issue ID)` to directly close the issue. +- The system will automatically test and modify on PHP 7.1+ (`7.1 7.2 7.3`) Swoole 4.4.1+ +- The administrator will not merge the changes that caused CI faild. If CI faild appears, please check your source code or modify the corresponding unit test file. + +## GitHub Issue + +GitHub provides the Issue feature, which can be used to: + +- Raise a bug +- propose functional improvements +- Feedback experience + +This feature should not be used for: + +- Unfriendly remarks + +## Quick modification + +GitHub provides the ability to quickly edit files + +- Log in to your GitHub account; +- Browse the project file and find the file to be modified; +- Click the pencil icon in the upper right corner to modify it; +- Fill in Commit changes related content (Title is required) +- Submit changes, wait for CI verification and administrator merge. + +> This method is suitable for modifying the document project. If you need to submit a large number of changes at once, please continue reading the following + +## Complete process + +- fork swoft-component or swoft-ext project; +- Clone your fork project to the local; +- Create a new branch and checkout the new branch; +- Make changes. If your changes include additions or subtractions of methods or functions, please remember to modify the unit test file. +- Push your local repository to GitHub; +- submit a pull request; +- Wait for CI verification (if you don't pass, you need to fix the code yourself, GitHub will automatically update your pull request); +- Waiting for administrator processing + +## Precautions + +If you have any questions about the above process, please check out the GIT tutorial; + +For different aspects of the code, create different branches in your own fork project. From 98c69d69b1a0e1458c662ac12457fb9126246774 Mon Sep 17 00:00:00 2001 From: inhere Date: Fri, 20 Sep 2019 13:27:05 +0800 Subject: [PATCH 108/211] fix: phpcs and phpstan error --- .php_cs | 2 +- app/Http/Controller/ExceptionController.php | 1 - app/Listener/DeregisterServiceListener.php | 6 +----- app/WebSocket/Test/TestController.php | 6 ++++-- phpstan.neon.dist | 2 +- 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/.php_cs b/.php_cs index 15759a97..9c552f9e 100644 --- a/.php_cs +++ b/.php_cs @@ -29,7 +29,7 @@ return PhpCsFixer\Config::create() ->setFinder( PhpCsFixer\Finder::create() ->exclude('public') - ->exclude('resources') + ->exclude('resource') ->exclude('config') ->exclude('runtime') ->exclude('vendor') diff --git a/app/Http/Controller/ExceptionController.php b/app/Http/Controller/ExceptionController.php index 812d891b..8a0c1a6e 100644 --- a/app/Http/Controller/ExceptionController.php +++ b/app/Http/Controller/ExceptionController.php @@ -17,7 +17,6 @@ use Throwable; use function trigger_error; use const E_USER_ERROR; -use const E_USER_NOTICE; /** * @Controller(prefix="ex") diff --git a/app/Listener/DeregisterServiceListener.php b/app/Listener/DeregisterServiceListener.php index 4b3c5c80..c863c456 100644 --- a/app/Listener/DeregisterServiceListener.php +++ b/app/Listener/DeregisterServiceListener.php @@ -10,12 +10,8 @@ namespace App\Listener; -use ReflectionException; use Swoft\Bean\Annotation\Mapping\Inject; -use Swoft\Bean\Exception\ContainerException; use Swoft\Consul\Agent; -use Swoft\Consul\Exception\ClientException; -use Swoft\Consul\Exception\ServerException; use Swoft\Event\Annotation\Mapping\Listener; use Swoft\Event\EventHandlerInterface; use Swoft\Event\EventInterface; @@ -46,6 +42,6 @@ public function handle(EventInterface $event): void /** @var HttpServer $httpServer */ $httpServer = $event->getTarget(); - $this->agent->deregisterService('swoft'); + $this->agent->deregisterService('swoft'); } } diff --git a/app/WebSocket/Test/TestController.php b/app/WebSocket/Test/TestController.php index 8235e476..0b7ab9a0 100644 --- a/app/WebSocket/Test/TestController.php +++ b/app/WebSocket/Test/TestController.php @@ -13,6 +13,7 @@ use Swoft\Session\Session; use Swoft\WebSocket\Server\Annotation\Mapping\MessageMapping; use Swoft\WebSocket\Server\Annotation\Mapping\WsController; +use Swoft\WebSocket\Server\Connection; use Swoft\WebSocket\Server\Message\Message; use Swoft\WebSocket\Server\Message\Request; use Swoft\WebSocket\Server\Message\Response; @@ -48,6 +49,7 @@ public function index(): void public function close(Message $msg): void { $data = $msg->getData(); + /** @var Connection $conn */ $conn = Session::mustGet(); $fd = is_numeric($data) ? (int)$data : $conn->getFd(); @@ -120,8 +122,8 @@ public function hi(Request $req, Response $res): void /** * Message command is: 'bin' * - * @param $data * @MessageMapping("bin", root=true, opcode=2) + * @param string $data * * @return string */ @@ -144,8 +146,8 @@ public function pong(): void /** * Message command is: 'test.ar' * - * @param string $data * @MessageMapping("ar") + * @param string $data * * @return string */ diff --git a/phpstan.neon.dist b/phpstan.neon.dist index a0b60b58..249e6daa 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -17,7 +17,7 @@ parameters: - '#^Call to an undefined method Swoft\\Session\\SessionInterface::push\(\)#' - '#^Call to an undefined method Swoft\\Session\\SessionInterface::getFd\(\)#' - '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' - - '#^Call to an undefined method Swoft\\Server\\Server::disconnect\(\)\.$#' + # - '#^Call to an undefined method Swoft\\Server\\Server::disconnect\(\)\.$#' - '#^Call to an undefined method\sPsr\\Http\\Message\\ServerRequestInterface::getUriPath\(\)#' # These are ignored for now - From a5175ad30ca98b99eb7b9a1dfd8b10b878c9c199 Mon Sep 17 00:00:00 2001 From: zhenghongyang Date: Fri, 20 Sep 2019 14:14:13 +0800 Subject: [PATCH 109/211] add database unit --- .github/ISSUE_TEMPLATE/bug_report.md | 40 ++++++++++++++ CONTRIBUTING.md | 65 +++++++++++++++++++++++ app/Console/Command/TestCommand.php | 4 +- app/Http/Controller/DbModelController.php | 51 +++++++++++++++++- app/Migration/User.php | 2 +- 5 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 CONTRIBUTING.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..689db0a8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,40 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +| Q | A +| ------------------- | ----- +| Bug report? | yes/no +| Feature request? | yes/no +| Swoft version | x.y.z +| Swoole version | x.y.z (by `php --ri swoole`) +| PHP version | x.y.z (by `php -v`) +| Runtime environment | Win10/Mac/CentOS 7/Ubuntu/Docker etc. + +**Describe the bug** +A clear and concise description of what the bug is. + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Details** + +> Describe what you are trying to achieve and what goes wrong. + +```php +// paste output here +``` + +> Provide minimal script to reproduce the issue + +```php +// paste code +``` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..b2b3990b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,65 @@ +# CONTRIBUTING + +## Contributing code via Github + +Swoft currently uses Git to control the version of the program. If you want to contribute source code to Swoft, please get an overview of how Git is used. We currently host the project on GitHub, and any GitHub user can contribute code to us. + +The way to participate is very simple, fork a swoft-component or swoft-ext code into your warehouse, modify and submit, and send us a pull request, we will promptly review the code and process your application. After the review, your code will be merged into our repository, so you will automatically appear on the contributor list, very convenient. + +We hope that the code you contributed will be: + +- Swoft's coding specification +- Appropriate comments that others can read +- Follow the Apache2 open source protocol +- Submit a commit message must be in English + +> If you would like more details or have any questions, please continue reading below + +Precautions + +- PSR-2 is selected for the code formatting standard of this project; +- class name and class file name follow PSR-4; +- For the processing of Issues, use the commit title such as `fix swoft-cloud/swoft#xxx(Issue ID)` to directly close the issue. +- The system will automatically test and modify on PHP 7.1+ (`7.1 7.2 7.3`) Swoole 4.4.1+ +- The administrator will not merge the changes that caused CI faild. If CI faild appears, please check your source code or modify the corresponding unit test file. + +## GitHub Issue + +GitHub provides the Issue feature, which can be used to: + +- Raise a bug +- propose functional improvements +- Feedback experience + +This feature should not be used for: + +- Unfriendly remarks + +## Quick modification + +GitHub provides the ability to quickly edit files + +- Log in to your GitHub account; +- Browse the project file and find the file to be modified; +- Click the pencil icon in the upper right corner to modify it; +- Fill in Commit changes related content (Title is required) +- Submit changes, wait for CI verification and administrator merge. + +> This method is suitable for modifying the document project. If you need to submit a large number of changes at once, please continue reading the following + +## Complete process + +- fork swoft-component or swoft-ext project; +- Clone your fork project to the local; +- Create a new branch and checkout the new branch; +- Make changes. If your changes include additions or subtractions of methods or functions, please remember to modify the unit test file. +- Push your local repository to GitHub; +- submit a pull request; +- Wait for CI verification (if you don't pass, you need to fix the code yourself, GitHub will automatically update your pull request); +- Waiting for administrator processing + +## Precautions + +If you have any questions about the above process, please check out the GIT tutorial; + +For different aspects of the code, create different branches in your own fork project. diff --git a/app/Console/Command/TestCommand.php b/app/Console/Command/TestCommand.php index d6d24732..77f8a392 100644 --- a/app/Console/Command/TestCommand.php +++ b/app/Console/Command/TestCommand.php @@ -91,6 +91,8 @@ private function uris(): array '/dbModel/delete', '/dbModel/save', '/dbModel/batchUpdate', + '/dbModel/batchUpdateOrInsert', + '/dbModel/propWhere', '/selectDb/modelNotExistDb', '/selectDb/queryNotExistDb', '/selectDb/dbNotExistDb', @@ -98,7 +100,7 @@ private function uris(): array '/selectDb/queryDb', '/selectDb/dbDb', '/selectDb/select', - '/builder/schema' + '/builder/schema', ], 'task' => [ '/task/getListByCo', diff --git a/app/Http/Controller/DbModelController.php b/app/Http/Controller/DbModelController.php index 777a881f..c25e291d 100644 --- a/app/Http/Controller/DbModelController.php +++ b/app/Http/Controller/DbModelController.php @@ -77,7 +77,7 @@ public function update(): array { $id = $this->getId(); - User::updateOrInsert(['id' => $id], ['name' => 'swoft']); + User::updateOrInsert(['id' => $id], ['name' => 'swoft', 'userDesc' => 'swoft']); $user = User::find($id); @@ -120,7 +120,7 @@ public function getId(): int * @return array * @throws Throwable */ - public function batchUpdate() + public function batchUpdate(): array { // User::truncate(); User::updateOrCreate(['id' => 1], ['age' => 23]); @@ -148,4 +148,51 @@ public function batchUpdate() return $updateResults; } + + /** + * @RequestMapping() + * + * @return array + * @throws Throwable + */ + public function propWhere(): array + { + $id = $this->getId(); + + User::updateOrInsert(['id' => $id], ['userDesc' => 'swoft']); + + $user = User::whereProp(['userDesc' => 'swoft'])->first(); + + return $user->toArray(); + } + + /** + * @RequestMapping() + * + * @return bool + * @throws Throwable + */ + public function batchUpdateOrInsert(): bool + { + $values = [ + [ + 'age' => 18, + 'user_desc' => 'swoft' . random_int(1, 2), + 'test_json' => [] + ], + [ + 'age' => 19, + 'user_desc' => 'swoft1' . random_int(2, 3), + 'test_json' => null + ], + [ + 'age' => 20, + 'user_desc' => 'swoft2' . random_int(4, 6), + 'test_json' => ['test' => 1] + ], + ]; + $baseWhere = ['age' => [18, 19, 20]]; + + return User::batchUpdateOrInsert($values, $baseWhere, ['user_desc'], ['user_desc']); + } } diff --git a/app/Migration/User.php b/app/Migration/User.php index c01ea114..2292766d 100644 --- a/app/Migration/User.php +++ b/app/Migration/User.php @@ -28,7 +28,7 @@ class User extends BaseMigration public function up(): void { $sql = << Date: Fri, 20 Sep 2019 23:05:25 +0800 Subject: [PATCH 110/211] fix dbmodel demo --- app/Http/Controller/DbModelController.php | 2 +- app/Listener/RanListener.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controller/DbModelController.php b/app/Http/Controller/DbModelController.php index c25e291d..cba16791 100644 --- a/app/Http/Controller/DbModelController.php +++ b/app/Http/Controller/DbModelController.php @@ -191,7 +191,7 @@ public function batchUpdateOrInsert(): bool 'test_json' => ['test' => 1] ], ]; - $baseWhere = ['age' => [18, 19, 20]]; + $baseWhere = ['age' => 18]; return User::batchUpdateOrInsert($values, $baseWhere, ['user_desc'], ['user_desc']); } diff --git a/app/Listener/RanListener.php b/app/Listener/RanListener.php index d9bd9549..a0e7c4fe 100644 --- a/app/Listener/RanListener.php +++ b/app/Listener/RanListener.php @@ -42,6 +42,6 @@ public function handle(EventInterface $event): void $rawSql = $connection->getRawSql($querySql, $bindings); - // output()->info($rawSql); + //output()->info($rawSql); } } From 47730666baaae79b2b1d150a57c69741a2457a80 Mon Sep 17 00:00:00 2001 From: stelin <794774870@qq.com> Date: Fri, 20 Sep 2019 23:11:05 +0800 Subject: [PATCH 111/211] modify bean.php --- app/bean.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/bean.php b/app/bean.php index 924704c0..e3a0c768 100644 --- a/app/bean.php +++ b/app/bean.php @@ -25,8 +25,8 @@ 'logFile' => '@runtime/logs/error-%d{Y-m-d}.log', ], 'logger' => [ - 'flushRequest' => true, - 'enable' => true, + 'flushRequest' => false, + 'enable' => false, 'json' => false, ], 'httpServer' => [ From ce4c73ce9537dd8126020e9377867147dea4e650 Mon Sep 17 00:00:00 2001 From: zhenghongyang Date: Sat, 21 Sep 2019 01:00:34 +0800 Subject: [PATCH 112/211] close --- app/Listener/DeregisterServiceListener.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Listener/DeregisterServiceListener.php b/app/Listener/DeregisterServiceListener.php index c863c456..7fbc1340 100644 --- a/app/Listener/DeregisterServiceListener.php +++ b/app/Listener/DeregisterServiceListener.php @@ -42,6 +42,6 @@ public function handle(EventInterface $event): void /** @var HttpServer $httpServer */ $httpServer = $event->getTarget(); - $this->agent->deregisterService('swoft'); + //$this->agent->deregisterService('swoft'); } } From 97c579f7f8cb8fe184472091d51c04ad05fa1959 Mon Sep 17 00:00:00 2001 From: zhenghongyang Date: Sat, 21 Sep 2019 01:08:36 +0800 Subject: [PATCH 113/211] fix --- app/Http/Controller/DbModelController.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/Http/Controller/DbModelController.php b/app/Http/Controller/DbModelController.php index 9d022219..de9a02aa 100644 --- a/app/Http/Controller/DbModelController.php +++ b/app/Http/Controller/DbModelController.php @@ -158,9 +158,7 @@ public function batchUpdate(): array */ public function propWhere(): array { - $id = $this->getId(); - - User::updateOrInsert(['id' => $id], ['userDesc' => 'swoft']); + User::updateOrInsert(['id' => 1000], ['userDesc' => 'swoft']); $user = User::whereProp(['userDesc' => 'swoft'])->first(); From 072a00bb1a07911bc1689458b4445624300ce49d Mon Sep 17 00:00:00 2001 From: zhenghongyang Date: Sat, 21 Sep 2019 01:22:22 +0800 Subject: [PATCH 114/211] remove batch update --- app/Console/Command/TestCommand.php | 1 - app/Http/Controller/DbModelController.php | 30 ----------------------- 2 files changed, 31 deletions(-) diff --git a/app/Console/Command/TestCommand.php b/app/Console/Command/TestCommand.php index 77f8a392..7ad6b094 100644 --- a/app/Console/Command/TestCommand.php +++ b/app/Console/Command/TestCommand.php @@ -91,7 +91,6 @@ private function uris(): array '/dbModel/delete', '/dbModel/save', '/dbModel/batchUpdate', - '/dbModel/batchUpdateOrInsert', '/dbModel/propWhere', '/selectDb/modelNotExistDb', '/selectDb/queryNotExistDb', diff --git a/app/Http/Controller/DbModelController.php b/app/Http/Controller/DbModelController.php index de9a02aa..1eca700b 100644 --- a/app/Http/Controller/DbModelController.php +++ b/app/Http/Controller/DbModelController.php @@ -164,34 +164,4 @@ public function propWhere(): array return $user->toArray(); } - - /** - * @RequestMapping() - * - * @return bool - * @throws Throwable - */ - public function batchUpdateOrInsert(): bool - { - $values = [ - [ - 'age' => 18, - 'user_desc' => 'swoft' . random_int(1, 2), - 'test_json' => [] - ], - [ - 'age' => 19, - 'user_desc' => 'swoft1' . random_int(2, 3), - 'test_json' => null - ], - [ - 'age' => 20, - 'user_desc' => 'swoft2' . random_int(4, 6), - 'test_json' => ['test' => 1] - ], - ]; - $baseWhere = ['age' => 18]; - - return User::batchUpdateOrInsert($values, $baseWhere, ['user_desc'], ['user_desc']); - } } From 46f9ad61c609997089517e56563a4f02a6af7e70 Mon Sep 17 00:00:00 2001 From: Inhere Date: Mon, 23 Sep 2019 11:45:49 +0800 Subject: [PATCH 115/211] up: remove strict_types=1 from bin/swoft --- bin/swoft | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/swoft b/bin/swoft index d50ed832..393af860 100644 --- a/bin/swoft +++ b/bin/swoft @@ -1,5 +1,5 @@ #!/usr/bin/env php - Date: Mon, 23 Sep 2019 17:41:33 +0800 Subject: [PATCH 116/211] update demo class --- app/WebSocket/Chat/HomeController.php | 4 ++-- app/WebSocket/Test/TestController.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/WebSocket/Chat/HomeController.php b/app/WebSocket/Chat/HomeController.php index ee13c418..e4f3e3d5 100644 --- a/app/WebSocket/Chat/HomeController.php +++ b/app/WebSocket/Chat/HomeController.php @@ -38,7 +38,7 @@ public function index(): void * @param string $data * @MessageMapping() */ - public function echo($data): void + public function echo(string $data): void { Session::mustGet()->push('(home.echo)Recv: ' . $data); } @@ -51,7 +51,7 @@ public function echo($data): void * * @return string */ - public function autoReply($data): string + public function autoReply(string $data): string { return '(home.ar)Recv: ' . $data; } diff --git a/app/WebSocket/Test/TestController.php b/app/WebSocket/Test/TestController.php index 0b7ab9a0..960dc67b 100644 --- a/app/WebSocket/Test/TestController.php +++ b/app/WebSocket/Test/TestController.php @@ -94,7 +94,7 @@ public function injectMessage(Message $msg): void * @param string $data * @MessageMapping(root=true) */ - public function echo($data): void + public function echo(string $data): void { Session::mustGet()->push('(echo)Recv: ' . $data); } @@ -127,7 +127,7 @@ public function hi(Request $req, Response $res): void * * @return string */ - public function binary($data): string + public function binary(string $data): string { // Session::mustGet()->push('Binary: ' . $data, \WEBSOCKET_OPCODE_BINARY); return 'Binary: ' . $data; @@ -151,7 +151,7 @@ public function pong(): void * * @return string */ - public function autoReply($data): string + public function autoReply(string $data): string { return '(home.ar)Recv: ' . $data; } From 69f047eeb51082ea9e9f1234adb49ef0cdd1a8a5 Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 23 Sep 2019 18:21:23 +0800 Subject: [PATCH 117/211] update dockerfile and mv crontab folder to app/Task --- Dockerfile | 2 +- app/{ => Task}/Crontab/CronTask.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename app/{ => Task}/Crontab/CronTask.php (97%) diff --git a/Dockerfile b/Dockerfile index 05ae0362..6c3dfb9b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"prod"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=4.3.0 \ - SWOOLE_VERSION=4.4.5 \ + SWOOLE_VERSION=4.4.6 \ COMPOSER_ALLOW_SUPERUSER=1 # Libs -y --no-install-recommends diff --git a/app/Crontab/CronTask.php b/app/Task/Crontab/CronTask.php similarity index 97% rename from app/Crontab/CronTask.php rename to app/Task/Crontab/CronTask.php index 7af95957..4cc3f016 100644 --- a/app/Crontab/CronTask.php +++ b/app/Task/Crontab/CronTask.php @@ -8,7 +8,7 @@ * @license https://github.com/swoft-cloud/swoft/blob/master/LICENSE */ -namespace App\Crontab; +namespace App\Task\Crontab; use Exception; use Swoft\Crontab\Annotaion\Mapping\Cron; From 658afbf3866e2af0fd64daf16bc347a96e827419 Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 23 Sep 2019 18:32:29 +0800 Subject: [PATCH 118/211] fix: php-cs-fixer check error --- app/Listener/RanListener.php | 1 - composer.json | 3 ++- database/AutoLoader.php | 1 - database/Migration/Desc.php | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/Listener/RanListener.php b/app/Listener/RanListener.php index d923528c..242054fd 100644 --- a/app/Listener/RanListener.php +++ b/app/Listener/RanListener.php @@ -15,7 +15,6 @@ use Swoft\Event\Annotation\Mapping\Listener; use Swoft\Event\EventHandlerInterface; use Swoft\Event\EventInterface; -use Swoft\Stdlib\Helper\StringHelper; /** * Class RanListener diff --git a/composer.json b/composer.json index 66d77123..d9c1185c 100644 --- a/composer.json +++ b/composer.json @@ -62,6 +62,7 @@ "./vendor/bin/phpstan analyze", "./vendor/bin/phpunit -c phpunit.xml" ], - "cs-fix": "./bin/php-cs-fixer fix --dry-run --diff --diff-format=udiff" + "cs-fix": "./bin/php-cs-fixer fix --dry-run --diff --diff-format=udiff", + "do-cs-fix": "./bin/php-cs-fixer fix" } } diff --git a/database/AutoLoader.php b/database/AutoLoader.php index fdfa1d21..bc84c55a 100644 --- a/database/AutoLoader.php +++ b/database/AutoLoader.php @@ -20,7 +20,6 @@ */ class AutoLoader extends SwoftComponent { - /** * Class constructor. */ diff --git a/database/Migration/Desc.php b/database/Migration/Desc.php index 322593e0..ee215ff0 100644 --- a/database/Migration/Desc.php +++ b/database/Migration/Desc.php @@ -48,7 +48,6 @@ public function up(): void */ public function down(): void { - $this->schema->dropIfExists('desc'); } } From af27458f6e3c72c6bd4abda9b2c2627bc3a9c28a Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 23 Sep 2019 18:36:15 +0800 Subject: [PATCH 119/211] fix: phpstan check error --- app/Http/Controller/DbModelController.php | 3 ++- phpstan.neon.dist | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Http/Controller/DbModelController.php b/app/Http/Controller/DbModelController.php index 1eca700b..f7e68a6c 100644 --- a/app/Http/Controller/DbModelController.php +++ b/app/Http/Controller/DbModelController.php @@ -160,8 +160,9 @@ public function propWhere(): array { User::updateOrInsert(['id' => 1000], ['userDesc' => 'swoft']); + /** @var User|null $user */ $user = User::whereProp(['userDesc' => 'swoft'])->first(); - return $user->toArray(); + return $user ? $user->toArray() : []; } } diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 249e6daa..8760f4a9 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -14,8 +14,8 @@ parameters: ignoreErrors: # Variable type - '#^Call to an undefined method Swoft\\Contract\\ContextInterface::get\S+\(\)\.$#' - - '#^Call to an undefined method Swoft\\Session\\SessionInterface::push\(\)#' - - '#^Call to an undefined method Swoft\\Session\\SessionInterface::getFd\(\)#' + - '#^Call to an undefined method Swoft\\Contract\\SessionInterface::push\(\)#' + # - '#^Call to an undefined method Swoft\\Session\\SessionInterface::getFd\(\)#' - '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' # - '#^Call to an undefined method Swoft\\Server\\Server::disconnect\(\)\.$#' - '#^Call to an undefined method\sPsr\\Http\\Message\\ServerRequestInterface::getUriPath\(\)#' From 1ae5022a6f03581883555ff230409163386e5371 Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 23 Sep 2019 18:39:47 +0800 Subject: [PATCH 120/211] update .travis.yml --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4d7fae11..90be2efc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ install: - | echo "no" | pecl install -f redis - | - wget https://github.com/swoole/swoole-src/archive/v4.3.3.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - && rm -rf swoole + wget https://github.com/swoole/swoole-src/archive/v4.3.6.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - && rm -rf swoole echo "extension = swoole.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - | wget -O bin/php-cs-fixer "https://cs.symfony.com/download/php-cs-fixer-v2.phar" @@ -26,3 +26,4 @@ before_script: script: - composer cs-fix - composer test + - php bin/swoft dinfo:env From 755b2e544b33c34d0e3a86c24e36d6363ff95869 Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 23 Sep 2019 19:37:17 +0800 Subject: [PATCH 121/211] update swoole to 4.4.6 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 90be2efc..4ee4ec8a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ install: - | echo "no" | pecl install -f redis - | - wget https://github.com/swoole/swoole-src/archive/v4.3.6.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - && rm -rf swoole + wget https://github.com/swoole/swoole-src/archive/v4.4.6.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - && rm -rf swoole echo "extension = swoole.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - | wget -O bin/php-cs-fixer "https://cs.symfony.com/download/php-cs-fixer-v2.phar" From c124de3eb3c1bb2ec9f51d2909b997e2aa2d1d30 Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 23 Sep 2019 20:21:53 +0800 Subject: [PATCH 122/211] fix ci error --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4ee4ec8a..70ca9ccb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,4 +26,4 @@ before_script: script: - composer cs-fix - composer test - - php bin/swoft dinfo:env +# - php bin/swoft dinfo:env From bbeb91e7afe38770d382beffb3daa933300e5ad7 Mon Sep 17 00:00:00 2001 From: Inhere Date: Tue, 24 Sep 2019 13:40:26 +0800 Subject: [PATCH 123/211] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 79d27fc9..72bd2212 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,8 @@ Through three years of accumulation and direction exploration, Swoft has made Sw ## Discuss -- [swoft-cloud/community](https://gitter.im/swoft-cloud/community) +- Gitter.im https://gitter.im/swoft-cloud/community +- Reddit https://www.reddit.com/r/swoft/ - QQ Group1: 548173319 - QQ Group2: 778656850 From e6f3a422e4f67dc9f332876c7801ee1540ae2f71 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 25 Sep 2019 10:47:02 +0800 Subject: [PATCH 124/211] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 72bd2212..ca1b0e57 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ Through three years of accumulation and direction exploration, Swoft has made Sw ## Discuss +- Forum https://github.com/swoft-cloud/forum/issues - Gitter.im https://gitter.im/swoft-cloud/community - Reddit https://www.reddit.com/r/swoft/ - QQ Group1: 548173319 From 00e3fc2a07b9f8d5a54deeedab349713ed6fb8d3 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 25 Sep 2019 21:04:33 +0800 Subject: [PATCH 125/211] up: upgrade swoole to 4.4.7 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6c3dfb9b..d3e5f84c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"prod"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=4.3.0 \ - SWOOLE_VERSION=4.4.6 \ + SWOOLE_VERSION=4.4.7 \ COMPOSER_ALLOW_SUPERUSER=1 # Libs -y --no-install-recommends From 23753acaa220a4839fc219a2642368f2ad154993 Mon Sep 17 00:00:00 2001 From: zzhpeng Date: Thu, 26 Sep 2019 21:45:24 +0800 Subject: [PATCH 126/211] fix: rpcExceptionHandler just show error message rpcExceptionHandler just show error message when debug is false --- app/Exception/Handler/RpcExceptionHandler.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/Exception/Handler/RpcExceptionHandler.php b/app/Exception/Handler/RpcExceptionHandler.php index e03bc457..1c1dfd17 100644 --- a/app/Exception/Handler/RpcExceptionHandler.php +++ b/app/Exception/Handler/RpcExceptionHandler.php @@ -38,12 +38,14 @@ class RpcExceptionHandler extends RpcErrorHandler */ public function handle(Throwable $e, Response $response): Response { - // Debug is false + // Debug is false if (!APP_DEBUG) { + //just show error message + $error = Error::new($e->getCode(), $e->getMessage(), null); + } else { $message = sprintf(' %s At %s line %d', $e->getMessage(), $e->getFile(), $e->getLine()); $error = Error::new($e->getCode(), $message, null); - } else { - $error = Error::new($e->getCode(), $e->getMessage(), null); + } Debug::log('Rpc server error(%s)', $e->getMessage()); From dcc2dee1573adfd0926145e0bbd473266cb6d640 Mon Sep 17 00:00:00 2001 From: zzhpeng Date: Thu, 26 Sep 2019 21:57:04 +0800 Subject: [PATCH 127/211] update: trim and format --- app/Exception/Handler/RpcExceptionHandler.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/Exception/Handler/RpcExceptionHandler.php b/app/Exception/Handler/RpcExceptionHandler.php index 1c1dfd17..aed937eb 100644 --- a/app/Exception/Handler/RpcExceptionHandler.php +++ b/app/Exception/Handler/RpcExceptionHandler.php @@ -44,8 +44,7 @@ public function handle(Throwable $e, Response $response): Response $error = Error::new($e->getCode(), $e->getMessage(), null); } else { $message = sprintf(' %s At %s line %d', $e->getMessage(), $e->getFile(), $e->getLine()); - $error = Error::new($e->getCode(), $message, null); - + $error = Error::new($e->getCode(), $message, null); } Debug::log('Rpc server error(%s)', $e->getMessage()); From 4cceda998459e3f80dc9ee7da175021e59c893ec Mon Sep 17 00:00:00 2001 From: zzhpeng Date: Thu, 26 Sep 2019 22:21:27 +0800 Subject: [PATCH 128/211] update: PSR-2 format --- app/Exception/Handler/RpcExceptionHandler.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Exception/Handler/RpcExceptionHandler.php b/app/Exception/Handler/RpcExceptionHandler.php index aed937eb..a90c016f 100644 --- a/app/Exception/Handler/RpcExceptionHandler.php +++ b/app/Exception/Handler/RpcExceptionHandler.php @@ -38,15 +38,15 @@ class RpcExceptionHandler extends RpcErrorHandler */ public function handle(Throwable $e, Response $response): Response { - // Debug is false + // Debug is false if (!APP_DEBUG) { //just show error message $error = Error::new($e->getCode(), $e->getMessage(), null); } else { $message = sprintf(' %s At %s line %d', $e->getMessage(), $e->getFile(), $e->getLine()); - $error = Error::new($e->getCode(), $message, null); + $error = Error::new($e->getCode(), $message, null); } - + Debug::log('Rpc server error(%s)', $e->getMessage()); $response->setError($error); From 81d1dcf86353b4ee80cea3e7d81f195cd3d5ddb0 Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 26 Sep 2019 22:42:46 +0800 Subject: [PATCH 129/211] Update RpcExceptionHandler.php --- app/Exception/Handler/RpcExceptionHandler.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Exception/Handler/RpcExceptionHandler.php b/app/Exception/Handler/RpcExceptionHandler.php index a90c016f..d9741d80 100644 --- a/app/Exception/Handler/RpcExceptionHandler.php +++ b/app/Exception/Handler/RpcExceptionHandler.php @@ -40,13 +40,13 @@ public function handle(Throwable $e, Response $response): Response { // Debug is false if (!APP_DEBUG) { - //just show error message + // just show error message $error = Error::new($e->getCode(), $e->getMessage(), null); } else { $message = sprintf(' %s At %s line %d', $e->getMessage(), $e->getFile(), $e->getLine()); $error = Error::new($e->getCode(), $message, null); } - + Debug::log('Rpc server error(%s)', $e->getMessage()); $response->setError($error); From 9eedd8d67a7528155a0a5d30dac1609600798734 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 16 Oct 2019 11:21:24 +0800 Subject: [PATCH 130/211] up: upgrade swoole to 4.4.8 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index d3e5f84c..f36550e9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"prod"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=4.3.0 \ - SWOOLE_VERSION=4.4.7 \ + SWOOLE_VERSION=4.4.8 \ COMPOSER_ALLOW_SUPERUSER=1 # Libs -y --no-install-recommends From dec2bc0cb70f89ab347daae7ecd5dde34cb1a2a8 Mon Sep 17 00:00:00 2001 From: Inhere Date: Mon, 21 Oct 2019 17:54:09 +0800 Subject: [PATCH 131/211] Update bug_report.md --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 689db0a8..1bafbce5 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -11,7 +11,7 @@ assignees: '' | ------------------- | ----- | Bug report? | yes/no | Feature request? | yes/no -| Swoft version | x.y.z +| Swoft version | x.y.z (by `php bin/swoft -V`) | Swoole version | x.y.z (by `php --ri swoole`) | PHP version | x.y.z (by `php -v`) | Runtime environment | Win10/Mac/CentOS 7/Ubuntu/Docker etc. From 952a714fd417fa7bcb97897fab84090449432f86 Mon Sep 17 00:00:00 2001 From: inhere Date: Thu, 24 Oct 2019 10:38:48 +0800 Subject: [PATCH 132/211] up: add tcp middleware examples, format some codes --- .../Handler/HttpExceptionHandler.php | 17 +++----- app/Exception/Handler/RpcExceptionHandler.php | 4 -- .../Handler/WsHandshakeExceptionHandler.php | 12 +----- .../Handler/WsMessageExceptionHandler.php | 5 --- app/Tcp/Controller/DemoController.php | 3 +- app/Tcp/Middleware/DemoMiddleware.php | 39 +++++++++++++++++++ app/Tcp/Middleware/GlobalTcpMiddleware.php | 39 +++++++++++++++++++ app/bean.php | 13 ++++++- 8 files changed, 100 insertions(+), 32 deletions(-) create mode 100644 app/Tcp/Middleware/DemoMiddleware.php create mode 100644 app/Tcp/Middleware/GlobalTcpMiddleware.php diff --git a/app/Exception/Handler/HttpExceptionHandler.php b/app/Exception/Handler/HttpExceptionHandler.php index c9e347b2..4af35438 100644 --- a/app/Exception/Handler/HttpExceptionHandler.php +++ b/app/Exception/Handler/HttpExceptionHandler.php @@ -10,17 +10,15 @@ namespace App\Exception\Handler; -use const APP_DEBUG; -use function get_class; -use ReflectionException; -use function sprintf; -use Swoft\Bean\Exception\ContainerException; use Swoft\Error\Annotation\Mapping\ExceptionHandler; use Swoft\Http\Message\Response; use Swoft\Http\Server\Exception\Handler\AbstractHttpErrorHandler; use Swoft\Log\Helper\CLog; use Swoft\Log\Helper\Log; use Throwable; +use function get_class; +use function sprintf; +use const APP_DEBUG; /** * Class HttpExceptionHandler @@ -31,11 +29,9 @@ class HttpExceptionHandler extends AbstractHttpErrorHandler { /** * @param Throwable $e - * @param Response $response + * @param Response $response * * @return Response - * @throws ReflectionException - * @throws ContainerException */ public function handle(Throwable $e, Response $response): Response { @@ -45,9 +41,8 @@ public function handle(Throwable $e, Response $response): Response // Debug is false if (!APP_DEBUG) { - return $response->withStatus(500)->withContent( - sprintf(' %s At %s line %d', $e->getMessage(), $e->getFile(), $e->getLine()) - ); + return $response->withStatus(500)->withContent(sprintf(' %s At %s line %d', $e->getMessage(), $e->getFile(), + $e->getLine())); } $data = [ diff --git a/app/Exception/Handler/RpcExceptionHandler.php b/app/Exception/Handler/RpcExceptionHandler.php index e03bc457..5b618f29 100644 --- a/app/Exception/Handler/RpcExceptionHandler.php +++ b/app/Exception/Handler/RpcExceptionHandler.php @@ -10,8 +10,6 @@ namespace App\Exception\Handler; -use ReflectionException; -use Swoft\Bean\Exception\ContainerException; use Swoft\Error\Annotation\Mapping\ExceptionHandler; use Swoft\Log\Debug; use Swoft\Rpc\Error; @@ -33,8 +31,6 @@ class RpcExceptionHandler extends RpcErrorHandler * @param Response $response * * @return Response - * @throws ReflectionException - * @throws ContainerException */ public function handle(Throwable $e, Response $response): Response { diff --git a/app/Exception/Handler/WsHandshakeExceptionHandler.php b/app/Exception/Handler/WsHandshakeExceptionHandler.php index 330bd465..4b560da7 100644 --- a/app/Exception/Handler/WsHandshakeExceptionHandler.php +++ b/app/Exception/Handler/WsHandshakeExceptionHandler.php @@ -10,8 +10,6 @@ namespace App\Exception\Handler; -use ReflectionException; -use Swoft\Bean\Exception\ContainerException; use Swoft\Error\Annotation\Mapping\ExceptionHandler; use Swoft\Http\Message\Response; use Swoft\WebSocket\Server\Exception\Handler\AbstractHandshakeErrorHandler; @@ -32,19 +30,13 @@ class WsHandshakeExceptionHandler extends AbstractHandshakeErrorHandler * @param Response $response * * @return Response - * @throws ReflectionException - * @throws ContainerException */ public function handle(Throwable $e, Response $response): Response { // Debug is false if (!APP_DEBUG) { - return $response->withStatus(500)->withContent(sprintf( - '%s At %s line %d', - $e->getMessage(), - $e->getFile(), - $e->getLine() - )); + return $response->withStatus(500)->withContent(sprintf('%s At %s line %d', $e->getMessage(), $e->getFile(), + $e->getLine())); } $data = [ diff --git a/app/Exception/Handler/WsMessageExceptionHandler.php b/app/Exception/Handler/WsMessageExceptionHandler.php index df3abd1c..a9f5d981 100644 --- a/app/Exception/Handler/WsMessageExceptionHandler.php +++ b/app/Exception/Handler/WsMessageExceptionHandler.php @@ -10,8 +10,6 @@ namespace App\Exception\Handler; -use ReflectionException; -use Swoft\Bean\Exception\ContainerException; use Swoft\Error\Annotation\Mapping\ExceptionHandler; use Swoft\Log\Helper\Log; use Swoft\WebSocket\Server\Exception\Handler\AbstractMessageErrorHandler; @@ -32,9 +30,6 @@ class WsMessageExceptionHandler extends AbstractMessageErrorHandler /** * @param Throwable $e * @param Frame $frame - * - * @throws ContainerException - * @throws ReflectionException */ public function handle(Throwable $e, Frame $frame): void { diff --git a/app/Tcp/Controller/DemoController.php b/app/Tcp/Controller/DemoController.php index 1f57c54c..d6216e4d 100644 --- a/app/Tcp/Controller/DemoController.php +++ b/app/Tcp/Controller/DemoController.php @@ -10,6 +10,7 @@ namespace App\Tcp\Controller; +use App\Tcp\Middleware\DemoMiddleware; use Swoft\Tcp\Server\Annotation\Mapping\TcpController; use Swoft\Tcp\Server\Annotation\Mapping\TcpMapping; use Swoft\Tcp\Server\Request; @@ -19,7 +20,7 @@ /** * Class DemoController * - * @TcpController() + * @TcpController(middlewares={DemoMiddleware::class}) */ class DemoController { diff --git a/app/Tcp/Middleware/DemoMiddleware.php b/app/Tcp/Middleware/DemoMiddleware.php new file mode 100644 index 00000000..d6526acf --- /dev/null +++ b/app/Tcp/Middleware/DemoMiddleware.php @@ -0,0 +1,39 @@ +before '; + + CLog::info('before handle'); + + $resp = $handler->handle($request); + + $resp->setData($start . $resp->getData() . ' after>'); + + CLog::info('after handle'); + + return $resp; + } +} diff --git a/app/Tcp/Middleware/GlobalTcpMiddleware.php b/app/Tcp/Middleware/GlobalTcpMiddleware.php new file mode 100644 index 00000000..b8fe6e0c --- /dev/null +++ b/app/Tcp/Middleware/GlobalTcpMiddleware.php @@ -0,0 +1,39 @@ +before '; + + CLog::info('before handle'); + + $resp = $handler->handle($request); + + $resp->setData($start . $resp->getData() . ' after>'); + + CLog::info('after handle'); + + return $resp; + } +} diff --git a/app/bean.php b/app/bean.php index f291ace3..9035b412 100644 --- a/app/bean.php +++ b/app/bean.php @@ -131,6 +131,10 @@ 'wsServer' => [ 'class' => WebSocketServer::class, 'port' => 18308, + 'listener' => [ + // 'rpc' => bean('rpcServer'), + // 'tcp' => bean('tcpServer'), + ], 'on' => [ // Enable http handle SwooleEvent::REQUEST => bean(RequestListener::class), @@ -142,16 +146,23 @@ 'log_file' => alias('@runtime/swoole.log'), ], ], + /** @see \Swoft\Tcp\Server\TcpServer */ 'tcpServer' => [ 'port' => 18309, 'debug' => 1, ], /** @see \Swoft\Tcp\Protocol */ 'tcpServerProtocol' => [ - // 'type' => \Swoft\Tcp\Packer\JsonPacker::TYPE, + // 'type' => \Swoft\Tcp\Packer\JsonPacker::TYPE, 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, // 'openLengthCheck' => true, ], + /** @see \Swoft\Tcp\Server\TcpDispatcher */ + 'tcpDispatcher' => [ + 'middlewares' => [ + \App\Tcp\Middleware\GlobalTcpMiddleware::class + ], + ], 'cliRouter' => [ // 'disabledGroups' => ['demo', 'test'], ] From 21feebfef1c0bb60e9e1932f2a077918a40cac53 Mon Sep 17 00:00:00 2001 From: inhere Date: Thu, 24 Oct 2019 10:40:23 +0800 Subject: [PATCH 133/211] up: run php-cs-fixer fix code format --- app/Exception/Handler/HttpExceptionHandler.php | 8 ++++++-- app/Exception/Handler/WsHandshakeExceptionHandler.php | 8 ++++++-- app/Tcp/Middleware/DemoMiddleware.php | 8 ++++++++ app/Tcp/Middleware/GlobalTcpMiddleware.php | 8 ++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/app/Exception/Handler/HttpExceptionHandler.php b/app/Exception/Handler/HttpExceptionHandler.php index 4af35438..f4dc48df 100644 --- a/app/Exception/Handler/HttpExceptionHandler.php +++ b/app/Exception/Handler/HttpExceptionHandler.php @@ -41,8 +41,12 @@ public function handle(Throwable $e, Response $response): Response // Debug is false if (!APP_DEBUG) { - return $response->withStatus(500)->withContent(sprintf(' %s At %s line %d', $e->getMessage(), $e->getFile(), - $e->getLine())); + return $response->withStatus(500)->withContent(sprintf( + ' %s At %s line %d', + $e->getMessage(), + $e->getFile(), + $e->getLine() + )); } $data = [ diff --git a/app/Exception/Handler/WsHandshakeExceptionHandler.php b/app/Exception/Handler/WsHandshakeExceptionHandler.php index 4b560da7..1a07cf2a 100644 --- a/app/Exception/Handler/WsHandshakeExceptionHandler.php +++ b/app/Exception/Handler/WsHandshakeExceptionHandler.php @@ -35,8 +35,12 @@ public function handle(Throwable $e, Response $response): Response { // Debug is false if (!APP_DEBUG) { - return $response->withStatus(500)->withContent(sprintf('%s At %s line %d', $e->getMessage(), $e->getFile(), - $e->getLine())); + return $response->withStatus(500)->withContent(sprintf( + '%s At %s line %d', + $e->getMessage(), + $e->getFile(), + $e->getLine() + )); } $data = [ diff --git a/app/Tcp/Middleware/DemoMiddleware.php b/app/Tcp/Middleware/DemoMiddleware.php index d6526acf..df76cba3 100644 --- a/app/Tcp/Middleware/DemoMiddleware.php +++ b/app/Tcp/Middleware/DemoMiddleware.php @@ -1,4 +1,12 @@ Date: Thu, 24 Oct 2019 16:57:32 +0800 Subject: [PATCH 134/211] feat: add middleware examples for ws server --- app/WebSocket/Chat/HomeController.php | 3 +- app/WebSocket/Middleware/DemoMiddleware.php | 47 +++++++++++++++++++ .../Middleware/GlobalWsMiddleware.php | 47 +++++++++++++++++++ app/bean.php | 6 +++ 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 app/WebSocket/Middleware/DemoMiddleware.php create mode 100644 app/WebSocket/Middleware/GlobalWsMiddleware.php diff --git a/app/WebSocket/Chat/HomeController.php b/app/WebSocket/Chat/HomeController.php index e4f3e3d5..a3e669ae 100644 --- a/app/WebSocket/Chat/HomeController.php +++ b/app/WebSocket/Chat/HomeController.php @@ -10,6 +10,7 @@ namespace App\WebSocket\Chat; +use App\WebSocket\Middleware\DemoMiddleware; use Swoft\Session\Session; use Swoft\WebSocket\Server\Annotation\Mapping\MessageMapping; use Swoft\WebSocket\Server\Annotation\Mapping\WsController; @@ -17,7 +18,7 @@ /** * Class HomeController * - * @WsController() + * @WsController(middlewares={DemoMiddleware::class}) */ class HomeController { diff --git a/app/WebSocket/Middleware/DemoMiddleware.php b/app/WebSocket/Middleware/DemoMiddleware.php new file mode 100644 index 00000000..6449ac59 --- /dev/null +++ b/app/WebSocket/Middleware/DemoMiddleware.php @@ -0,0 +1,47 @@ +before '; + + CLog::info('before handle'); + + $resp = $handler->handle($request); + + $resp->setData($start . $resp->getData() . ' after>'); + + CLog::info('after handle'); + + return $resp; + } +} diff --git a/app/WebSocket/Middleware/GlobalWsMiddleware.php b/app/WebSocket/Middleware/GlobalWsMiddleware.php new file mode 100644 index 00000000..c65ed5c9 --- /dev/null +++ b/app/WebSocket/Middleware/GlobalWsMiddleware.php @@ -0,0 +1,47 @@ +before '; + + CLog::info('before handle'); + + $resp = $handler->handle($request); + + $resp->setData($start . $resp->getData() . ' after>'); + + CLog::info('after handle'); + + return $resp; + } +} diff --git a/app/bean.php b/app/bean.php index 9035b412..238d4ebc 100644 --- a/app/bean.php +++ b/app/bean.php @@ -146,6 +146,12 @@ 'log_file' => alias('@runtime/swoole.log'), ], ], + /** @see \Swoft\WebSocket\Server\WsMessageDispatcher */ + 'wsMsgDispatcher' => [ + 'middlewares' => [ + \App\WebSocket\Middleware\GlobalWsMiddleware::class + ], + ], /** @see \Swoft\Tcp\Server\TcpServer */ 'tcpServer' => [ 'port' => 18309, From 53d5dc334cb6a5d7953a45aa7325ea72c74832b8 Mon Sep 17 00:00:00 2001 From: Inhere Date: Fri, 1 Nov 2019 17:17:18 +0800 Subject: [PATCH 135/211] up: upgrade redis ext to 5.1.0 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f36550e9..56e5bd55 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,7 +22,7 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"prod"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ - PHPREDIS_VERSION=4.3.0 \ + PHPREDIS_VERSION=5.1.0 \ SWOOLE_VERSION=4.4.8 \ COMPOSER_ALLOW_SUPERUSER=1 From 24db5cfaa62c290257bbdf4d1d75f3cdfe7cda4e Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 4 Nov 2019 23:10:43 +0800 Subject: [PATCH 136/211] up: dont report error file on app_debug is close --- app/AutoLoader.php | 2 +- app/Exception/Handler/HttpExceptionHandler.php | 7 +------ app/WebSocket/Chat/HomeController.php | 3 +-- app/WebSocket/Test/TestController.php | 3 ++- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/app/AutoLoader.php b/app/AutoLoader.php index cb4d1b52..1218cac9 100644 --- a/app/AutoLoader.php +++ b/app/AutoLoader.php @@ -32,7 +32,7 @@ public function getPrefixDirs(): array /** * @return array */ - public function metadata(): array + protected function metadata(): array { return []; } diff --git a/app/Exception/Handler/HttpExceptionHandler.php b/app/Exception/Handler/HttpExceptionHandler.php index f4dc48df..4c50f648 100644 --- a/app/Exception/Handler/HttpExceptionHandler.php +++ b/app/Exception/Handler/HttpExceptionHandler.php @@ -41,12 +41,7 @@ public function handle(Throwable $e, Response $response): Response // Debug is false if (!APP_DEBUG) { - return $response->withStatus(500)->withContent(sprintf( - ' %s At %s line %d', - $e->getMessage(), - $e->getFile(), - $e->getLine() - )); + return $response->withStatus(500)->withContent($e->getMessage()); } $data = [ diff --git a/app/WebSocket/Chat/HomeController.php b/app/WebSocket/Chat/HomeController.php index a3e669ae..e4f3e3d5 100644 --- a/app/WebSocket/Chat/HomeController.php +++ b/app/WebSocket/Chat/HomeController.php @@ -10,7 +10,6 @@ namespace App\WebSocket\Chat; -use App\WebSocket\Middleware\DemoMiddleware; use Swoft\Session\Session; use Swoft\WebSocket\Server\Annotation\Mapping\MessageMapping; use Swoft\WebSocket\Server\Annotation\Mapping\WsController; @@ -18,7 +17,7 @@ /** * Class HomeController * - * @WsController(middlewares={DemoMiddleware::class}) + * @WsController() */ class HomeController { diff --git a/app/WebSocket/Test/TestController.php b/app/WebSocket/Test/TestController.php index 960dc67b..bebd22ed 100644 --- a/app/WebSocket/Test/TestController.php +++ b/app/WebSocket/Test/TestController.php @@ -10,6 +10,7 @@ namespace App\WebSocket\Test; +use App\WebSocket\Middleware\DemoMiddleware; use Swoft\Session\Session; use Swoft\WebSocket\Server\Annotation\Mapping\MessageMapping; use Swoft\WebSocket\Server\Annotation\Mapping\WsController; @@ -24,7 +25,7 @@ /** * Class HomeController * - * @WsController() + * @WsController(middlewares={DemoMiddleware::class}) */ class TestController { From f991da3f6a7a7d88e392e2730af11ee8b8e92dab Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 4 Nov 2019 23:12:48 +0800 Subject: [PATCH 137/211] update some --- app/Exception/Handler/HttpExceptionHandler.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Exception/Handler/HttpExceptionHandler.php b/app/Exception/Handler/HttpExceptionHandler.php index 4c50f648..615a45fc 100644 --- a/app/Exception/Handler/HttpExceptionHandler.php +++ b/app/Exception/Handler/HttpExceptionHandler.php @@ -35,9 +35,9 @@ class HttpExceptionHandler extends AbstractHttpErrorHandler */ public function handle(Throwable $e, Response $response): Response { - // Log + // Log error message Log::error($e->getMessage()); - CLog::error($e->getMessage()); + CLog::error('%s. (At %s line %d)', $e->getMessage(), $e->getFile(), $e->getLine()); // Debug is false if (!APP_DEBUG) { From 325ee5be73ca17945243530be831b3a9430b4b62 Mon Sep 17 00:00:00 2001 From: inhere Date: Wed, 6 Nov 2019 00:33:30 +0800 Subject: [PATCH 138/211] up: add http controller for session usage examples --- app/Console/Command/TestCommand.php | 3 +- app/Http/Controller/CookieController.php | 56 +++++++++++++++ app/Http/Controller/HomeController.php | 3 - app/Http/Controller/RespController.php | 19 +++-- app/Http/Controller/RpcController.php | 2 - app/Http/Controller/SessionController.php | 85 +++++++++++++++++++++++ app/Http/Controller/ViewController.php | 20 ------ app/bean.php | 1 + 8 files changed, 156 insertions(+), 33 deletions(-) create mode 100644 app/Http/Controller/CookieController.php create mode 100644 app/Http/Controller/SessionController.php diff --git a/app/Console/Command/TestCommand.php b/app/Console/Command/TestCommand.php index 7ad6b094..c82cabae 100644 --- a/app/Console/Command/TestCommand.php +++ b/app/Console/Command/TestCommand.php @@ -31,7 +31,7 @@ class TestCommand /** * @CommandMapping(name="ab") */ - public function ab() + public function ab(): void { $type = input()->get('type', ''); $uris = $this->uris(); @@ -40,6 +40,7 @@ public function ab() if (empty($type)) { $exeUris = []; foreach ($uris as $name => $uriAry) { + /** @noinspection SlowArrayOperationsInLoopInspection */ $exeUris = array_merge($exeUris, $uriAry); } } else { diff --git a/app/Http/Controller/CookieController.php b/app/Http/Controller/CookieController.php new file mode 100644 index 00000000..483335ce --- /dev/null +++ b/app/Http/Controller/CookieController.php @@ -0,0 +1,56 @@ +getResponse(); + + return $resp->setCookie('c-name', 'c-value')->withData(['hello']); + } + + /** + * @RequestMapping() + * + * @param Request $request + * + * @return array + */ + public function get(Request $request): array + { + return $request->getCookieParams(); + } + + /** + * @RequestMapping("del") + * + * @return Response + */ + public function del(): Response + { + /** @var Response $resp */ + $resp = context()->getResponse(); + + return $resp->delCookie('c-name')->withData(['ok']); + } +} diff --git a/app/Http/Controller/HomeController.php b/app/Http/Controller/HomeController.php index 31fa7a09..5e37a48e 100644 --- a/app/Http/Controller/HomeController.php +++ b/app/Http/Controller/HomeController.php @@ -11,7 +11,6 @@ namespace App\Http\Controller; use Swoft; -use Swoft\Exception\SwoftException; use Swoft\Http\Message\ContentType; use Swoft\Http\Message\Response; use Swoft\Http\Server\Annotation\Mapping\Controller; @@ -43,7 +42,6 @@ public function index(): Response * @RequestMapping("/hi") * * @return Response - * @throws SwoftException */ public function hi(): Response { @@ -55,7 +53,6 @@ public function hi(): Response * @param string $name * * @return Response - * @throws SwoftException */ public function hello(string $name): Response { diff --git a/app/Http/Controller/RespController.php b/app/Http/Controller/RespController.php index 32daa46d..98a4e6b1 100644 --- a/app/Http/Controller/RespController.php +++ b/app/Http/Controller/RespController.php @@ -10,7 +10,6 @@ namespace App\Http\Controller; -use Swoft\Exception\SwoftException; use Swoft\Http\Message\Response; use Swoft\Http\Server\Annotation\Mapping\Controller; use Swoft\Http\Server\Annotation\Mapping\RequestMapping; @@ -27,14 +26,20 @@ class RespController /** * @RequestMapping() * - * @return Response - * @throws SwoftException + * @return array */ - public function cookie(): Response + public function ary(): array { - /** @var Response $resp */ - $resp = context()->getResponse(); + return ['ary']; + } - return $resp->setCookie('c-name', 'c-value')->withData(['hello']); + /** + * @RequestMapping() + * + * @return string + */ + public function str(): string + { + return 'string'; } } diff --git a/app/Http/Controller/RpcController.php b/app/Http/Controller/RpcController.php index 4fb2f9bc..b92273a2 100644 --- a/app/Http/Controller/RpcController.php +++ b/app/Http/Controller/RpcController.php @@ -13,7 +13,6 @@ use App\Rpc\Lib\UserInterface; use Exception; use Swoft\Co; -use Swoft\Exception\SwoftException; use Swoft\Http\Server\Annotation\Mapping\Controller; use Swoft\Http\Server\Annotation\Mapping\RequestMapping; use Swoft\Rpc\Client\Annotation\Mapping\Reference; @@ -86,7 +85,6 @@ public function bigString(): array * @RequestMapping() * * @return array - * @throws SwoftException */ public function sendBigString(): array { diff --git a/app/Http/Controller/SessionController.php b/app/Http/Controller/SessionController.php new file mode 100644 index 00000000..c6576e1c --- /dev/null +++ b/app/Http/Controller/SessionController.php @@ -0,0 +1,85 @@ +get('times', 0); + $times++; + + $sess->set('times', $times); + + return $response->withData(['times' => $times]); + } + + /** + * @RequestMapping() + * @param Response $response + * + * @return Response + */ + public function set(Response $response): Response + { + $sess = HttpSession::current(); + $sess->set('testKey', 'test-value'); + + return $response->withData(['set.testKey' => 'test-value']); + } + + /** + * @RequestMapping() + * + * @return array + */ + public function get(): array + { + $sess = HttpSession::current(); + + return ['get.testKey' => $sess->get('testKey')]; + } + + /** + * @RequestMapping("del") + * + * @return array + */ + public function del(): array + { + $sess = HttpSession::current(); + $sess->set('testKey', 'test-value'); + + return ['set.testKey' => 'test-value']; + } + + /** + * @RequestMapping() + * @param Response $response + * + * @return Response + */ + public function close(Response $response): Response + { + $sess = HttpSession::current(); + + return $response->withData(['destroy' => $sess->destroy()]); + } +} diff --git a/app/Http/Controller/ViewController.php b/app/Http/Controller/ViewController.php index e5548e14..b8bea1d3 100644 --- a/app/Http/Controller/ViewController.php +++ b/app/Http/Controller/ViewController.php @@ -54,24 +54,4 @@ public function indexByViewTag(): array 'msg' => 'hello' ]; } - - /** - * @RequestMapping() - * - * @return array - */ - public function ary(): array - { - return ['ary']; - } - - /** - * @RequestMapping() - * - * @return string - */ - public function str(): string - { - return 'string'; - } } diff --git a/app/bean.php b/app/bean.php index 238d4ebc..719218da 100644 --- a/app/bean.php +++ b/app/bean.php @@ -62,6 +62,7 @@ // Add global http middleware 'middlewares' => [ \App\Http\Middleware\FavIconMiddleware::class, + \Swoft\Http\Session\SessionMiddleware::class, // \Swoft\Whoops\WhoopsMiddleware::class, // Allow use @View tag \Swoft\View\Middleware\ViewMiddleware::class, From 4591f647a27e67d7d24211d2a38251bae74e86f1 Mon Sep 17 00:00:00 2001 From: zhenghongyang Date: Sun, 17 Nov 2019 16:38:26 +0800 Subject: [PATCH 139/211] fix redis demo --- app/Http/Controller/RedisController.php | 12 ++++++------ app/Listener/{RanListener.php => DbRanListener.php} | 2 +- app/Listener/UserSavingListener.php | 10 ++++------ app/bean.php | 1 + 4 files changed, 12 insertions(+), 13 deletions(-) rename app/Listener/{RanListener.php => DbRanListener.php} (94%) diff --git a/app/Http/Controller/RedisController.php b/app/Http/Controller/RedisController.php index 9b8fa20c..3bd81df6 100644 --- a/app/Http/Controller/RedisController.php +++ b/app/Http/Controller/RedisController.php @@ -60,18 +60,18 @@ public function poolSet(): array */ public function set(): array { - $key = 'key'; - $value = uniqid(); + $key = 'key1'; - $this->redis->zAdd($key, [ + $data = [ 'add' => 11.1, 'score2' => 11.1, 'score3' => 11.21 - ]); + ]; + $this->redis->zAdd($key, $data); - $get = $this->redis->sMembers($key); + $res = Redis::zRangeByScore($key, '11.1', '11.21', ['withscores' => true]); - return [$get, $value]; + return [$res, $res === $data]; } /** diff --git a/app/Listener/RanListener.php b/app/Listener/DbRanListener.php similarity index 94% rename from app/Listener/RanListener.php rename to app/Listener/DbRanListener.php index 242054fd..28e52a2f 100644 --- a/app/Listener/RanListener.php +++ b/app/Listener/DbRanListener.php @@ -23,7 +23,7 @@ * * @Listener(DbEvent::SQL_RAN) */ -class RanListener implements EventHandlerInterface +class DbRanListener implements EventHandlerInterface { /** * SQL ran diff --git a/app/Listener/UserSavingListener.php b/app/Listener/UserSavingListener.php index c0c04528..fbe9be42 100644 --- a/app/Listener/UserSavingListener.php +++ b/app/Listener/UserSavingListener.php @@ -34,12 +34,10 @@ public function handle(EventInterface $event): void $user = $event->getTarget(); /** - if ($user->getAge() > 100) { - // stopping saving - $event->stopPropagation(true); - - $user->setAdd(100); - } + * if ($user->getAge() > 100) { + * // stopping saving + * $event->stopPropagation(true); + * } */ } } diff --git a/app/bean.php b/app/bean.php index f291ace3..439f7eb5 100644 --- a/app/bean.php +++ b/app/bean.php @@ -75,6 +75,7 @@ 'dsn' => 'mysql:dbname=test;host=127.0.0.1', 'username' => 'root', 'password' => 'swoft123456', + 'charset' => 'utf8mb4', ], 'db2' => [ 'class' => Database::class, From 1b2a626bdd88ea45ec07d450d119e354c4fcfd03 Mon Sep 17 00:00:00 2001 From: inhere Date: Sun, 17 Nov 2019 20:25:36 +0800 Subject: [PATCH 140/211] up --- app/Http/Controller/SessionController.php | 30 ++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/app/Http/Controller/SessionController.php b/app/Http/Controller/SessionController.php index c6576e1c..357691dd 100644 --- a/app/Http/Controller/SessionController.php +++ b/app/Http/Controller/SessionController.php @@ -31,6 +31,18 @@ public function session(Response $response): Response return $response->withData(['times' => $times]); } + /** + * @RequestMapping("all") + * + * @return array + */ + public function all(): array + { + $sess = HttpSession::current(); + + return $sess->toArray(); + } + /** * @RequestMapping() * @param Response $response @@ -41,8 +53,9 @@ public function set(Response $response): Response { $sess = HttpSession::current(); $sess->set('testKey', 'test-value'); + $sess->set('testKey1', ['k' => 'v', 'v1', 3]); - return $response->withData(['set.testKey' => 'test-value']); + return $response->withData(['testKey', 'testKey1']); } /** @@ -82,4 +95,19 @@ public function close(Response $response): Response return $response->withData(['destroy' => $sess->destroy()]); } + + // ------------ flash session usage + + /** + * @RequestMapping() + * + * @return array + */ + public function flash(): array + { + $sess = HttpSession::current(); + $sess->setFlash('flash1', 'test-value'); + + return ['set.testKey' => 'test-value']; + } } From b6fd5e5970b3c5bc176c36aee0dafa8633429d8a Mon Sep 17 00:00:00 2001 From: inhere Date: Sun, 17 Nov 2019 20:27:11 +0800 Subject: [PATCH 141/211] fix cs error --- app/Http/Controller/CookieController.php | 8 ++++++++ app/Http/Controller/RespController.php | 1 - app/Http/Controller/SessionController.php | 8 ++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/Http/Controller/CookieController.php b/app/Http/Controller/CookieController.php index 483335ce..4dcde82c 100644 --- a/app/Http/Controller/CookieController.php +++ b/app/Http/Controller/CookieController.php @@ -1,4 +1,12 @@ Date: Mon, 18 Nov 2019 00:49:50 +0800 Subject: [PATCH 142/211] up: add http session component --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index d9c1185c..7a76f90a 100644 --- a/composer.json +++ b/composer.json @@ -33,6 +33,7 @@ "swoft/limiter": "~2.0.0", "swoft/breaker": "~2.0.0", "swoft/crontab": "~2.0.0", + "swoft/session": "~2.0.0", "swoft/devtool": "~2.0.0" }, "require-dev": { From ff91f1339dd886184d83793cc3a75235613a511a Mon Sep 17 00:00:00 2001 From: Andrey Bolonin Date: Sun, 1 Dec 2019 10:07:10 +0200 Subject: [PATCH 143/211] Update .travis.yml --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 70ca9ccb..bab6451d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ php: - 7.1 - 7.2 - 7.3 + - 7.4 services: - redis From 378ff4b2f8ec477cac7a84f556d8680472a54e34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9C=96?= Date: Tue, 3 Dec 2019 17:30:51 +0800 Subject: [PATCH 144/211] Update README.zh-CN.md --- README.zh-CN.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.zh-CN.md b/README.zh-CN.md index 4a5eb12a..2a6472af 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -66,6 +66,10 @@ Swoft 通过长达三年的积累和方向的探索,把 Swoft 打造成 PHP - QQ Group2: 778656850 - [swoft-cloud/community](https://gitter.im/swoft-cloud/community) +## 免费技术支持 + +![support](https://www.swoft.org/src/images/technical-support.png) + ## Requirement - [PHP 7.1+](https://github.com/php/php-src/releases) From 6da23fbbea4df0efd474ff959972192f598dab54 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 18 Dec 2019 11:37:32 +0800 Subject: [PATCH 145/211] Create label.yml --- .github/workflows/label.yml | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/label.yml diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml new file mode 100644 index 00000000..64985ffc --- /dev/null +++ b/.github/workflows/label.yml @@ -0,0 +1,38 @@ +# This workflow will triage pull requests and apply a label based on the +# paths that are modified in the pull request. +# +# To use this workflow, you will need to set up a .github/labeler.yml +# file with configuration. For more information, see: +# https://github.com/actions/labeler/blob/master/README.md + +name: Issue Labeler +on: + issues: + types: [opened] + +jobs: + label: + runs-on: ubuntu-latest + steps: + - name: Db Issue Labeler + uses: Naturalclar/issue-action@v1.0.0 + with: + # Github token + github-token: "${{ secrets.GITHUB_TOKEN }}" + # keywords to look for in the issue + keywords: '["db", "database", "mysql", "pdo"]' + # assignees to be assigned when keyword is found + assignees: '["sakuraovq"]' + # labels to be set when keyword is found + labels: '["swoft: db"]' # optional + - name: Websocket Issue Labeler + uses: Naturalclar/issue-action@v1.0.0 + with: + # Github token + github-token: "${{ secrets.GITHUB_TOKEN }}" + # keywords to look for in the issue + keywords: '["websocket", "websocket-server", "ws-server"]' + # assignees to be assigned when keyword is found + assignees: '["inhere"]' + # labels to be set when keyword is found + labels: '["swoft: websocket"]' # optional From 3e87902946047b5658afaabd283e21d837064ff5 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 18 Dec 2019 18:23:37 +0800 Subject: [PATCH 146/211] Update README.zh-CN.md --- README.zh-CN.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/README.zh-CN.md b/README.zh-CN.md index 2a6472af..6d3eab76 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -104,6 +104,51 @@ composer create-project swoft/swoft swoft [root@swoft swoft]# php bin/swoft rpc:start ``` +## 核心组件 + +Component Name | Packagist Version +--------------------|--------------------- +swoft-annotation | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/annotation.svg)](https://packagist.org/packages/swoft/annotation) +swoft-config | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/config.svg)](https://packagist.org/packages/swoft/config) +swoft-db | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/db.svg)](https://packagist.org/packages/swoft/db) +swoft-framework | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/framework.svg)](https://packagist.org/packages/swoft/framework) +swoft-i18n | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/i18n.svg)](https://packagist.org/packages/swoft/i18n) +swoft-proxy | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/proxy.svg)](https://packagist.org/packages/swoft/proxy) +swoft-rpc-client | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/rpc-client.svg)](https://packagist.org/packages/swoft/rpc-client) +swoft-stdlib | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/stdlib.svg)](https://packagist.org/packages/swoft/stdlib) +swoft-tcp-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp-server.svg)](https://packagist.org/packages/swoft/tcp-server) +swoft-aop | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/aop.svg)](https://packagist.org/packages/swoft/aop) +swoft-connection-pool | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/connection-pool.svg)](https://packagist.org/packages/swoft/connection-pool) +swoft-error | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/error.svg)](https://packagist.org/packages/swoft/error) +swoft-http-message | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/http-message.svg)](https://packagist.org/packages/swoft/http-message) +swoft-log | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/log.svg)](https://packagist.org/packages/swoft/log) +swoft-redis | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/redis.svg)](https://packagist.org/packages/swoft/redis) +swoft-rpc-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/rpc-server.svg)](https://packagist.org/packages/swoft/rpc-server) +swoft-task | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/task.svg)](https://packagist.org/packages/swoft/task) +swoft-validator | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/validator.svg)](https://packagist.org/packages/swoft/validator) +swoft-bean | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/bean.svg)](https://packagist.org/packages/swoft/bean) +swoft-console | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/console.svg)](https://packagist.org/packages/swoft/console) +swoft-event | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/event.svg)](https://packagist.org/packages/swoft/event) +swoft-http-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/http-server.svg)](https://packagist.org/packages/swoft/http-server) +swoft-process | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/process.svg)](https://packagist.org/packages/swoft/process) +swoft-rpc | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/rpc.svg)](https://packagist.org/packages/swoft/rpc) +swoft-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/server.svg)](https://packagist.org/packages/swoft/server) +swoft-tcp | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/tcp.svg)](https://packagist.org/packages/swoft/tcp) +swoft-websocket-server | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/websocket-server.svg)](https://packagist.org/packages/swoft/websocket-server) + +## 扩展组件 + +Component Name | Packagist Version +-----------------|--------------------- +swoft-apollo | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/apollo.svg)](https://packagist.org/packages/swoft/apollo) +swoft-breaker | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/breaker.svg)](https://packagist.org/packages/swoft/breaker) +swoft-crontab | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/crontab.svg)](https://packagist.org/packages/swoft/crontab) +swoft-consul | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/consul.svg)](https://packagist.org/packages/swoft/consul) +swoft-limiter | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/limiter.svg)](https://packagist.org/packages/swoft/limiter) +swoft-view | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/view.svg)](https://packagist.org/packages/swoft/view) +swoft-whoops | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/whoops.svg)](https://packagist.org/packages/swoft/whoops) +swoft-session | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/session.svg)](https://packagist.org/packages/swoft/session) + ## License Swoft is an open-source software licensed under the [LICENSE](LICENSE) From f6e0e6af0e6b1f36ae6e3cf028be5c0ead938526 Mon Sep 17 00:00:00 2001 From: inhere Date: Fri, 20 Dec 2019 12:47:19 +0800 Subject: [PATCH 147/211] up: add more examples, add some new config --- app/Http/Controller/CacheController.php | 71 ++++++++++++++++++++++ app/Http/Controller/SessionController.php | 19 +++++- app/bean.php | 12 +++- public/favicon.ico | Bin 0 -> 9662 bytes 4 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 app/Http/Controller/CacheController.php create mode 100644 public/favicon.ico diff --git a/app/Http/Controller/CacheController.php b/app/Http/Controller/CacheController.php new file mode 100644 index 00000000..b39a4399 --- /dev/null +++ b/app/Http/Controller/CacheController.php @@ -0,0 +1,71 @@ + $ok, 'ckey1' => $ok1]; + } + + /** + * @RequestMapping() + * + * @return array + * @throws InvalidArgumentException + */ + public function get(): array + { + $val = Cache::get('ckey'); + + return [ + 'ckey' => $val, + 'ckey1' => Cache::get('ckey1') + ]; + } + + /** + * @RequestMapping("del") + * + * @return array + * @throws InvalidArgumentException + */ + public function del(): array + { + /** @var Response $resp */ + // $resp = context()->getResponse(); + + return ['del' => Cache::delete('ckey')]; + } +} diff --git a/app/Http/Controller/SessionController.php b/app/Http/Controller/SessionController.php index 8287d8ec..4feab237 100644 --- a/app/Http/Controller/SessionController.php +++ b/app/Http/Controller/SessionController.php @@ -36,7 +36,10 @@ public function session(Response $response): Response $sess->set('times', $times); - return $response->withData(['times' => $times]); + return $response->withData([ + 'times' => $times, + 'sessId' => $sess->getSessionId() + ]); } /** @@ -86,9 +89,9 @@ public function get(): array public function del(): array { $sess = HttpSession::current(); - $sess->set('testKey', 'test-value'); + $ok = $sess->delete('testKey'); - return ['set.testKey' => 'test-value']; + return ['delete' => $ok]; } /** @@ -104,6 +107,16 @@ public function close(Response $response): Response return $response->withData(['destroy' => $sess->destroy()]); } + /** + * @RequestMapping() + * + * @return string + */ + public function not(): string + { + return 'not-use'; + } + // ------------ flash session usage /** diff --git a/app/bean.php b/app/bean.php index 5d65e6b9..64e2d926 100644 --- a/app/bean.php +++ b/app/bean.php @@ -40,7 +40,9 @@ 'class' => HttpServer::class, 'port' => 18306, 'listener' => [ - 'rpc' => bean('rpcServer') + // 'rpc' => bean('rpcServer'), + // 'tcp' => bean('tcpServer'), + // 'ws' => bean('wsServer') ], 'process' => [ // 'monitor' => bean(MonitorProcess::class) @@ -173,5 +175,11 @@ ], 'cliRouter' => [ // 'disabledGroups' => ['demo', 'test'], - ] + ], + 'wsConnectionManager' => [ + 'storage' => bean('wsConnectionStorage') + ], + 'wsConnectionStorage' => [ + 'class' => \Swoft\Session\SwooleStorage::class, + ], ]; diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d6fe12dc2ec62a2bff81e8728ad9ea213561dcbe GIT binary patch literal 9662 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 literal 0 HcmV?d00001 From 8f9e816b1389a9556f4c099e7d09c19977455e04 Mon Sep 17 00:00:00 2001 From: inhere Date: Fri, 20 Dec 2019 12:49:13 +0800 Subject: [PATCH 148/211] up: change session.mustGet to session.current --- app/WebSocket/Chat/HomeController.php | 4 ++-- app/WebSocket/EchoModule.php | 2 +- app/WebSocket/Test/TestController.php | 16 ++++++++-------- app/WebSocket/TestModule.php | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/WebSocket/Chat/HomeController.php b/app/WebSocket/Chat/HomeController.php index e4f3e3d5..35a730be 100644 --- a/app/WebSocket/Chat/HomeController.php +++ b/app/WebSocket/Chat/HomeController.php @@ -29,7 +29,7 @@ class HomeController */ public function index(): void { - Session::mustGet()->push('hi, this is home.index'); + Session::current()->push('hi, this is home.index'); } /** @@ -40,7 +40,7 @@ public function index(): void */ public function echo(string $data): void { - Session::mustGet()->push('(home.echo)Recv: ' . $data); + Session::current()->push('(home.echo)Recv: ' . $data); } /** diff --git a/app/WebSocket/EchoModule.php b/app/WebSocket/EchoModule.php index 93a1f92f..1c97cf0b 100644 --- a/app/WebSocket/EchoModule.php +++ b/app/WebSocket/EchoModule.php @@ -33,7 +33,7 @@ class EchoModule */ public function onOpen(Request $request, int $fd): void { - Session::mustGet()->push("Opened, welcome #{$fd}!"); + Session::current()->push("Opened, welcome #{$fd}!"); } /** diff --git a/app/WebSocket/Test/TestController.php b/app/WebSocket/Test/TestController.php index bebd22ed..e1685a10 100644 --- a/app/WebSocket/Test/TestController.php +++ b/app/WebSocket/Test/TestController.php @@ -37,7 +37,7 @@ class TestController */ public function index(): void { - Session::mustGet()->push('hi, this is test.index'); + Session::current()->push('hi, this is test.index'); } /** @@ -51,7 +51,7 @@ public function close(Message $msg): void { $data = $msg->getData(); /** @var Connection $conn */ - $conn = Session::mustGet(); + $conn = Session::current(); $fd = is_numeric($data) ? (int)$data : $conn->getFd(); @@ -73,7 +73,7 @@ public function injectRequest(Request $req): void { $fd = $req->getFd(); - Session::mustGet()->push("(your FD: $fd)message data: " . json_encode($req->getMessage()->toArray())); + Session::current()->push("(your FD: $fd)message data: " . json_encode($req->getMessage()->toArray())); } /** @@ -86,7 +86,7 @@ public function injectRequest(Request $req): void */ public function injectMessage(Message $msg): void { - Session::mustGet()->push('message data: ' . json_encode($msg->toArray())); + Session::current()->push('message data: ' . json_encode($msg->toArray())); } /** @@ -97,7 +97,7 @@ public function injectMessage(Message $msg): void */ public function echo(string $data): void { - Session::mustGet()->push('(echo)Recv: ' . $data); + Session::current()->push('(echo)Recv: ' . $data); } /** @@ -113,7 +113,7 @@ public function hi(Request $req, Response $res): void $ufd = (int)$req->getMessage()->getData(); if ($ufd < 1) { - Session::mustGet()->push('data must be an integer'); + Session::current()->push('data must be an integer'); return; } @@ -130,7 +130,7 @@ public function hi(Request $req, Response $res): void */ public function binary(string $data): string { - // Session::mustGet()->push('Binary: ' . $data, \WEBSOCKET_OPCODE_BINARY); + // Session::current()->push('Binary: ' . $data, \WEBSOCKET_OPCODE_BINARY); return 'Binary: ' . $data; } @@ -141,7 +141,7 @@ public function binary(string $data): string */ public function pong(): void { - Session::mustGet()->push('pong!', WEBSOCKET_OPCODE_PONG); + Session::current()->push('pong!', WEBSOCKET_OPCODE_PONG); } /** diff --git a/app/WebSocket/TestModule.php b/app/WebSocket/TestModule.php index fed7e97d..a282b85d 100644 --- a/app/WebSocket/TestModule.php +++ b/app/WebSocket/TestModule.php @@ -36,6 +36,6 @@ class TestModule */ public function onOpen(Request $request, int $fd): void { - Session::mustGet()->push("Opened, welcome!(FD: $fd)"); + Session::current()->push("Opened, welcome!(FD: $fd)"); } } From 82a3a24d9c02919a9eb8c0f13b2bf0d01f558383 Mon Sep 17 00:00:00 2001 From: shiyifei Date: Thu, 26 Dec 2019 16:45:11 +0800 Subject: [PATCH 149/211] request support get/post method, but only post request can be validated correctly --- app/Http/Controller/ValidatorController.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/Http/Controller/ValidatorController.php b/app/Http/Controller/ValidatorController.php index a0f6a95f..bb0a61af 100644 --- a/app/Http/Controller/ValidatorController.php +++ b/app/Http/Controller/ValidatorController.php @@ -13,6 +13,7 @@ use Swoft\Http\Message\Request; use Swoft\Http\Server\Annotation\Mapping\Controller; use Swoft\Http\Server\Annotation\Mapping\RequestMapping; +use Swoft\Http\Server\Annotation\Mapping\RequestMethod; use Swoft\Validator\Annotation\Mapping\Validate; /** @@ -34,6 +35,10 @@ class ValidatorController */ public function validateAll(Request $request): array { + $method = $request->getMethod(); + if ($method == RequestMethod::GET) { + return $request->getParsedQuery(); + } return $request->getParsedBody(); } @@ -49,6 +54,10 @@ public function validateAll(Request $request): array */ public function validateType(Request $request): array { + $method = $request->getMethod(); + if ($method == RequestMethod::GET) { + return $request->getParsedQuery(); + } return $request->getParsedBody(); } @@ -64,6 +73,10 @@ public function validateType(Request $request): array */ public function validatePassword(Request $request): array { + $method = $request->getMethod(); + if ($method == RequestMethod::GET) { + return $request->getParsedQuery(); + } return $request->getParsedBody(); } @@ -71,6 +84,7 @@ public function validatePassword(Request $request): array * Customize the validator with userValidator * * @RequestMapping() + * * @Validate(validator="userValidator") * * @param Request $request @@ -79,6 +93,10 @@ public function validatePassword(Request $request): array */ public function validateCustomer(Request $request): array { + $method = $request->getMethod(); + if ($method == RequestMethod::GET) { + return $request->getParsedQuery(); + } return $request->getParsedBody(); } } From c8be05a962d495b32b8c994edf8d77af39d67e00 Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 26 Dec 2019 16:58:33 +0800 Subject: [PATCH 150/211] Create PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..5761ac29 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,29 @@ + + +### What does this PR do? + + + + +### Motivation + + + + +### More + +- [ ] Added/updated tests +- [ ] Added/updated documentation + +### Additional Notes + + From 277944157c3ba11232cd61c1f3478d5e416ad390 Mon Sep 17 00:00:00 2001 From: Inhere Date: Fri, 27 Dec 2019 14:21:37 +0800 Subject: [PATCH 151/211] upgrade swoole to latest 4.4.14 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 56e5bd55..b8b0f967 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"prod"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=5.1.0 \ - SWOOLE_VERSION=4.4.8 \ + SWOOLE_VERSION=4.4.14 \ COMPOSER_ALLOW_SUPERUSER=1 # Libs -y --no-install-recommends From a5b4fcd6f9480bb3a23ef548162a3bbbbc69339e Mon Sep 17 00:00:00 2001 From: Inhere Date: Fri, 27 Dec 2019 19:27:22 +0800 Subject: [PATCH 152/211] Update label.yml --- .github/workflows/label.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 64985ffc..eee2c365 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -25,6 +25,28 @@ jobs: assignees: '["sakuraovq"]' # labels to be set when keyword is found labels: '["swoft: db"]' # optional + - name: Http Issue Labeler + uses: Naturalclar/issue-action@v1.0.0 + with: + # Github token + github-token: "${{ secrets.GITHUB_TOKEN }}" + # keywords to look for in the issue + keywords: '["http", "http-server", "http-client", "http-message"]' + # assignees to be assigned when keyword is found + assignees: '["stelin", "inhere"]' + # labels to be set when keyword is found + labels: '["swoft: http"]' # optional + - name: Rpc Issue Labeler + uses: Naturalclar/issue-action@v1.0.0 + with: + # Github token + github-token: "${{ secrets.GITHUB_TOKEN }}" + # keywords to look for in the issue + keywords: '["rpc", "rpc-server", "rpc-client"]' + # assignees to be assigned when keyword is found + assignees: '["stelin"]' + # labels to be set when keyword is found + labels: '["swoft: rpc"]' # optional - name: Websocket Issue Labeler uses: Naturalclar/issue-action@v1.0.0 with: From a902403b7114c135b85ec83b7066556feaefbe1b Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 9 Jan 2020 18:29:57 +0800 Subject: [PATCH 153/211] Update label.yml --- .github/workflows/label.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index eee2c365..4a7e3a26 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -25,6 +25,17 @@ jobs: assignees: '["sakuraovq"]' # labels to be set when keyword is found labels: '["swoft: db"]' # optional + - name: Event Issue Labeler + uses: Naturalclar/issue-action@v1.0.0 + with: + # Github token + github-token: "${{ secrets.GITHUB_TOKEN }}" + # keywords to look for in the issue + keywords: '["event", "trigger"]' + # assignees to be assigned when keyword is found + assignees: '["inhere"]' + # labels to be set when keyword is found + labels: '["swoft: event"]' # optional - name: Http Issue Labeler uses: Naturalclar/issue-action@v1.0.0 with: From ad01de7232911f3f12cb52a589e27197d2c35ab0 Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 13 Jan 2020 20:14:18 +0800 Subject: [PATCH 154/211] update: add some new demo codes --- app/WebSocket/Test/TestController.php | 14 +++++ app/bean.php | 12 ++-- bin/bootstrap.php | 8 ++- docker-compose.yml | 4 +- test/bootstrap.php | 6 ++ test/run.php | 80 +++++++++++++++++++++++++++ 6 files changed, 116 insertions(+), 8 deletions(-) create mode 100755 test/run.php diff --git a/app/WebSocket/Test/TestController.php b/app/WebSocket/Test/TestController.php index e1685a10..fd7d7b6f 100644 --- a/app/WebSocket/Test/TestController.php +++ b/app/WebSocket/Test/TestController.php @@ -156,4 +156,18 @@ public function autoReply(string $data): string { return '(home.ar)Recv: ' . $data; } + + /** + * Message command is: 'test.ar' + * + * @MessageMapping("stop-worker") + */ + public function testDie(): void + { + $wid = \server()->getPid('workerId'); + + \vdump($wid); + + \server()->stopWorker($wid); + } } diff --git a/app/bean.php b/app/bean.php index 64e2d926..e0f982d9 100644 --- a/app/bean.php +++ b/app/bean.php @@ -150,6 +150,12 @@ 'log_file' => alias('@runtime/swoole.log'), ], ], + // 'wsConnectionManager' => [ + // 'storage' => bean('wsConnectionStorage') + // ], + // 'wsConnectionStorage' => [ + // 'class' => \Swoft\Session\SwooleStorage::class, + // ], /** @see \Swoft\WebSocket\Server\WsMessageDispatcher */ 'wsMsgDispatcher' => [ 'middlewares' => [ @@ -176,10 +182,4 @@ 'cliRouter' => [ // 'disabledGroups' => ['demo', 'test'], ], - 'wsConnectionManager' => [ - 'storage' => bean('wsConnectionStorage') - ], - 'wsConnectionStorage' => [ - 'class' => \Swoft\Session\SwooleStorage::class, - ], ]; diff --git a/bin/bootstrap.php b/bin/bootstrap.php index e45da053..bd8c79bb 100644 --- a/bin/bootstrap.php +++ b/bin/bootstrap.php @@ -7,4 +7,10 @@ * @contact group@swoft.org * @license https://github.com/swoft-cloud/swoft/blob/master/LICENSE */ -require_once dirname(__DIR__) . '/vendor/autoload.php'; + +/** @var \Composer\Autoload\ClassLoader $loader */ +$loader = require dirname(__DIR__) . '/vendor/autoload.php'; + +$loader->addPsr4("Swoft\\Cache\\", 'vendor/swoft/cache/src/'); +$loader->addPsr4("Swoft\\Swlib\\", 'vendor/swoft/swlib/src/'); +$loader->addPsr4("Swoft\\Serialize\\", 'vendor/swoft/serialize/src/'); diff --git a/docker-compose.yml b/docker-compose.yml index 6b795d76..17988fb4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,7 +17,9 @@ services: - "18307:18307" - "18308:18308" volumes: - - ./:/var/www/swoft + - ./:/var/www/swoft +# - ./:/var/www/swoft:delegated +# - ./:/var/www/swoft:cached # - ./runtime/ng-conf:/etc/nginx # - ./runtime/logs:/var/log diff --git a/test/bootstrap.php b/test/bootstrap.php index 1cee8fd8..d29c06a1 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -9,3 +9,9 @@ */ define('APP_DEBUG', 1); + +$vendor = dirname(__DIR__); + +/** @var \Composer\Autoload\ClassLoader $loader */ +$loader = require dirname(__DIR__) . '/vendor/autoload.php'; +$loader->addPsr4("SwoftTest\\Testing\\", $vendor . '/swoft/framework/test/testing/'); diff --git a/test/run.php b/test/run.php new file mode 100755 index 00000000..8069fece --- /dev/null +++ b/test/run.php @@ -0,0 +1,80 @@ + SWOOLE_LOG_INFO, + 'trace_flags' => 0 +]); + +/* + * This file is part of PHPUnit. + * + * (c) Sebastian Bergmann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +if (version_compare('7.1.0', PHP_VERSION, '>')) { + fwrite(STDERR, + sprintf('This version of PHPUnit is supported on PHP 7.1 and PHP 7.2.' . PHP_EOL . 'You are using PHP %s (%s).' . PHP_EOL, + PHP_VERSION, PHP_BINARY)); + die(1); +} + +if (!ini_get('date.timezone')) { + ini_set('date.timezone', 'UTC'); +} + +// add loader file +$__loader_file = dirname(__DIR__) . '/vendor/autoload.php'; +if (file_exists($__loader_file)) { + define('PHPUNIT_COMPOSER_INSTALL', $__loader_file); +} + +if (!defined('PHPUNIT_COMPOSER_INSTALL')) { + fwrite(STDERR, + "You need to set up the project dependencies using Composer:\n\n" + . ' composer install' . PHP_EOL . PHP_EOL + . 'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL); + die(1); +} + +if (array_reverse(explode('/', __DIR__))[0] ?? '' === 'test') { + $vendor_dir = dirname(PHPUNIT_COMPOSER_INSTALL); + $bin_unit = "{$vendor_dir}/bin/phpunit"; + $unit_uint = "{$vendor_dir}/phpunit/phpunit/phpunit"; + if (file_exists($bin_unit)) { + @unlink($bin_unit); + @symlink(__FILE__, $bin_unit); + } + if (file_exists($unit_uint)) { + @unlink($unit_uint); + @symlink(__FILE__, $unit_uint); + } +} + +if (!in_array('-c', $_SERVER['argv'], true)) { + $_SERVER['argv'][] = '-c'; + $_SERVER['argv'][] = dirname(__DIR__) . '/phpunit.xml'; +} + +require PHPUNIT_COMPOSER_INSTALL; + +$status = 0; +\Swoft\Co::run(function () { + // Status + global $status; + + try { + $status = Command::main(false); + } catch (ExitException $e) { + $status = $e->getCode(); + echo 'ExitException: ' . $e->getMessage(), "\n"; + } +}); + +exit($status); From 87dc04ad74f1293f8c8b226835cddd90f3b0aaf9 Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 13 Jan 2020 22:12:05 +0800 Subject: [PATCH 155/211] add some new file --- test/bootstrap.php | 2 +- test/testing/AutoLoader.php | 33 +++++++++++++++++++++++++++++++++ test/testing/bean.php | 7 +++++++ test/unit/ExampleTest.php | 10 ++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 test/testing/AutoLoader.php create mode 100644 test/testing/bean.php create mode 100644 test/unit/ExampleTest.php diff --git a/test/bootstrap.php b/test/bootstrap.php index d29c06a1..0c24e283 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -10,7 +10,7 @@ define('APP_DEBUG', 1); -$vendor = dirname(__DIR__); +$vendor = dirname(__DIR__) . '/vendor'; /** @var \Composer\Autoload\ClassLoader $loader */ $loader = require dirname(__DIR__) . '/vendor/autoload.php'; diff --git a/test/testing/AutoLoader.php b/test/testing/AutoLoader.php new file mode 100644 index 00000000..40f2c74c --- /dev/null +++ b/test/testing/AutoLoader.php @@ -0,0 +1,33 @@ + __DIR__, + ]; + } + + /** + * @return array + */ + public function metadata(): array + { + return []; + } +} diff --git a/test/testing/bean.php b/test/testing/bean.php new file mode 100644 index 00000000..0eb0174d --- /dev/null +++ b/test/testing/bean.php @@ -0,0 +1,7 @@ + [ + 'path' => __DIR__ . '/../config', + ] +]; diff --git a/test/unit/ExampleTest.php b/test/unit/ExampleTest.php new file mode 100644 index 00000000..d2f91e6b --- /dev/null +++ b/test/unit/ExampleTest.php @@ -0,0 +1,10 @@ + Date: Wed, 15 Jan 2020 12:49:42 +0800 Subject: [PATCH 156/211] update: add some new file --- test/apitest/.keep | 0 test/bootstrap.php | 19 +++++++++---------- test/testing/bean.php | 7 ------- 3 files changed, 9 insertions(+), 17 deletions(-) create mode 100644 test/apitest/.keep delete mode 100644 test/testing/bean.php diff --git a/test/apitest/.keep b/test/apitest/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/bootstrap.php b/test/bootstrap.php index 0c24e283..cd1c69b4 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -1,17 +1,16 @@ addPsr4("SwoftTest\\Testing\\", $vendor . '/swoft/framework/test/testing/'); + +$application = new TestApplication([ + 'basePath' => $baseDir, +]); +$application->setBeanFile($baseDir . '/app/bean.php'); +$application->run(); diff --git a/test/testing/bean.php b/test/testing/bean.php deleted file mode 100644 index 0eb0174d..00000000 --- a/test/testing/bean.php +++ /dev/null @@ -1,7 +0,0 @@ - [ - 'path' => __DIR__ . '/../config', - ] -]; From a0f8b8aa4b9cc27397368e4e0c8f15ee919cb2fc Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 16 Jan 2020 10:15:14 +0800 Subject: [PATCH 157/211] Update label.yml --- .github/workflows/label.yml | 38 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 4a7e3a26..35bf54f4 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -25,47 +25,45 @@ jobs: assignees: '["sakuraovq"]' # labels to be set when keyword is found labels: '["swoft: db"]' # optional + - name: AOP Issue Labeler + uses: Naturalclar/issue-action@v1.0.0 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + keywords: '["aop", "Point"]' + assignees: '["stelin"]' + labels: '["swoft: aop"]' + - name: Config Issue Labeler + uses: Naturalclar/issue-action@v1.0.0 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + keywords: '["env", "config"]' + assignees: '["stelin", "inhere"]' + labels: '["swoft: config"]' - name: Event Issue Labeler uses: Naturalclar/issue-action@v1.0.0 with: - # Github token github-token: "${{ secrets.GITHUB_TOKEN }}" - # keywords to look for in the issue keywords: '["event", "trigger"]' - # assignees to be assigned when keyword is found assignees: '["inhere"]' - # labels to be set when keyword is found - labels: '["swoft: event"]' # optional + labels: '["swoft: event"]' - name: Http Issue Labeler uses: Naturalclar/issue-action@v1.0.0 with: - # Github token github-token: "${{ secrets.GITHUB_TOKEN }}" - # keywords to look for in the issue keywords: '["http", "http-server", "http-client", "http-message"]' - # assignees to be assigned when keyword is found assignees: '["stelin", "inhere"]' - # labels to be set when keyword is found - labels: '["swoft: http"]' # optional + labels: '["swoft: http"]' - name: Rpc Issue Labeler uses: Naturalclar/issue-action@v1.0.0 with: - # Github token github-token: "${{ secrets.GITHUB_TOKEN }}" - # keywords to look for in the issue keywords: '["rpc", "rpc-server", "rpc-client"]' - # assignees to be assigned when keyword is found assignees: '["stelin"]' - # labels to be set when keyword is found - labels: '["swoft: rpc"]' # optional + labels: '["swoft: rpc"]' - name: Websocket Issue Labeler uses: Naturalclar/issue-action@v1.0.0 with: - # Github token github-token: "${{ secrets.GITHUB_TOKEN }}" - # keywords to look for in the issue keywords: '["websocket", "websocket-server", "ws-server"]' - # assignees to be assigned when keyword is found assignees: '["inhere"]' - # labels to be set when keyword is found - labels: '["swoft: websocket"]' # optional + labels: '["swoft: websocket"]' From 2fe21a2fee259fc1cccd8a8094ec67e00c74aca5 Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 16 Jan 2020 10:15:53 +0800 Subject: [PATCH 158/211] Update label.yml --- .github/workflows/label.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 35bf54f4..6c549140 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -50,7 +50,7 @@ jobs: uses: Naturalclar/issue-action@v1.0.0 with: github-token: "${{ secrets.GITHUB_TOKEN }}" - keywords: '["http", "http-server", "http-client", "http-message"]' + keywords: '["http-server", "http-client", "http-message"]' assignees: '["stelin", "inhere"]' labels: '["swoft: http"]' - name: Rpc Issue Labeler From c51406125a61ba9bd8f2d7fc6e4b40016c05987f Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 16 Jan 2020 20:18:07 +0800 Subject: [PATCH 159/211] Update .travis.yml --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index bab6451d..88baa188 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ install: - | echo "no" | pecl install -f redis - | - wget https://github.com/swoole/swoole-src/archive/v4.4.6.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - && rm -rf swoole + wget https://github.com/swoole/swoole-src/archive/v4.4.15.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - && rm -rf swoole echo "extension = swoole.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - | wget -O bin/php-cs-fixer "https://cs.symfony.com/download/php-cs-fixer-v2.phar" @@ -22,7 +22,7 @@ install: before_script: - phpenv config-rm xdebug.ini - composer config -g process-timeout 900 && composer update - - composer require --dev phpstan/phpstan-shim + - composer require --dev phpstan/phpstan script: - composer cs-fix From 270033225c07a94874a59d9962d63eb2a881327a Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 16 Jan 2020 21:00:52 +0800 Subject: [PATCH 160/211] Update phpstan.neon.dist --- phpstan.neon.dist | 1 + 1 file changed, 1 insertion(+) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 8760f4a9..203d0836 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -3,6 +3,7 @@ includes: parameters: level: max inferPrivatePropertyTypeFromConstructor: true + checkMissingIterableValueType: false paths: - %currentWorkingDirectory%/app/ autoload_files: From 2fa2bd5fb589a9a61413311c46fb6793db244c81 Mon Sep 17 00:00:00 2001 From: inhere Date: Fri, 17 Jan 2020 19:58:54 +0800 Subject: [PATCH 161/211] update some --- test/apitest/.keep | 1 + test/run.php | 14 -------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/test/apitest/.keep b/test/apitest/.keep index e69de29b..18e1ba37 100644 --- a/test/apitest/.keep +++ b/test/apitest/.keep @@ -0,0 +1 @@ +If you want run api test, must start an server before run tests. diff --git a/test/run.php b/test/run.php index 8069fece..9e2acf85 100755 --- a/test/run.php +++ b/test/run.php @@ -43,20 +43,6 @@ die(1); } -if (array_reverse(explode('/', __DIR__))[0] ?? '' === 'test') { - $vendor_dir = dirname(PHPUNIT_COMPOSER_INSTALL); - $bin_unit = "{$vendor_dir}/bin/phpunit"; - $unit_uint = "{$vendor_dir}/phpunit/phpunit/phpunit"; - if (file_exists($bin_unit)) { - @unlink($bin_unit); - @symlink(__FILE__, $bin_unit); - } - if (file_exists($unit_uint)) { - @unlink($unit_uint); - @symlink(__FILE__, $unit_uint); - } -} - if (!in_array('-c', $_SERVER['argv'], true)) { $_SERVER['argv'][] = '-c'; $_SERVER['argv'][] = dirname(__DIR__) . '/phpunit.xml'; From 610909223b915ab38b5ff249dde5878adb8d9f54 Mon Sep 17 00:00:00 2001 From: inhere Date: Fri, 17 Jan 2020 20:51:40 +0800 Subject: [PATCH 162/211] update some for format check --- app/Http/Controller/CacheController.php | 2 +- app/bean.php | 8 +++++++- bin/bootstrap.php | 4 +--- phpstan.neon.dist | 2 +- test/bootstrap.php | 11 +++++++++-- test/run.php | 26 +++++++++++++++++++------ test/testing/AutoLoader.php | 8 ++++++++ test/unit/ExampleTest.php | 9 ++++++++- 8 files changed, 55 insertions(+), 15 deletions(-) diff --git a/app/Http/Controller/CacheController.php b/app/Http/Controller/CacheController.php index b39a4399..510aa33d 100644 --- a/app/Http/Controller/CacheController.php +++ b/app/Http/Controller/CacheController.php @@ -10,7 +10,7 @@ namespace App\Http\Controller; -use Psr\SimpleCache\InvalidArgumentException; +use InvalidArgumentException; use Swoft\Cache\Cache; use Swoft\Http\Message\Response; use Swoft\Http\Server\Annotation\Mapping\Controller; diff --git a/app/bean.php b/app/bean.php index e0f982d9..ec3be201 100644 --- a/app/bean.php +++ b/app/bean.php @@ -136,17 +136,23 @@ 'class' => WebSocketServer::class, 'port' => 18308, 'listener' => [ - // 'rpc' => bean('rpcServer'), + 'rpc' => bean('rpcServer'), // 'tcp' => bean('tcpServer'), ], 'on' => [ // Enable http handle SwooleEvent::REQUEST => bean(RequestListener::class), + // Enable task must add task and finish event + SwooleEvent::TASK => bean(TaskListener::class), + SwooleEvent::FINISH => bean(FinishListener::class) ], 'debug' => 1, // 'debug' => env('SWOFT_DEBUG', 0), /* @see WebSocketServer::$setting */ 'setting' => [ + 'task_worker_num' => 6, + 'task_enable_coroutine' => true, + 'worker_num' => 6, 'log_file' => alias('@runtime/swoole.log'), ], ], diff --git a/bin/bootstrap.php b/bin/bootstrap.php index bd8c79bb..e246bf47 100644 --- a/bin/bootstrap.php +++ b/bin/bootstrap.php @@ -11,6 +11,4 @@ /** @var \Composer\Autoload\ClassLoader $loader */ $loader = require dirname(__DIR__) . '/vendor/autoload.php'; -$loader->addPsr4("Swoft\\Cache\\", 'vendor/swoft/cache/src/'); -$loader->addPsr4("Swoft\\Swlib\\", 'vendor/swoft/swlib/src/'); -$loader->addPsr4("Swoft\\Serialize\\", 'vendor/swoft/serialize/src/'); +// $loader->addPsr4('Swoft\\Cache\\', 'vendor/swoft/cache/src/'); diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 8760f4a9..fe2bdc92 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -6,7 +6,7 @@ parameters: paths: - %currentWorkingDirectory%/app/ autoload_files: - - %currentWorkingDirectory%/test/bootstrap.php + - %currentWorkingDirectory%/bin/bootstrap.php autoload_directories: - %currentWorkingDirectory%/vendor/swoft/swoole-ide-helper/output/namespace/ dynamicConstantNames: diff --git a/test/bootstrap.php b/test/bootstrap.php index cd1c69b4..2090aff5 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -1,5 +1,12 @@ addPsr4("SwoftTest\\Testing\\", $vendor . '/swoft/framework/test/testing/'); +$loader->addPsr4('SwoftTest\\Testing\\', $vendor . '/swoft/framework/test/testing/'); $application = new TestApplication([ 'basePath' => $baseDir, diff --git a/test/run.php b/test/run.php index 9e2acf85..d1ec1e53 100755 --- a/test/run.php +++ b/test/run.php @@ -1,5 +1,12 @@ ')) { - fwrite(STDERR, - sprintf('This version of PHPUnit is supported on PHP 7.1 and PHP 7.2.' . PHP_EOL . 'You are using PHP %s (%s).' . PHP_EOL, - PHP_VERSION, PHP_BINARY)); + fwrite( + STDERR, + sprintf( + 'This version of PHPUnit is supported on PHP 7.1 and PHP 7.2.' . PHP_EOL . 'You are using PHP %s (%s).' . PHP_EOL, + PHP_VERSION, + PHP_BINARY + ) + ); die(1); } @@ -36,10 +48,12 @@ } if (!defined('PHPUNIT_COMPOSER_INSTALL')) { - fwrite(STDERR, + fwrite( + STDERR, "You need to set up the project dependencies using Composer:\n\n" . ' composer install' . PHP_EOL . PHP_EOL - . 'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL); + . 'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL + ); die(1); } diff --git a/test/testing/AutoLoader.php b/test/testing/AutoLoader.php index 40f2c74c..a0a5b1d2 100644 --- a/test/testing/AutoLoader.php +++ b/test/testing/AutoLoader.php @@ -1,4 +1,12 @@ Date: Fri, 17 Jan 2020 21:50:33 +0800 Subject: [PATCH 163/211] fix missing prams --- app/Validator/Rule/AlphaDashRule.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Validator/Rule/AlphaDashRule.php b/app/Validator/Rule/AlphaDashRule.php index 621303db..76d8cc3a 100644 --- a/app/Validator/Rule/AlphaDashRule.php +++ b/app/Validator/Rule/AlphaDashRule.php @@ -23,15 +23,16 @@ class AlphaDashRule implements RuleInterface { /** - * @param array $data + * @param array $data * @param string $propertyName * @param object $item - * @param null $default + * @param null $default + * @param bool $strict * * @return array * @throws ValidatorException */ - public function validate(array $data, string $propertyName, $item, $default = null): array + public function validate(array $data, string $propertyName, $item, $default = null, $strict = false): array { $message = $item->getMessage(); if (!isset($data[$propertyName]) && $default === null) { From 3023511b6361027ec809b57c7d5afb1cf45ec222 Mon Sep 17 00:00:00 2001 From: inhere Date: Sat, 18 Jan 2020 10:00:32 +0800 Subject: [PATCH 164/211] update some --- test/run.php | 34 +++++++++++++++------------------- test/unit/ExampleTest.php | 5 +++++ 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/test/run.php b/test/run.php index d1ec1e53..057ec7a4 100755 --- a/test/run.php +++ b/test/run.php @@ -12,11 +12,6 @@ use Swoole\Coroutine; use Swoole\ExitException; -Coroutine::set([ - 'log_level' => SWOOLE_LOG_INFO, - 'trace_flags' => 0 -]); - /* * This file is part of PHPUnit. * @@ -26,14 +21,9 @@ * file that was distributed with this source code. */ if (version_compare('7.1.0', PHP_VERSION, '>')) { - fwrite( - STDERR, - sprintf( - 'This version of PHPUnit is supported on PHP 7.1 and PHP 7.2.' . PHP_EOL . 'You are using PHP %s (%s).' . PHP_EOL, - PHP_VERSION, - PHP_BINARY - ) - ); + $tips = "This version of PHPUnit is supported on PHP 7.1 and PHP 7.2. \nYou are using PHP %s (%s)."; + + fwrite(STDERR, sprintf($tips, PHP_VERSION, PHP_BINARY)); die(1); } @@ -48,12 +38,12 @@ } if (!defined('PHPUNIT_COMPOSER_INSTALL')) { - fwrite( - STDERR, - "You need to set up the project dependencies using Composer:\n\n" - . ' composer install' . PHP_EOL . PHP_EOL - . 'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL - ); + $tips = << SWOOLE_LOG_INFO, + 'trace_flags' => 0 +]); + \Swoft\Co::run(function () { // Status global $status; diff --git a/test/unit/ExampleTest.php b/test/unit/ExampleTest.php index b2b7abef..7de7125b 100644 --- a/test/unit/ExampleTest.php +++ b/test/unit/ExampleTest.php @@ -11,7 +11,12 @@ namespace AppTest\Unit; use PHPUnit\Framework\TestCase; +use function bean; class ExampleTest extends TestCase { + public function testDemo(): void + { + $this->assertNotEmpty(bean('cliApp')); + } } From a997a116925d59ba2dad3482130765bb20f6b484 Mon Sep 17 00:00:00 2001 From: inhere Date: Sat, 18 Jan 2020 11:05:28 +0800 Subject: [PATCH 165/211] update some --- phpstan.neon.dist | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index fe2bdc92..99143486 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -11,6 +11,11 @@ parameters: - %currentWorkingDirectory%/vendor/swoft/swoole-ide-helper/output/namespace/ dynamicConstantNames: - APP_DEBUG + - SWOFT_DEBUG + excludes_analyse: + - test/* + - runtime/* + - resource/* ignoreErrors: # Variable type - '#^Call to an undefined method Swoft\\Contract\\ContextInterface::get\S+\(\)\.$#' @@ -19,6 +24,8 @@ parameters: - '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' # - '#^Call to an undefined method Swoft\\Server\\Server::disconnect\(\)\.$#' - '#^Call to an undefined method\sPsr\\Http\\Message\\ServerRequestInterface::getUriPath\(\)#' + - '#.+onstant APP_DEBUG not found.#' + - '#^Call to static method \w+\(\) on an unknown class Swoft\\Cache\\Cache.#' # These are ignored for now - path: %currentWorkingDirectory%/app/Http/Controller/DbModelController.php From 04482b0454c106d3d199405d777a78edab2d8f2e Mon Sep 17 00:00:00 2001 From: Inhere Date: Sat, 18 Jan 2020 17:55:34 +0800 Subject: [PATCH 166/211] Update label.yml --- .github/workflows/label.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 6c549140..c848525d 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -32,6 +32,13 @@ jobs: keywords: '["aop", "Point"]' assignees: '["stelin"]' labels: '["swoft: aop"]' + - name: Validate Issue Labeler + uses: Naturalclar/issue-action@v1.0.0 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + keywords: '["validator", "validate"]' + assignees: '["stelin", "JasonYH"]' + labels: '["swoft: validate"]' - name: Config Issue Labeler uses: Naturalclar/issue-action@v1.0.0 with: From c6cdd3972e02242c79d5b6b7adbc5355e6d4823a Mon Sep 17 00:00:00 2001 From: Inhere Date: Sat, 18 Jan 2020 17:56:22 +0800 Subject: [PATCH 167/211] Update label.yml --- .github/workflows/label.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index c848525d..b7052a08 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -38,7 +38,7 @@ jobs: github-token: "${{ secrets.GITHUB_TOKEN }}" keywords: '["validator", "validate"]' assignees: '["stelin", "JasonYH"]' - labels: '["swoft: validate"]' + labels: '["swoft: validator"]' - name: Config Issue Labeler uses: Naturalclar/issue-action@v1.0.0 with: From 95389738f9032cc8e29e83f0a1e917eac1cc2275 Mon Sep 17 00:00:00 2001 From: inhere Date: Mon, 20 Jan 2020 13:23:01 +0800 Subject: [PATCH 168/211] up: add ws test page --- app/Http/Controller/HomeController.php | 11 + resource/views/home/ws-test.php | 394 +++++++++++++++++++++++++ 2 files changed, 405 insertions(+) create mode 100644 resource/views/home/ws-test.php diff --git a/app/Http/Controller/HomeController.php b/app/Http/Controller/HomeController.php index 5e37a48e..88b8f53e 100644 --- a/app/Http/Controller/HomeController.php +++ b/app/Http/Controller/HomeController.php @@ -58,4 +58,15 @@ public function hello(string $name): Response { return context()->getResponse()->withContent('Hello' . ($name === '' ? '' : ", {$name}")); } + + /** + * @RequestMapping("/wstest", method={"GET"}) + * + * @return Response + * @throws Throwable + */ + public function wsTest(): Response + { + return view('home/ws-test'); + } } diff --git a/resource/views/home/ws-test.php b/resource/views/home/ws-test.php new file mode 100644 index 00000000..76fae6a7 --- /dev/null +++ b/resource/views/home/ws-test.php @@ -0,0 +1,394 @@ + + + + + + + WebSocket Testing - Swoft 2.0 + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      Configuration
      +
      +
      WebSocket Server Address
      +
      + +
      + +
      + + +
      +
      +

      Please note that the server address, port, path, etc. are correct

      +
      +
      +
      + + +
      +
      + + +
      +
      +
      + +
      +
      + +
      +
      +
      Messages
      +
      +

      websocket message box

      +
      +
      +
      + You at 2020-1-20 10:54:40 +
      +
      +
      + User send message example +
      +
      +
      +
      +
      + Server at 2020-1-20 10:54:40 +
      +
      +
      + Server reply message example +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + + + + + From 7b2145f74c77366b61c5f300ffa32e765ae6ae73 Mon Sep 17 00:00:00 2001 From: Inhere Date: Tue, 21 Jan 2020 20:28:04 +0800 Subject: [PATCH 169/211] Update Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index b8b0f967..4280aa04 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"prod"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=5.1.0 \ - SWOOLE_VERSION=4.4.14 \ + SWOOLE_VERSION=4.4.15 \ COMPOSER_ALLOW_SUPERUSER=1 # Libs -y --no-install-recommends From 3678b3e8e234ddb5bae8a616abcf9f2178672075 Mon Sep 17 00:00:00 2001 From: doobas Date: Tue, 11 Feb 2020 08:40:35 +0200 Subject: [PATCH 170/211] English documentation url English documentation link does't work. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ca1b0e57..47260172 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Through three years of accumulation and direction exploration, Swoft has made Sw ## Document - [中文文档](https://www.swoft.org/docs) -- [English](https://en.swoft.org/docs) +- [English](http://swoft.io/docs) ## Discuss From c869ad640b07228791c9e13b2a0aa5dfff6cea27 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 25 Mar 2020 12:30:02 +0800 Subject: [PATCH 171/211] upgrade swoole to 4.4.16 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 4280aa04..075b1657 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"prod"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=5.1.0 \ - SWOOLE_VERSION=4.4.15 \ + SWOOLE_VERSION=4.4.16 \ COMPOSER_ALLOW_SUPERUSER=1 # Libs -y --no-install-recommends From 0ab3dc5395a4be3265b594ed0e40bb807d262e2d Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 2 Apr 2020 20:01:17 +0800 Subject: [PATCH 172/211] upgrade swoole to 4.4.17 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 075b1657..11cc8c6c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"prod"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=5.1.0 \ - SWOOLE_VERSION=4.4.16 \ + SWOOLE_VERSION=4.4.17 \ COMPOSER_ALLOW_SUPERUSER=1 # Libs -y --no-install-recommends From bcb8533aeed42d3359efb2fe0ea3fe05620e0ad3 Mon Sep 17 00:00:00 2001 From: inhere Date: Sun, 12 Apr 2020 14:35:28 +0800 Subject: [PATCH 173/211] add more examples --- app/Aspect/BeanAspect.php | 35 ++++++++++++ app/Aspect/RequestBeanAspect.php | 54 +++++++++++++++++++ app/Common/MyBean.php | 22 ++++++++ app/Common/RpcProvider.php | 4 -- app/Http/Controller/BeanController.php | 22 ++++++-- app/Http/Controller/HomeController.php | 12 +++++ app/Http/Controller/SelectDbController.php | 6 --- app/Model/Data/GoodsData.php | 19 +++++++ app/Model/Logic/ConsulLogic.php | 4 -- app/Model/Logic/RequestBean.php | 2 + app/WebSocket/Chat/HomeController.php | 13 +++++ app/WebSocket/ChatModule.php | 23 ++++++++ .../Middleware/GlobalWsMiddleware.php | 2 + app/bean.php | 6 ++- config/app.php | 9 ++++ database/Migration/Count.php | 6 --- database/Migration/Desc.php | 6 --- 17 files changed, 214 insertions(+), 31 deletions(-) create mode 100644 app/Aspect/BeanAspect.php create mode 100644 app/Aspect/RequestBeanAspect.php create mode 100644 app/Common/MyBean.php create mode 100644 app/Model/Data/GoodsData.php create mode 100644 config/app.php diff --git a/app/Aspect/BeanAspect.php b/app/Aspect/BeanAspect.php new file mode 100644 index 00000000..bffadecf --- /dev/null +++ b/app/Aspect/BeanAspect.php @@ -0,0 +1,35 @@ +temp); + } + + /** + * @After() + */ + public function afterRun(): void + { + $id = (string)Co::tid(); + /** @var RequestBean $rb */ + $rb = BF::getRequestBean('requestBean', $id); + + vdump(__METHOD__, $rb->temp); + } +} diff --git a/app/Common/MyBean.php b/app/Common/MyBean.php new file mode 100644 index 00000000..a6cd49b7 --- /dev/null +++ b/app/Common/MyBean.php @@ -0,0 +1,22 @@ +myMethod()]; + } + + /** + * @RequestMapping("req") * * @return array */ @@ -37,15 +50,18 @@ public function request(): array /** @var RequestBean $request */ $request = BeanFactory::getRequestBean('requestBean', $id); + + $request->temp = ['rid' => $id]; + return $request->getData(); } /** * @return array * - * @RequestMapping() + * @RequestMapping("req2") */ - public function requestClass(): array + public function requestTwo(): array { $id = (string)Co::tid(); diff --git a/app/Http/Controller/HomeController.php b/app/Http/Controller/HomeController.php index 88b8f53e..0779bda1 100644 --- a/app/Http/Controller/HomeController.php +++ b/app/Http/Controller/HomeController.php @@ -10,6 +10,7 @@ namespace App\Http\Controller; +use App\Model\Data\GoodsData; use Swoft; use Swoft\Http\Message\ContentType; use Swoft\Http\Message\Response; @@ -69,4 +70,15 @@ public function wsTest(): Response { return view('home/ws-test'); } + + /** + * @RequestMapping("/dataConfig", method={"GET"}) + * + * @return array + * @throws Throwable + */ + public function dataConfig(): array + { + return \bean(GoodsData::class)->getConfig(); + } } diff --git a/app/Http/Controller/SelectDbController.php b/app/Http/Controller/SelectDbController.php index be4eed2c..245cc96b 100644 --- a/app/Http/Controller/SelectDbController.php +++ b/app/Http/Controller/SelectDbController.php @@ -14,8 +14,6 @@ use App\Model\Entity\Desc; use App\Model\Entity\User; use Exception; -use ReflectionException; -use Swoft\Bean\Exception\ContainerException; use Swoft\Db\DB; use Swoft\Db\Exception\DbException; use Swoft\Http\Server\Annotation\Mapping\Controller; @@ -217,9 +215,7 @@ public function select(): array /** * @return bool - * @throws ContainerException * @throws DbException - * @throws ReflectionException */ public function insertId2(): bool { @@ -237,8 +233,6 @@ public function insertId2(): bool } /** - * @throws ReflectionException - * @throws ContainerException * @throws DbException */ public function desc(): array diff --git a/app/Model/Data/GoodsData.php b/app/Model/Data/GoodsData.php new file mode 100644 index 00000000..7ada0517 --- /dev/null +++ b/app/Model/Data/GoodsData.php @@ -0,0 +1,19 @@ +push($request->getFd(), "Opened, welcome!(FD: $fd)"); + + $fullClass = Session::current()->getParserClass(); + $className = basename($fullClass); + + $help = << App\WebSocket\Chat\HomeController::index() +TXT; + + server()->push($fd, $help); } } diff --git a/app/WebSocket/Middleware/GlobalWsMiddleware.php b/app/WebSocket/Middleware/GlobalWsMiddleware.php index c65ed5c9..662d4127 100644 --- a/app/WebSocket/Middleware/GlobalWsMiddleware.php +++ b/app/WebSocket/Middleware/GlobalWsMiddleware.php @@ -42,6 +42,8 @@ public function process(RequestInterface $request, MessageHandlerInterface $hand CLog::info('after handle'); + \server()->log(__METHOD__, [], 'error'); + return $resp; } } diff --git a/app/bean.php b/app/bean.php index ec3be201..293ba200 100644 --- a/app/bean.php +++ b/app/bean.php @@ -42,7 +42,6 @@ 'listener' => [ // 'rpc' => bean('rpcServer'), // 'tcp' => bean('tcpServer'), - // 'ws' => bean('wsServer') ], 'process' => [ // 'monitor' => bean(MonitorProcess::class) @@ -57,7 +56,10 @@ 'setting' => [ 'task_worker_num' => 12, 'task_enable_coroutine' => true, - 'worker_num' => 6 + 'worker_num' => 6, + // static handle + // 'enable_static_handler' => true, + // 'document_root' => dirname(__DIR__) . '/public', ] ], 'httpDispatcher' => [ diff --git a/config/app.php b/config/app.php new file mode 100644 index 00000000..36bb9e1c --- /dev/null +++ b/config/app.php @@ -0,0 +1,9 @@ + ['a', 'b'], + 'warehouseCode' => $envVal ? explode(',', $envVal) : [], +]; diff --git a/database/Migration/Count.php b/database/Migration/Count.php index 663def29..c126230f 100644 --- a/database/Migration/Count.php +++ b/database/Migration/Count.php @@ -10,8 +10,6 @@ namespace Database\Migration; -use ReflectionException; -use Swoft\Bean\Exception\ContainerException; use Swoft\Db\Exception\DbException; use Swoft\Db\Schema\Blueprint; use Swoft\Devtool\Annotation\Mapping\Migration; @@ -27,9 +25,7 @@ class Count extends BaseMigration { /** - * @throws ContainerException * @throws DbException - * @throws ReflectionException */ public function up(): void { @@ -49,8 +45,6 @@ public function up(): void } /** - * @throws ReflectionException - * @throws ContainerException * @throws DbException */ public function down(): void diff --git a/database/Migration/Desc.php b/database/Migration/Desc.php index ee215ff0..b9147b3e 100644 --- a/database/Migration/Desc.php +++ b/database/Migration/Desc.php @@ -10,8 +10,6 @@ namespace Database\Migration; -use ReflectionException; -use Swoft\Bean\Exception\ContainerException; use Swoft\Db\Exception\DbException; use Swoft\Db\Schema\Blueprint; use Swoft\Devtool\Annotation\Mapping\Migration; @@ -27,9 +25,7 @@ class Desc extends BaseMigration { /** - * @throws ContainerException * @throws DbException - * @throws ReflectionException */ public function up(): void { @@ -42,9 +38,7 @@ public function up(): void } /** - * @throws ContainerException * @throws DbException - * @throws ReflectionException */ public function down(): void { From b420435ab87b6232dc2e0beee6672ed14470b06b Mon Sep 17 00:00:00 2001 From: zhenghongyang Date: Sun, 12 Apr 2020 15:44:41 +0800 Subject: [PATCH 174/211] change ab test curreccy --- app/Console/Command/TestCommand.php | 4 ++-- app/Http/Controller/RedisController.php | 8 +------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/app/Console/Command/TestCommand.php b/app/Console/Command/TestCommand.php index c82cabae..71bffbbd 100644 --- a/app/Console/Command/TestCommand.php +++ b/app/Console/Command/TestCommand.php @@ -49,7 +49,7 @@ public function ab(): void foreach ($exeUris as $uri) { $curlResult = null; - $abShell = sprintf('ab -k -n 10000 -c 2000 127.0.0.1:18306%s', $uri); + $abShell = sprintf('ab -k -n 10000 -c 500 127.0.0.1:18306%s', $uri); $curlShell = sprintf('curl 127.0.0.1:18306%s', $uri); exec($curlShell, $curlResult); @@ -114,7 +114,7 @@ private function uris(): array '/rpc/getList', '/rpc/returnBool', '/rpc/bigString', -// '/rpc/sendBigString', + '/rpc/sendBigString', '/rpc/returnNull' ], 'co' => [ diff --git a/app/Http/Controller/RedisController.php b/app/Http/Controller/RedisController.php index 3bd81df6..8c916a6e 100644 --- a/app/Http/Controller/RedisController.php +++ b/app/Http/Controller/RedisController.php @@ -46,13 +46,7 @@ public function poolSet(): array $get = $this->redis->get($key); - $isError = $this->redis->call(function (\Redis $redis) { - $redis->eval('returnxxxx 1'); - - return $redis->getLastError(); - }); - - return [$get, $value, $isError]; + return [$get, $value]; } /** From 5b18fe32ba77e6a0915086c63d5205cf482efbcb Mon Sep 17 00:00:00 2001 From: inhere Date: Tue, 14 Apr 2020 11:40:11 +0800 Subject: [PATCH 175/211] add an bean config for ws server --- app/bean.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/bean.php b/app/bean.php index 293ba200..1ad78ca8 100644 --- a/app/bean.php +++ b/app/bean.php @@ -156,6 +156,7 @@ 'task_enable_coroutine' => true, 'worker_num' => 6, 'log_file' => alias('@runtime/swoole.log'), + // 'open_websocket_close_frame' => true, ], ], // 'wsConnectionManager' => [ From 072b25d3ed9d4d0aad4c9145e4ff27b53a784f4c Mon Sep 17 00:00:00 2001 From: inhere Date: Tue, 14 Apr 2020 11:43:49 +0800 Subject: [PATCH 176/211] fix style error --- app/Common/MyBean.php | 8 ++++++++ app/Model/Data/GoodsData.php | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/app/Common/MyBean.php b/app/Common/MyBean.php index a6cd49b7..0a1c0e10 100644 --- a/app/Common/MyBean.php +++ b/app/Common/MyBean.php @@ -1,4 +1,12 @@ Date: Tue, 14 Apr 2020 14:38:58 +0800 Subject: [PATCH 177/211] fix phpstan error --- .travis.yml | 4 ++-- app/Http/Controller/HomeController.php | 3 ++- app/Model/Logic/RequestBean.php | 3 +++ composer.cn.json | 3 ++- composer.json | 4 ++-- phpstan.neon.dist | 6 ++++-- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 88baa188..e8b32cba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ install: - | echo "no" | pecl install -f redis - | - wget https://github.com/swoole/swoole-src/archive/v4.4.15.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - && rm -rf swoole + wget https://github.com/swoole/swoole-src/archive/v4.4.17.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - && rm -rf swoole echo "extension = swoole.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - | wget -O bin/php-cs-fixer "https://cs.symfony.com/download/php-cs-fixer-v2.phar" @@ -25,6 +25,6 @@ before_script: - composer require --dev phpstan/phpstan script: - - composer cs-fix + - composer check-cs - composer test # - php bin/swoft dinfo:env diff --git a/app/Http/Controller/HomeController.php b/app/Http/Controller/HomeController.php index 0779bda1..8c71b787 100644 --- a/app/Http/Controller/HomeController.php +++ b/app/Http/Controller/HomeController.php @@ -18,6 +18,7 @@ use Swoft\Http\Server\Annotation\Mapping\RequestMapping; use Swoft\View\Renderer; use Throwable; +use function bean; use function context; /** @@ -79,6 +80,6 @@ public function wsTest(): Response */ public function dataConfig(): array { - return \bean(GoodsData::class)->getConfig(); + return bean(GoodsData::class)->getConfig(); } } diff --git a/app/Model/Logic/RequestBean.php b/app/Model/Logic/RequestBean.php index 47ec47f6..4f9217f9 100644 --- a/app/Model/Logic/RequestBean.php +++ b/app/Model/Logic/RequestBean.php @@ -21,6 +21,9 @@ */ class RequestBean { + /** + * @var array + */ public $temp = []; /** diff --git a/composer.cn.json b/composer.cn.json index 97a8c40e..a63797b5 100644 --- a/composer.cn.json +++ b/composer.cn.json @@ -49,7 +49,8 @@ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], "test": "./vendor/bin/phpunit -c phpunit.xml", - "cs-fix": "./vendor/bin/php-cs-fixer fix $1" + "check-cs": "./bin/php-cs-fixer fix --dry-run --diff --diff-format=udiff", + "cs-fix": "./bin/php-cs-fixer fix" }, "repositories": { "packagist": { diff --git a/composer.json b/composer.json index 7a76f90a..a1ef3cb0 100644 --- a/composer.json +++ b/composer.json @@ -63,7 +63,7 @@ "./vendor/bin/phpstan analyze", "./vendor/bin/phpunit -c phpunit.xml" ], - "cs-fix": "./bin/php-cs-fixer fix --dry-run --diff --diff-format=udiff", - "do-cs-fix": "./bin/php-cs-fixer fix" + "check-cs": "./bin/php-cs-fixer fix --dry-run --diff --diff-format=udiff", + "cs-fix": "./bin/php-cs-fixer fix" } } diff --git a/phpstan.neon.dist b/phpstan.neon.dist index c89ddc84..57eb2f2a 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -10,6 +10,7 @@ parameters: - %currentWorkingDirectory%/bin/bootstrap.php autoload_directories: - %currentWorkingDirectory%/vendor/swoft/swoole-ide-helper/output/namespace/ + - %currentWorkingDirectory%/vendor/swoft/ dynamicConstantNames: - APP_DEBUG - SWOFT_DEBUG @@ -20,13 +21,14 @@ parameters: ignoreErrors: # Variable type - '#^Call to an undefined method Swoft\\Contract\\ContextInterface::get\S+\(\)\.$#' - - '#^Call to an undefined method Swoft\\Contract\\SessionInterface::push\(\)#' + - '#^Call to an undefined method Swoft\\Contract\\SessionInterface::\S+\(\)#' # - '#^Call to an undefined method Swoft\\Session\\SessionInterface::getFd\(\)#' - '#^Call to an undefined method Swoft\\Server\\Server::push\(\)\.$#' # - '#^Call to an undefined method Swoft\\Server\\Server::disconnect\(\)\.$#' - '#^Call to an undefined method\sPsr\\Http\\Message\\ServerRequestInterface::getUriPath\(\)#' - '#.+onstant APP_DEBUG not found.#' - - '#^Call to static method \w+\(\) on an unknown class Swoft\\Cache\\Cache.#' + - '#^Function view not found.#' + # - '#^Call to static method \w+\(\) on an unknown class Swoft\\Cache\\Cache.#' # These are ignored for now - path: %currentWorkingDirectory%/app/Http/Controller/DbModelController.php From 34030340a17abdba0259fbf69c05e79127862a0d Mon Sep 17 00:00:00 2001 From: inhere Date: Wed, 15 Apr 2020 09:48:12 +0800 Subject: [PATCH 178/211] format codes --- app/Annotation/Parser/AlphaDashParser.php | 4 +- app/Aspect/BeanAspect.php | 2 +- app/Exception/ApiException.php | 1 + app/Http/Controller/CacheController.php | 3 + app/Http/Controller/SessionController.php | 2 +- app/Http/Controller/TimerController.php | 2 +- app/Listener/RegisterServiceListener.php | 5 +- app/Model/Logic/MonitorLogic.php | 4 +- app/Model/Logic/RequestBean.php | 2 +- app/Process/Worker2Process.php | 6 +- app/Rpc/Lib/UserInterface.php | 2 +- app/Rpc/Service/UserService.php | 8 +- app/Rpc/Service/UserServiceV2.php | 1 + app/Task/Listener/FinishListener.php | 2 +- app/Tcp/Middleware/DemoMiddleware.php | 2 +- app/Tcp/Middleware/GlobalTcpMiddleware.php | 2 +- app/Validator/CustomerValidator.php | 2 +- app/WebSocket/EchoModule.php | 1 - app/WebSocket/Test/TestController.php | 1 + app/bean.php | 92 +++++++++++----------- 20 files changed, 72 insertions(+), 72 deletions(-) diff --git a/app/Annotation/Parser/AlphaDashParser.php b/app/Annotation/Parser/AlphaDashParser.php index a4d91280..fbd4d1a7 100644 --- a/app/Annotation/Parser/AlphaDashParser.php +++ b/app/Annotation/Parser/AlphaDashParser.php @@ -10,10 +10,10 @@ namespace App\Annotation\Parser; +use App\Annotation\Mapping\AlphaDash; use ReflectionException; use Swoft\Annotation\Annotation\Mapping\AnnotationParser; use Swoft\Annotation\Annotation\Parser\Parser; -use App\Annotation\Mapping\AlphaDash; use Swoft\Validator\Exception\ValidatorException; use Swoft\Validator\ValidatorRegister; @@ -25,7 +25,7 @@ class AlphaDashParser extends Parser { /** - * @param int $type + * @param int $type * @param object $annotationObject * * @return array diff --git a/app/Aspect/BeanAspect.php b/app/Aspect/BeanAspect.php index bffadecf..69ec0120 100644 --- a/app/Aspect/BeanAspect.php +++ b/app/Aspect/BeanAspect.php @@ -10,10 +10,10 @@ namespace App\Aspect; +use App\Common\MyBean; use Swoft\Aop\Annotation\Mapping\Aspect; use Swoft\Aop\Annotation\Mapping\Before; use Swoft\Aop\Annotation\Mapping\PointBean; -use App\Common\MyBean; use function vdump; /** diff --git a/app/Exception/ApiException.php b/app/Exception/ApiException.php index e995d7b9..db96cf5f 100644 --- a/app/Exception/ApiException.php +++ b/app/Exception/ApiException.php @@ -7,6 +7,7 @@ * @contact group@swoft.org * @license https://github.com/swoft-cloud/swoft/blob/master/LICENSE */ + namespace App\Exception; /** diff --git a/app/Http/Controller/CacheController.php b/app/Http/Controller/CacheController.php index 510aa33d..31e571ff 100644 --- a/app/Http/Controller/CacheController.php +++ b/app/Http/Controller/CacheController.php @@ -30,6 +30,7 @@ class CacheController * * @return array * @throws InvalidArgumentException + * @throws \Psr\SimpleCache\InvalidArgumentException */ public function set(): array { @@ -44,6 +45,7 @@ public function set(): array * * @return array * @throws InvalidArgumentException + * @throws \Psr\SimpleCache\InvalidArgumentException */ public function get(): array { @@ -60,6 +62,7 @@ public function get(): array * * @return array * @throws InvalidArgumentException + * @throws \Psr\SimpleCache\InvalidArgumentException */ public function del(): array { diff --git a/app/Http/Controller/SessionController.php b/app/Http/Controller/SessionController.php index 4feab237..bd38c278 100644 --- a/app/Http/Controller/SessionController.php +++ b/app/Http/Controller/SessionController.php @@ -89,7 +89,7 @@ public function get(): array public function del(): array { $sess = HttpSession::current(); - $ok = $sess->delete('testKey'); + $ok = $sess->delete('testKey'); return ['delete' => $ok]; } diff --git a/app/Http/Controller/TimerController.php b/app/Http/Controller/TimerController.php index 881d26a6..260099c1 100644 --- a/app/Http/Controller/TimerController.php +++ b/app/Http/Controller/TimerController.php @@ -12,13 +12,13 @@ use App\Model\Entity\User; use Exception; -use function random_int; use Swoft\Http\Server\Annotation\Mapping\Controller; use Swoft\Http\Server\Annotation\Mapping\RequestMapping; use Swoft\Log\Helper\Log; use Swoft\Redis\Redis; use Swoft\Stdlib\Helper\JsonHelper; use Swoft\Timer; +use function random_int; /** * Class TimerController diff --git a/app/Listener/RegisterServiceListener.php b/app/Listener/RegisterServiceListener.php index fdf7a71a..61d0d14a 100644 --- a/app/Listener/RegisterServiceListener.php +++ b/app/Listener/RegisterServiceListener.php @@ -16,7 +16,6 @@ use Swoft\Event\EventHandlerInterface; use Swoft\Event\EventInterface; use Swoft\Http\Server\HttpServer; -use Swoft\Log\Helper\CLog; use Swoft\Server\SwooleEvent; /** @@ -63,7 +62,7 @@ public function handle(EventInterface $event): void // Register -// $this->agent->registerService($service); -// CLog::info('Swoft http register service success by consul!'); + // $this->agent->registerService($service); + // CLog::info('Swoft http register service success by consul!'); } } diff --git a/app/Model/Logic/MonitorLogic.php b/app/Model/Logic/MonitorLogic.php index a265473f..56be76d8 100644 --- a/app/Model/Logic/MonitorLogic.php +++ b/app/Model/Logic/MonitorLogic.php @@ -42,11 +42,11 @@ public function monitor(Process $process): void // Database $user = User::find(1)->toArray(); - CLog::info('user='.json_encode($user)); + CLog::info('user=' . json_encode($user)); // Redis Redis::set('test', 'ok'); - CLog::info('test='.Redis::get('test')); + CLog::info('test=' . Redis::get('test')); Coroutine::sleep(3); } diff --git a/app/Model/Logic/RequestBean.php b/app/Model/Logic/RequestBean.php index 4f9217f9..3f573570 100644 --- a/app/Model/Logic/RequestBean.php +++ b/app/Model/Logic/RequestBean.php @@ -39,7 +39,7 @@ public function getData(): array * * @return string */ - public function getName(string $type):string + public function getName(string $type): string { return 'name'; } diff --git a/app/Process/Worker2Process.php b/app/Process/Worker2Process.php index 78aa45e5..68708222 100644 --- a/app/Process/Worker2Process.php +++ b/app/Process/Worker2Process.php @@ -40,13 +40,13 @@ public function run(Pool $pool, int $workerId): void // Database $user = User::find(1)->toArray(); - CLog::info('user='.json_encode($user)); + CLog::info('user=' . json_encode($user)); // Redis Redis::set('test', 'ok'); - CLog::info('test='.Redis::get('test')); + CLog::info('test=' . Redis::get('test')); - CLog::info('worker-' . $workerId.' context='.context()->getWorkerId()); + CLog::info('worker-' . $workerId . ' context=' . context()->getWorkerId()); Coroutine::sleep(3); } diff --git a/app/Rpc/Lib/UserInterface.php b/app/Rpc/Lib/UserInterface.php index f4a27948..7b4d4db0 100644 --- a/app/Rpc/Lib/UserInterface.php +++ b/app/Rpc/Lib/UserInterface.php @@ -41,7 +41,7 @@ public function getBigContent(): string; /** * @return void */ - public function returnNull():void ; + public function returnNull(): void; /** * Exception diff --git a/app/Rpc/Service/UserService.php b/app/Rpc/Service/UserService.php index 10123836..2c98f2f1 100644 --- a/app/Rpc/Service/UserService.php +++ b/app/Rpc/Service/UserService.php @@ -12,6 +12,7 @@ use App\Rpc\Lib\UserInterface; use Exception; +use RuntimeException; use Swoft\Co; use Swoft\Rpc\Server\Annotation\Mapping\Service; @@ -51,7 +52,6 @@ public function delete(int $id): bool */ public function returnNull(): void { - return; } /** @@ -59,17 +59,17 @@ public function returnNull(): void */ public function getBigContent(): string { - $content = Co::readFile(__DIR__ . '/big.data'); - return $content; + return Co::readFile(__DIR__ . '/big.data'); } /** * Exception + * * @throws Exception */ public function exception(): void { - throw new Exception('exception version'); + throw new RuntimeException('exception version'); } /** diff --git a/app/Rpc/Service/UserServiceV2.php b/app/Rpc/Service/UserServiceV2.php index 561db6c1..3b068d61 100644 --- a/app/Rpc/Service/UserServiceV2.php +++ b/app/Rpc/Service/UserServiceV2.php @@ -68,6 +68,7 @@ public function getBigContent(): string /** * Exception + * * @throws Exception */ public function exception(): void diff --git a/app/Task/Listener/FinishListener.php b/app/Task/Listener/FinishListener.php index 40fbb356..2e9a8ff6 100644 --- a/app/Task/Listener/FinishListener.php +++ b/app/Task/Listener/FinishListener.php @@ -10,12 +10,12 @@ namespace App\Task\Listener; -use function context; use Swoft\Event\Annotation\Mapping\Listener; use Swoft\Event\EventHandlerInterface; use Swoft\Event\EventInterface; use Swoft\Log\Helper\CLog; use Swoft\Task\TaskEvent; +use function context; /** * Class FinishListener diff --git a/app/Tcp/Middleware/DemoMiddleware.php b/app/Tcp/Middleware/DemoMiddleware.php index df76cba3..8e1ff42c 100644 --- a/app/Tcp/Middleware/DemoMiddleware.php +++ b/app/Tcp/Middleware/DemoMiddleware.php @@ -12,8 +12,8 @@ use Swoft\Bean\Annotation\Mapping\Bean; use Swoft\Log\Helper\CLog; -use Swoft\Tcp\Server\Contract\RequestHandlerInterface; use Swoft\Tcp\Server\Contract\MiddlewareInterface; +use Swoft\Tcp\Server\Contract\RequestHandlerInterface; use Swoft\Tcp\Server\Contract\RequestInterface; use Swoft\Tcp\Server\Contract\ResponseInterface; diff --git a/app/Tcp/Middleware/GlobalTcpMiddleware.php b/app/Tcp/Middleware/GlobalTcpMiddleware.php index 06df847b..8823e250 100644 --- a/app/Tcp/Middleware/GlobalTcpMiddleware.php +++ b/app/Tcp/Middleware/GlobalTcpMiddleware.php @@ -12,8 +12,8 @@ use Swoft\Bean\Annotation\Mapping\Bean; use Swoft\Log\Helper\CLog; -use Swoft\Tcp\Server\Contract\RequestHandlerInterface; use Swoft\Tcp\Server\Contract\MiddlewareInterface; +use Swoft\Tcp\Server\Contract\RequestHandlerInterface; use Swoft\Tcp\Server\Contract\RequestInterface; use Swoft\Tcp\Server\Contract\ResponseInterface; diff --git a/app/Validator/CustomerValidator.php b/app/Validator/CustomerValidator.php index 576e2cf4..fd30a923 100644 --- a/app/Validator/CustomerValidator.php +++ b/app/Validator/CustomerValidator.php @@ -33,7 +33,7 @@ class CustomerValidator implements ValidatorInterface public function validate(array $data, array $params): array { $start = $data['start'] ?? null; - $end = $data['end'] ?? null; + $end = $data['end'] ?? null; if ($start === null && $end === null) { throw new ValidatorException('Start time and end time cannot be empty'); } diff --git a/app/WebSocket/EchoModule.php b/app/WebSocket/EchoModule.php index 1c97cf0b..834102be 100644 --- a/app/WebSocket/EchoModule.php +++ b/app/WebSocket/EchoModule.php @@ -17,7 +17,6 @@ use Swoft\WebSocket\Server\Annotation\Mapping\WsModule; use Swoole\WebSocket\Frame; use Swoole\WebSocket\Server; -use function server; /** * Class EchoModule diff --git a/app/WebSocket/Test/TestController.php b/app/WebSocket/Test/TestController.php index fd7d7b6f..734c279f 100644 --- a/app/WebSocket/Test/TestController.php +++ b/app/WebSocket/Test/TestController.php @@ -42,6 +42,7 @@ public function index(): void /** * Message command is: 'test.index' + * * @param Message $msg * * @return void diff --git a/app/bean.php b/app/bean.php index 1ad78ca8..76563886 100644 --- a/app/bean.php +++ b/app/bean.php @@ -7,22 +7,19 @@ * @contact group@swoft.org * @license https://github.com/swoft-cloud/swoft/blob/master/LICENSE */ -use App\Common\DbSelector; -use App\Process\MonitorProcess; -use Swoft\Crontab\Process\CrontabProcess; + +use Swoft\Db\Database; use Swoft\Db\Pool; use Swoft\Http\Server\HttpServer; -use Swoft\Task\Swoole\SyncTaskListener; -use Swoft\Task\Swoole\TaskListener; -use Swoft\Task\Swoole\FinishListener; +use Swoft\Http\Server\Swoole\RequestListener; +use Swoft\Redis\RedisDb; use Swoft\Rpc\Client\Client as ServiceClient; use Swoft\Rpc\Client\Pool as ServicePool; use Swoft\Rpc\Server\ServiceServer; -use Swoft\Http\Server\Swoole\RequestListener; -use Swoft\WebSocket\Server\WebSocketServer; use Swoft\Server\SwooleEvent; -use Swoft\Db\Database; -use Swoft\Redis\RedisDb; +use Swoft\Task\Swoole\FinishListener; +use Swoft\Task\Swoole\TaskListener; +use Swoft\WebSocket\Server\WebSocketServer; return [ 'noticeHandler' => [ @@ -31,12 +28,12 @@ 'applicationHandler' => [ 'logFile' => '@runtime/logs/error-%d{Y-m-d}.log', ], - 'logger' => [ + 'logger' => [ 'flushRequest' => false, 'enable' => false, 'json' => false, ], - 'httpServer' => [ + 'httpServer' => [ 'class' => HttpServer::class, 'port' => 18306, 'listener' => [ @@ -44,16 +41,16 @@ // 'tcp' => bean('tcpServer'), ], 'process' => [ -// 'monitor' => bean(MonitorProcess::class) -// 'crontab' => bean(CrontabProcess::class) + // 'monitor' => bean(MonitorProcess::class) + // 'crontab' => bean(CrontabProcess::class) ], 'on' => [ -// SwooleEvent::TASK => bean(SyncTaskListener::class), // Enable sync task + // SwooleEvent::TASK => bean(SyncTaskListener::class), // Enable sync task SwooleEvent::TASK => bean(TaskListener::class), // Enable task must task and finish event SwooleEvent::FINISH => bean(FinishListener::class) ], /* @see HttpServer::$setting */ - 'setting' => [ + 'setting' => [ 'task_worker_num' => 12, 'task_enable_coroutine' => true, 'worker_num' => 6, @@ -62,7 +59,7 @@ // 'document_root' => dirname(__DIR__) . '/public', ] ], - 'httpDispatcher' => [ + 'httpDispatcher' => [ // Add global http middleware 'middlewares' => [ \App\Http\Middleware\FavIconMiddleware::class, @@ -75,38 +72,38 @@ \Swoft\Http\Server\Middleware\ValidatorMiddleware::class ] ], - 'db' => [ + 'db' => [ 'class' => Database::class, 'dsn' => 'mysql:dbname=test;host=127.0.0.1', 'username' => 'root', 'password' => 'swoft123456', - 'charset' => 'utf8mb4', + 'charset' => 'utf8mb4', ], - 'db2' => [ - 'class' => Database::class, - 'dsn' => 'mysql:dbname=test2;host=127.0.0.1', - 'username' => 'root', - 'password' => 'swoft123456', -// 'dbSelector' => bean(DbSelector::class) + 'db2' => [ + 'class' => Database::class, + 'dsn' => 'mysql:dbname=test2;host=127.0.0.1', + 'username' => 'root', + 'password' => 'swoft123456', + // 'dbSelector' => bean(DbSelector::class) ], - 'db2.pool' => [ + 'db2.pool' => [ 'class' => Pool::class, 'database' => bean('db2'), ], - 'db3' => [ + 'db3' => [ 'class' => Database::class, 'dsn' => 'mysql:dbname=test2;host=127.0.0.1', 'username' => 'root', 'password' => 'swoft123456' ], - 'db3.pool' => [ + 'db3.pool' => [ 'class' => Pool::class, 'database' => bean('db3') ], - 'migrationManager' => [ + 'migrationManager' => [ 'migrationPath' => '@database/Migration', ], - 'redis' => [ + 'redis' => [ 'class' => RedisDb::class, 'host' => '127.0.0.1', 'port' => 6379, @@ -115,7 +112,7 @@ 'prefix' => 'swoft:' ] ], - 'user' => [ + 'user' => [ 'class' => ServiceClient::class, 'host' => '127.0.0.1', 'port' => 18307, @@ -127,35 +124,35 @@ ], 'packet' => bean('rpcClientPacket') ], - 'user.pool' => [ + 'user.pool' => [ 'class' => ServicePool::class, 'client' => bean('user'), ], - 'rpcServer' => [ + 'rpcServer' => [ 'class' => ServiceServer::class, ], - 'wsServer' => [ - 'class' => WebSocketServer::class, - 'port' => 18308, + 'wsServer' => [ + 'class' => WebSocketServer::class, + 'port' => 18308, 'listener' => [ 'rpc' => bean('rpcServer'), // 'tcp' => bean('tcpServer'), ], - 'on' => [ + 'on' => [ // Enable http handle SwooleEvent::REQUEST => bean(RequestListener::class), // Enable task must add task and finish event - SwooleEvent::TASK => bean(TaskListener::class), - SwooleEvent::FINISH => bean(FinishListener::class) + SwooleEvent::TASK => bean(TaskListener::class), + SwooleEvent::FINISH => bean(FinishListener::class) ], - 'debug' => 1, + 'debug' => 1, // 'debug' => env('SWOFT_DEBUG', 0), /* @see WebSocketServer::$setting */ - 'setting' => [ + 'setting' => [ 'task_worker_num' => 6, 'task_enable_coroutine' => true, 'worker_num' => 6, - 'log_file' => alias('@runtime/swoole.log'), + 'log_file' => alias('@runtime/swoole.log'), // 'open_websocket_close_frame' => true, ], ], @@ -166,29 +163,28 @@ // 'class' => \Swoft\Session\SwooleStorage::class, // ], /** @see \Swoft\WebSocket\Server\WsMessageDispatcher */ - 'wsMsgDispatcher' => [ + 'wsMsgDispatcher' => [ 'middlewares' => [ \App\WebSocket\Middleware\GlobalWsMiddleware::class ], ], /** @see \Swoft\Tcp\Server\TcpServer */ - 'tcpServer' => [ + 'tcpServer' => [ 'port' => 18309, 'debug' => 1, ], /** @see \Swoft\Tcp\Protocol */ - 'tcpServerProtocol' => [ + 'tcpServerProtocol' => [ // 'type' => \Swoft\Tcp\Packer\JsonPacker::TYPE, 'type' => \Swoft\Tcp\Packer\SimpleTokenPacker::TYPE, // 'openLengthCheck' => true, ], /** @see \Swoft\Tcp\Server\TcpDispatcher */ - 'tcpDispatcher' => [ + 'tcpDispatcher' => [ 'middlewares' => [ \App\Tcp\Middleware\GlobalTcpMiddleware::class ], ], - 'cliRouter' => [ - // 'disabledGroups' => ['demo', 'test'], + 'cliRouter' => [// 'disabledGroups' => ['demo', 'test'], ], ]; From eb18fe14a914bc3e6ac8eb174de9a315cb0ad36d Mon Sep 17 00:00:00 2001 From: inhere Date: Wed, 15 Apr 2020 10:55:02 +0800 Subject: [PATCH 179/211] add some phpcs setting, fix cs error --- .php_cs | 7 +++++-- app/Exception/ApiException.php | 6 ++++-- app/Helper/Functions.php | 2 +- app/bean.php | 2 +- bin/bootstrap.php | 2 +- test/bootstrap.php | 3 ++- test/run.php | 2 +- 7 files changed, 15 insertions(+), 9 deletions(-) diff --git a/.php_cs b/.php_cs index 9c552f9e..e644064e 100644 --- a/.php_cs +++ b/.php_cs @@ -14,17 +14,20 @@ return PhpCsFixer\Config::create() ->setRules([ '@PSR2' => true, 'header_comment' => [ - 'commentType' => 'PHPDoc', + 'comment_type' => 'PHPDoc', 'header' => $header, - 'separate' => 'none' + 'separate' => 'bottom' ], 'array_syntax' => [ 'syntax' => 'short' ], + 'encoding' => true, // MUST use only UTF-8 without BOM 'single_quote' => true, 'class_attributes_separation' => true, 'no_unused_imports' => true, + 'global_namespace_import' => true, 'standardize_not_equals' => true, + 'declare_strict_types' => true, ]) ->setFinder( PhpCsFixer\Finder::create() diff --git a/app/Exception/ApiException.php b/app/Exception/ApiException.php index db96cf5f..558b12a4 100644 --- a/app/Exception/ApiException.php +++ b/app/Exception/ApiException.php @@ -1,4 +1,4 @@ - Date: Wed, 15 Apr 2020 12:14:37 +0800 Subject: [PATCH 180/211] up phpcs config --- .php_cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.php_cs b/.php_cs index e644064e..e6077b74 100644 --- a/.php_cs +++ b/.php_cs @@ -15,8 +15,8 @@ return PhpCsFixer\Config::create() '@PSR2' => true, 'header_comment' => [ 'comment_type' => 'PHPDoc', - 'header' => $header, - 'separate' => 'bottom' + 'header' => $header, + 'separate' => 'bottom' ], 'array_syntax' => [ 'syntax' => 'short' From 210243ad798259ae9ce8382c14e79beba0690068 Mon Sep 17 00:00:00 2001 From: inhere Date: Wed, 15 Apr 2020 12:16:30 +0800 Subject: [PATCH 181/211] print php-cs-fixer version --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index e8b32cba..99b79dc5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,7 @@ install: before_script: - phpenv config-rm xdebug.ini + - bin/php-cs-fixer -V - composer config -g process-timeout 900 && composer update - composer require --dev phpstan/phpstan From f79f37bca6bd62234ce7c5eacb515fe9603675cf Mon Sep 17 00:00:00 2001 From: inhere Date: Wed, 15 Apr 2020 13:10:51 +0800 Subject: [PATCH 182/211] add swoft/cache to composer.json --- app/Http/Controller/CacheController.php | 3 --- composer.json | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/Http/Controller/CacheController.php b/app/Http/Controller/CacheController.php index 31e571ff..510aa33d 100644 --- a/app/Http/Controller/CacheController.php +++ b/app/Http/Controller/CacheController.php @@ -30,7 +30,6 @@ class CacheController * * @return array * @throws InvalidArgumentException - * @throws \Psr\SimpleCache\InvalidArgumentException */ public function set(): array { @@ -45,7 +44,6 @@ public function set(): array * * @return array * @throws InvalidArgumentException - * @throws \Psr\SimpleCache\InvalidArgumentException */ public function get(): array { @@ -62,7 +60,6 @@ public function get(): array * * @return array * @throws InvalidArgumentException - * @throws \Psr\SimpleCache\InvalidArgumentException */ public function del(): array { diff --git a/composer.json b/composer.json index a1ef3cb0..541a127d 100644 --- a/composer.json +++ b/composer.json @@ -16,6 +16,7 @@ "ext-simplexml": "*", "ext-libxml": "*", "ext-mbstring": "*", + "swoft/cache": "~2.0.0", "swoft/db": "~2.0.0", "swoft/i18n": "~2.0.0", "swoft/view": "~2.0.0", From 4f8d7a63206cff26cbc8cf07fd8730b4acb01f86 Mon Sep 17 00:00:00 2001 From: inhere Date: Wed, 15 Apr 2020 14:11:47 +0800 Subject: [PATCH 183/211] fix phpstan error --- phpstan.neon.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 57eb2f2a..db758b82 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -27,7 +27,7 @@ parameters: # - '#^Call to an undefined method Swoft\\Server\\Server::disconnect\(\)\.$#' - '#^Call to an undefined method\sPsr\\Http\\Message\\ServerRequestInterface::getUriPath\(\)#' - '#.+onstant APP_DEBUG not found.#' - - '#^Function view not found.#' + # - '#^Function view not found.#' # - '#^Call to static method \w+\(\) on an unknown class Swoft\\Cache\\Cache.#' # These are ignored for now - From b8f1e7a4036e98389533a1b2984df32c9e862d09 Mon Sep 17 00:00:00 2001 From: inhere Date: Wed, 15 Apr 2020 14:21:53 +0800 Subject: [PATCH 184/211] fix phpunit error --- test/bootstrap.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/bootstrap.php b/test/bootstrap.php index 90b41c5e..95509527 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -17,8 +17,6 @@ $loader = require dirname(__DIR__) . '/vendor/autoload.php'; $loader->addPsr4('SwoftTest\\Testing\\', $vendor . '/swoft/framework/test/testing/'); -$application = new TestApplication([ - 'basePath' => $baseDir, -]); +$application = new TestApplication($baseDir); $application->setBeanFile($baseDir . '/app/bean.php'); $application->run(); From 9bbb5ff970aff6cc904d463c703d6887136625b5 Mon Sep 17 00:00:00 2001 From: ChongmingDu Date: Sat, 18 Apr 2020 17:48:05 +0800 Subject: [PATCH 185/211] update: dockerfile --- Dockerfile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 11cc8c6c..3d278343 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,11 +16,12 @@ LABEL maintainer="inhere " version="2.0" # --build-arg timezone=Asia/Shanghai ARG timezone # app env: prod pre test dev -ARG app_env=prod +ARG app_env=test # default use www-data user ARG work_user=www-data -ENV APP_ENV=${app_env:-"prod"} \ +# default APP_ENV = test +ENV APP_ENV=${app_env:-"test"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=5.1.0 \ SWOOLE_VERSION=4.4.17 \ @@ -29,7 +30,7 @@ ENV APP_ENV=${app_env:-"prod"} \ # Libs -y --no-install-recommends RUN apt-get update \ && apt-get install -y \ - curl wget git zip unzip less vim procps lsof tcpdump htop openssl \ + curl wget git zip unzip less vim procps lsof tcpdump htop openssl net-tools iputils-ping \ libz-dev \ libssl-dev \ libnghttp2-dev \ @@ -39,7 +40,9 @@ RUN apt-get update \ libfreetype6-dev \ # Install PHP extensions && docker-php-ext-install \ - bcmath gd pdo_mysql mbstring sockets zip sysvmsg sysvsem sysvshm + bcmath gd pdo_mysql mbstring sockets zip sysvmsg sysvsem sysvshm \ +# Clean apt cache + && rm -rf /var/lib/apt/lists/* # Install composer Run curl -sS https://getcomposer.org/installer | php \ From e05db74aaa3f3c64bf5f7b63e47ca497f3a163d6 Mon Sep 17 00:00:00 2001 From: ChongmingDu Date: Sat, 18 Apr 2020 18:23:53 +0800 Subject: [PATCH 186/211] format spaces --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3d278343..a4c8e6cb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,7 +30,7 @@ ENV APP_ENV=${app_env:-"test"} \ # Libs -y --no-install-recommends RUN apt-get update \ && apt-get install -y \ - curl wget git zip unzip less vim procps lsof tcpdump htop openssl net-tools iputils-ping \ + curl wget git zip unzip less vim procps lsof tcpdump htop openssl net-tools iputils-ping \ libz-dev \ libssl-dev \ libnghttp2-dev \ From 31d04f1fadd139faf1dc3ee88f0986f76bc8aa73 Mon Sep 17 00:00:00 2001 From: Inhere Date: Sun, 19 Apr 2020 22:23:06 +0800 Subject: [PATCH 187/211] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 47260172..3f6b4625 100644 --- a/README.md +++ b/README.md @@ -61,8 +61,9 @@ Through three years of accumulation and direction exploration, Swoft has made Sw - Forum https://github.com/swoft-cloud/forum/issues - Gitter.im https://gitter.im/swoft-cloud/community - Reddit https://www.reddit.com/r/swoft/ -- QQ Group1: 548173319 -- QQ Group2: 778656850 +- QQ Group3: 541038173 +- QQ Group2: 778656850(full) +- QQ Group1: 548173319(full) ## Requirement From 846ecdce83ab33d5dc5722581e88e0822ecb61d4 Mon Sep 17 00:00:00 2001 From: Inhere Date: Sun, 19 Apr 2020 22:24:50 +0800 Subject: [PATCH 188/211] Update README.zh-CN.md --- README.zh-CN.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 6d3eab76..4629158a 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -27,7 +27,7 @@ Swoft 通过长达三年的积累和方向的探索,把 Swoft 打造成 PHP ## 功能特色 - - 内置高性能网络服务器(Http/Websocket/RPC/TCP) +- 内置高性能网络服务器(Http/Websocket/RPC/TCP) - 灵活的组件功能 - 强大的注解功能 - 多样化的命令终端(控制台) @@ -62,8 +62,9 @@ Swoft 通过长达三年的积累和方向的探索,把 Swoft 打造成 PHP ## 学习交流 -- QQ Group1: 548173319 -- QQ Group2: 778656850 +- QQ Group3: 541038173 +- QQ Group2: 778656850(已满) +- QQ Group1: 548173319(已满) - [swoft-cloud/community](https://gitter.im/swoft-cloud/community) ## 免费技术支持 @@ -142,6 +143,7 @@ Component Name | Packagist Version -----------------|--------------------- swoft-apollo | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/apollo.svg)](https://packagist.org/packages/swoft/apollo) swoft-breaker | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/breaker.svg)](https://packagist.org/packages/swoft/breaker) +swoft-cache | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/cache.svg)](https://packagist.org/packages/swoft/cache) swoft-crontab | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/crontab.svg)](https://packagist.org/packages/swoft/crontab) swoft-consul | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/consul.svg)](https://packagist.org/packages/swoft/consul) swoft-limiter | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/limiter.svg)](https://packagist.org/packages/swoft/limiter) From 869732f4234a57ac135b7cee0766d579c6b1ccee Mon Sep 17 00:00:00 2001 From: Inhere Date: Sun, 26 Apr 2020 14:04:24 +0800 Subject: [PATCH 189/211] update swoole to 4.4.18 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a4c8e6cb..0e12ee3e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,7 +24,7 @@ ARG work_user=www-data ENV APP_ENV=${app_env:-"test"} \ TIMEZONE=${timezone:-"Asia/Shanghai"} \ PHPREDIS_VERSION=5.1.0 \ - SWOOLE_VERSION=4.4.17 \ + SWOOLE_VERSION=4.4.18 \ COMPOSER_ALLOW_SUPERUSER=1 # Libs -y --no-install-recommends From fa8000cca549a94d6a5358884f1aa56269928cb0 Mon Sep 17 00:00:00 2001 From: Inhere Date: Thu, 30 Apr 2020 21:09:44 +0800 Subject: [PATCH 190/211] Update label.yml --- .github/workflows/label.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index b7052a08..bc48039d 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -20,7 +20,7 @@ jobs: # Github token github-token: "${{ secrets.GITHUB_TOKEN }}" # keywords to look for in the issue - keywords: '["db", "database", "mysql", "pdo"]' + keywords: '["db", "database", "mysql", "pdo", "model"]' # assignees to be assigned when keyword is found assignees: '["sakuraovq"]' # labels to be set when keyword is found @@ -43,7 +43,7 @@ jobs: uses: Naturalclar/issue-action@v1.0.0 with: github-token: "${{ secrets.GITHUB_TOKEN }}" - keywords: '["env", "config"]' + keywords: '["配置", "config"]' assignees: '["stelin", "inhere"]' labels: '["swoft: config"]' - name: Event Issue Labeler From cce3ee3749c895a1090f111880886ed56158dfcb Mon Sep 17 00:00:00 2001 From: inhere Date: Fri, 8 May 2020 11:21:00 +0800 Subject: [PATCH 191/211] add more unit tests examples --- app/Common/MyBean.php | 5 ++ app/Http/Controller/ProcController.php | 40 +++++++++++++ app/Model/Logic/MonitorLogic.php | 15 ++--- app/bean.php | 9 ++- phpunit.xml | 23 ++++---- test/README.md | 53 +++++++++++++++++ test/{apitest => api}/.keep | 0 test/api/ExampleApiTest.php | 39 +++++++++++++ test/api/README.md | 9 +++ test/bootstrap.php | 19 +++++-- test/httptest/.keep | 1 + test/httptest/README.md | 17 ++++++ test/httptest/http-client.env.json | 28 +++++++++ test/httptest/sample.http | 9 +++ test/testdata/.keep | 1 + test/testdata/http-client-tests.png | Bin 0 -> 110030 bytes test/testing/TestApplication.php | 75 +++++++++++++++++++++++++ test/unit/Common/MyBeanTest.php | 30 ++++++++++ test/unit/ExampleTest.php | 5 ++ 19 files changed, 353 insertions(+), 25 deletions(-) create mode 100644 app/Http/Controller/ProcController.php create mode 100644 test/README.md rename test/{apitest => api}/.keep (100%) create mode 100644 test/api/ExampleApiTest.php create mode 100644 test/api/README.md create mode 100644 test/httptest/.keep create mode 100644 test/httptest/README.md create mode 100644 test/httptest/http-client.env.json create mode 100644 test/httptest/sample.http create mode 100644 test/testdata/.keep create mode 100644 test/testdata/http-client-tests.png create mode 100644 test/testing/TestApplication.php create mode 100644 test/unit/Common/MyBeanTest.php diff --git a/app/Common/MyBean.php b/app/Common/MyBean.php index 0a1c0e10..bfb7f0bb 100644 --- a/app/Common/MyBean.php +++ b/app/Common/MyBean.php @@ -27,4 +27,9 @@ public function myMethod(): array return ['hi']; } + + public function myMethod2(): string + { + return __METHOD__; + } } diff --git a/app/Http/Controller/ProcController.php b/app/Http/Controller/ProcController.php new file mode 100644 index 00000000..cdfca67f --- /dev/null +++ b/app/Http/Controller/ProcController.php @@ -0,0 +1,40 @@ +getSwooleProcess()->exportSocket()); + + return 'hello'; + } +} diff --git a/app/Model/Logic/MonitorLogic.php b/app/Model/Logic/MonitorLogic.php index 56be76d8..4ac5bb85 100644 --- a/app/Model/Logic/MonitorLogic.php +++ b/app/Model/Logic/MonitorLogic.php @@ -34,19 +34,20 @@ class MonitorLogic */ public function monitor(Process $process): void { - $process->name('swoft-monitor'); + // \vdump($process->exportSocket()); + // $process->name('swoft-monitor'); while (true) { $connections = context()->getServer()->getSwooleServer()->connections; CLog::info('monitor = ' . json_encode($connections)); // Database - $user = User::find(1)->toArray(); - CLog::info('user=' . json_encode($user)); - - // Redis - Redis::set('test', 'ok'); - CLog::info('test=' . Redis::get('test')); + // $user = User::find(1)->toArray(); + // CLog::info('user=' . json_encode($user)); + // + // // Redis + // Redis::set('test', 'ok'); + // CLog::info('test=' . Redis::get('test')); Coroutine::sleep(3); } diff --git a/app/bean.php b/app/bean.php index 5c498433..a0e8d54b 100644 --- a/app/bean.php +++ b/app/bean.php @@ -41,11 +41,11 @@ // 'tcp' => bean('tcpServer'), ], 'process' => [ - // 'monitor' => bean(MonitorProcess::class) - // 'crontab' => bean(CrontabProcess::class) + // 'monitor' => bean(\App\Process\MonitorProcess::class) + // 'crontab' => bean(CrontabProcess::class) ], 'on' => [ - // SwooleEvent::TASK => bean(SyncTaskListener::class), // Enable sync task + // SwooleEvent::TASK => bean(SyncTaskListener::class), // Enable sync task SwooleEvent::TASK => bean(TaskListener::class), // Enable task must task and finish event SwooleEvent::FINISH => bean(FinishListener::class) ], @@ -130,6 +130,9 @@ ], 'rpcServer' => [ 'class' => ServiceServer::class, + 'listener' => [ + 'http' => bean('httpServer'), + ] ], 'wsServer' => [ 'class' => WebSocketServer::class, diff --git a/phpunit.xml b/phpunit.xml index 2e5c0390..dd0bd0d9 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -8,14 +8,17 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false"> - - - ./test - - - - - ./app - - + + + ./test/unit + + + ./test/api + + + + + ./app + + diff --git a/test/README.md b/test/README.md new file mode 100644 index 00000000..fbc05a6b --- /dev/null +++ b/test/README.md @@ -0,0 +1,53 @@ +# Tests + +## Http tests + +**If you want to run http client tests, you must start the http server.** + +### Run http tests + +Can only be run inside phpstorm. + +![http-client-tests](testdata/http-client-tests.png) + +## API tests + +**If you want to run api tests, you must start the http server.** + +## Start server + +```bash +php bin/swoft http:start +# OR +php bin/swoft http:start -d +``` + +### Run api tests + +- use vendor phpunit + +```bash +vendor/bin/phpunit --testsuite apiTests +``` + +- use global installed phpunit + +```bash +phpunit --testsuite apiTests +``` + +## Unit tests + +### Run unit tests + +- use vendor phpunit + +```bash +vendor/bin/phpunit --testsuite unitTests +``` + +- use global installed phpunit + +```bash +phpunit --testsuite unitTests +``` diff --git a/test/apitest/.keep b/test/api/.keep similarity index 100% rename from test/apitest/.keep rename to test/api/.keep diff --git a/test/api/ExampleApiTest.php b/test/api/ExampleApiTest.php new file mode 100644 index 00000000..54852ea2 --- /dev/null +++ b/test/api/ExampleApiTest.php @@ -0,0 +1,39 @@ +http = new HttpClient(); + } + + public function testHi(): void + { + $w = $this->http->get('http://127.0.0.1/hi'); + + $this->assertSame('hi', $w->getBody()->getContents()); + } +} diff --git a/test/api/README.md b/test/api/README.md new file mode 100644 index 00000000..9d64c325 --- /dev/null +++ b/test/api/README.md @@ -0,0 +1,9 @@ +# Http tests + +**If you want to run these tests, you must start the http server.** + +## Start server + +```bash +php bin/swoft http:start +``` diff --git a/test/bootstrap.php b/test/bootstrap.php index 95509527..986a4c5c 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -8,15 +8,24 @@ * @license https://github.com/swoft-cloud/swoft/blob/master/LICENSE */ -use SwoftTest\Testing\TestApplication; +use AppTest\Testing\TestApplication; $baseDir = dirname(__DIR__); $vendor = dirname(__DIR__) . '/vendor'; /** @var \Composer\Autoload\ClassLoader $loader */ $loader = require dirname(__DIR__) . '/vendor/autoload.php'; -$loader->addPsr4('SwoftTest\\Testing\\', $vendor . '/swoft/framework/test/testing/'); -$application = new TestApplication($baseDir); -$application->setBeanFile($baseDir . '/app/bean.php'); -$application->run(); +$swoftFwDir = $vendor . '/swoft/framework'; + +// in framework developing +if (file_exists($vendor . '/swoft/component/src/framework')) { + $swoftFwDir = $vendor . '/swoft/component/src/framework'; +} + +$loader->addPsr4('AppTest\\Unit\\', $baseDir . '/test/unit/'); +$loader->addPsr4('AppTest\\Testing\\', $baseDir . '/test/testing/'); +$loader->addPsr4('SwoftTest\\Testing\\', $swoftFwDir . '/test/testing/'); + +$app = new TestApplication($baseDir); +$app->run(); diff --git a/test/httptest/.keep b/test/httptest/.keep new file mode 100644 index 00000000..18e1ba37 --- /dev/null +++ b/test/httptest/.keep @@ -0,0 +1 @@ +If you want run api test, must start an server before run tests. diff --git a/test/httptest/README.md b/test/httptest/README.md new file mode 100644 index 00000000..6e10a8e8 --- /dev/null +++ b/test/httptest/README.md @@ -0,0 +1,17 @@ +# Http tests + +**If you want to run these tests, you must start the http server.** + +## Config + +Please see http-client.env.json + +## Start server + +```bash +php bin/swoft http:start +``` + +## Run + +Can only be run inside phpstorm diff --git a/test/httptest/http-client.env.json b/test/httptest/http-client.env.json new file mode 100644 index 00000000..3251c960 --- /dev/null +++ b/test/httptest/http-client.env.json @@ -0,0 +1,28 @@ +{ + "development": { + "host": "127.0.0.1:10106", + "bid": 10006, + "id-value": 12345, + "username": "", + "password": "", + "my-var": "my-dev-value", + "form-type": "application/x-www-form-urlencoded" + }, + "testing": { + "host": "", + "bid": 10001, + "id-value": 12345, + "username": "", + "password": "", + "my-var": "my-dev-value", + "form-type": "application/x-www-form-urlencoded" + }, + "production": { + "host": "example.com", + "bid": 10001, + "id-value": 6789, + "username": "", + "password": "", + "my-var": "my-prod-value" + } +} diff --git a/test/httptest/sample.http b/test/httptest/sample.http new file mode 100644 index 00000000..244eaab9 --- /dev/null +++ b/test/httptest/sample.http @@ -0,0 +1,9 @@ +### test api +GET http://{{host}}/hi +Accept: text/plain + +### test api2 +GET http://{{host}}/hello +Accept: text/plain + +### diff --git a/test/testdata/.keep b/test/testdata/.keep new file mode 100644 index 00000000..438a9d29 --- /dev/null +++ b/test/testdata/.keep @@ -0,0 +1 @@ +storage same temp files for tests diff --git a/test/testdata/http-client-tests.png b/test/testdata/http-client-tests.png new file mode 100644 index 0000000000000000000000000000000000000000..160624dd14aefdeea4c2a7c50c10061701a23d6c GIT binary patch literal 110030 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�-kMHtj5x^?PuVObJ)SCw6w?jfdqPkms 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

      }M+|_I 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 B0;vE1 literal 0 HcmV?d00001 diff --git a/test/testing/TestApplication.php b/test/testing/TestApplication.php new file mode 100644 index 00000000..0ebb802b --- /dev/null +++ b/test/testing/TestApplication.php @@ -0,0 +1,75 @@ +setStartConsole(false); + + $config = array_merge([ + 'basePath' => $basePath, + 'beanFile' => $basePath . '/app/bean.php', + 'disabledAutoLoaders' => [ + // \App\AutoLoader::class => 1, + ], + ], $config); + + parent::__construct($config); + } + + public function getCLoggerConfig(): array + { + $config = parent::getCLoggerConfig(); + + // Dont print log to terminal + // $config['enable'] = false; + $config['levels'] = 'error'; + + return $config; + } +} diff --git a/test/unit/Common/MyBeanTest.php b/test/unit/Common/MyBeanTest.php new file mode 100644 index 00000000..11f39078 --- /dev/null +++ b/test/unit/Common/MyBeanTest.php @@ -0,0 +1,30 @@ +assertSame(MyBean::class . '::myMethod2', $bean->myMethod2()); + } +} diff --git a/test/unit/ExampleTest.php b/test/unit/ExampleTest.php index 7de7125b..7547dc00 100644 --- a/test/unit/ExampleTest.php +++ b/test/unit/ExampleTest.php @@ -13,6 +13,11 @@ use PHPUnit\Framework\TestCase; use function bean; +/** + * Class ExampleTest + * + * @package AppTest\Unit + */ class ExampleTest extends TestCase { public function testDemo(): void From abbfe7fce24eefb71e4bdb643ff3f5e3b911fe98 Mon Sep 17 00:00:00 2001 From: inhere Date: Fri, 8 May 2020 11:31:18 +0800 Subject: [PATCH 192/211] update some for composer.json --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 541a127d..f82917bc 100644 --- a/composer.json +++ b/composer.json @@ -38,6 +38,7 @@ "swoft/devtool": "~2.0.0" }, "require-dev": { + "swoft/swlib": "~2.0.0", "swoft/swoole-ide-helper": "dev-master", "phpunit/phpunit": "^7.5" }, From f0f8b8decdd1f039e479f504ef0ba7bdb72671ac Mon Sep 17 00:00:00 2001 From: inhere Date: Fri, 8 May 2020 19:52:58 +0800 Subject: [PATCH 193/211] fix phpstan error --- app/Http/Controller/CacheController.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/Http/Controller/CacheController.php b/app/Http/Controller/CacheController.php index 510aa33d..26ed9507 100644 --- a/app/Http/Controller/CacheController.php +++ b/app/Http/Controller/CacheController.php @@ -12,7 +12,6 @@ use InvalidArgumentException; use Swoft\Cache\Cache; -use Swoft\Http\Message\Response; use Swoft\Http\Server\Annotation\Mapping\Controller; use Swoft\Http\Server\Annotation\Mapping\RequestMapping; @@ -63,9 +62,6 @@ public function get(): array */ public function del(): array { - /** @var Response $resp */ - // $resp = context()->getResponse(); - return ['del' => Cache::delete('ckey')]; } } From 26142af13bbdfc82ec1ac23b3e445d33a2143f41 Mon Sep 17 00:00:00 2001 From: inhere Date: Fri, 8 May 2020 20:11:45 +0800 Subject: [PATCH 194/211] update osme for apitest demo --- .travis.yml | 2 +- test/README.md | 20 ++------------------ test/api/.keep | 1 - 3 files changed, 3 insertions(+), 20 deletions(-) delete mode 100644 test/api/.keep diff --git a/.travis.yml b/.travis.yml index 99b79dc5..5a453795 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ install: - | echo "no" | pecl install -f redis - | - wget https://github.com/swoole/swoole-src/archive/v4.4.17.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - && rm -rf swoole + wget https://github.com/swoole/swoole-src/archive/v4.4.18.tar.gz -O swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure && make -j$(nproc) && make install && cd - && rm -rf swoole echo "extension = swoole.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - | wget -O bin/php-cs-fixer "https://cs.symfony.com/download/php-cs-fixer-v2.phar" diff --git a/test/README.md b/test/README.md index fbc05a6b..ff152284 100644 --- a/test/README.md +++ b/test/README.md @@ -24,30 +24,14 @@ php bin/swoft http:start -d ### Run api tests -- use vendor phpunit - -```bash -vendor/bin/phpunit --testsuite apiTests -``` - -- use global installed phpunit - ```bash -phpunit --testsuite apiTests +php run.php -c phpunit.xml --testsuite apiTests ``` ## Unit tests ### Run unit tests -- use vendor phpunit - -```bash -vendor/bin/phpunit --testsuite unitTests -``` - -- use global installed phpunit - ```bash -phpunit --testsuite unitTests +php run.php -c phpunit.xml --testsuite unitTests ``` diff --git a/test/api/.keep b/test/api/.keep deleted file mode 100644 index 18e1ba37..00000000 --- a/test/api/.keep +++ /dev/null @@ -1 +0,0 @@ -If you want run api test, must start an server before run tests. From be895f7867100904b4938401eed5e3fd956aa4f9 Mon Sep 17 00:00:00 2001 From: inhere Date: Fri, 8 May 2020 20:26:16 +0800 Subject: [PATCH 195/211] fix api tests error --- test/README.md | 4 ++-- test/api/ExampleApiTest.php | 7 ++++++- test/bootstrap.php | 1 + test/httptest/.keep | 1 - test/httptest/http-client.env.json | 11 +++-------- test/httptest/sample.http | 8 +++++++- 6 files changed, 19 insertions(+), 13 deletions(-) delete mode 100644 test/httptest/.keep diff --git a/test/README.md b/test/README.md index ff152284..648da8a2 100644 --- a/test/README.md +++ b/test/README.md @@ -25,7 +25,7 @@ php bin/swoft http:start -d ### Run api tests ```bash -php run.php -c phpunit.xml --testsuite apiTests +php test/run.php -c phpunit.xml --testsuite apiTests ``` ## Unit tests @@ -33,5 +33,5 @@ php run.php -c phpunit.xml --testsuite apiTests ### Run unit tests ```bash -php run.php -c phpunit.xml --testsuite unitTests +php test/run.php -c phpunit.xml --testsuite unitTests ``` diff --git a/test/api/ExampleApiTest.php b/test/api/ExampleApiTest.php index 54852ea2..f5dd8d50 100644 --- a/test/api/ExampleApiTest.php +++ b/test/api/ExampleApiTest.php @@ -10,6 +10,7 @@ namespace AppTest\Api; +use App\Http\Controller\HomeController; use PHPUnit\Framework\TestCase; use Swoft\Swlib\HttpClient; @@ -20,6 +21,8 @@ */ class ExampleApiTest extends TestCase { + public const HOST = 'http://127.0.0.1:18306'; + /** * @var HttpClient */ @@ -32,8 +35,10 @@ public function setUp(): void public function testHi(): void { - $w = $this->http->get('http://127.0.0.1/hi'); + /** @see HomeController::hi() */ + $w = $this->http->get(self::HOST. '/hi'); + $this->assertSame(200, $w->getStatusCode()); $this->assertSame('hi', $w->getBody()->getContents()); } } diff --git a/test/bootstrap.php b/test/bootstrap.php index 986a4c5c..8df079b2 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -26,6 +26,7 @@ $loader->addPsr4('AppTest\\Unit\\', $baseDir . '/test/unit/'); $loader->addPsr4('AppTest\\Testing\\', $baseDir . '/test/testing/'); $loader->addPsr4('SwoftTest\\Testing\\', $swoftFwDir . '/test/testing/'); +$loader->addPsr4('Swoft\\Swlib\\', $vendor . '/swoft/swlib/src/'); $app = new TestApplication($baseDir); $app->run(); diff --git a/test/httptest/.keep b/test/httptest/.keep deleted file mode 100644 index 18e1ba37..00000000 --- a/test/httptest/.keep +++ /dev/null @@ -1 +0,0 @@ -If you want run api test, must start an server before run tests. diff --git a/test/httptest/http-client.env.json b/test/httptest/http-client.env.json index 3251c960..6eb0a55f 100644 --- a/test/httptest/http-client.env.json +++ b/test/httptest/http-client.env.json @@ -1,25 +1,20 @@ { "development": { - "host": "127.0.0.1:10106", - "bid": 10006, + "host": "127.0.0.1:18306", "id-value": 12345, "username": "", "password": "", - "my-var": "my-dev-value", - "form-type": "application/x-www-form-urlencoded" + "my-var": "my-dev-value" }, "testing": { "host": "", - "bid": 10001, "id-value": 12345, "username": "", "password": "", - "my-var": "my-dev-value", - "form-type": "application/x-www-form-urlencoded" + "my-var": "my-dev-value" }, "production": { "host": "example.com", - "bid": 10001, "id-value": 6789, "username": "", "password": "", diff --git a/test/httptest/sample.http b/test/httptest/sample.http index 244eaab9..1f7c380f 100644 --- a/test/httptest/sample.http +++ b/test/httptest/sample.http @@ -1,6 +1,12 @@ ### test api GET http://{{host}}/hi -Accept: text/plain +Accept: text/html + +> {% +client.test("Request executed successfully", function() { + client.assert(response.status === 200, "Response status is not 200"); +}); +%} ### test api2 GET http://{{host}}/hello From 00cbd635a4fba2ffd7b89dc688606044f22a1ae6 Mon Sep 17 00:00:00 2001 From: inhere Date: Fri, 8 May 2020 20:40:52 +0800 Subject: [PATCH 196/211] update some for travis config --- .travis.yml | 4 +++- composer.json | 7 +++---- test/bootstrap.php | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5a453795..6cbbe5b4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,5 +27,7 @@ before_script: script: - composer check-cs - - composer test + - composer phpstan + - composer api-tests + - composer unit-tests # - php bin/swoft dinfo:env diff --git a/composer.json b/composer.json index f82917bc..91988b4a 100644 --- a/composer.json +++ b/composer.json @@ -61,10 +61,9 @@ "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], - "test": [ - "./vendor/bin/phpstan analyze", - "./vendor/bin/phpunit -c phpunit.xml" - ], + "phpstan": "./vendor/bin/phpstan analyze", + "api-tests": "php test/run.php -c phpunit.xml --testsuite apiTests", + "unit-tests": "php test/run.php -c phpunit.xml --testsuite unitTests", "check-cs": "./bin/php-cs-fixer fix --dry-run --diff --diff-format=udiff", "cs-fix": "./bin/php-cs-fixer fix" } diff --git a/test/bootstrap.php b/test/bootstrap.php index 8df079b2..74d3e49d 100644 --- a/test/bootstrap.php +++ b/test/bootstrap.php @@ -26,7 +26,7 @@ $loader->addPsr4('AppTest\\Unit\\', $baseDir . '/test/unit/'); $loader->addPsr4('AppTest\\Testing\\', $baseDir . '/test/testing/'); $loader->addPsr4('SwoftTest\\Testing\\', $swoftFwDir . '/test/testing/'); -$loader->addPsr4('Swoft\\Swlib\\', $vendor . '/swoft/swlib/src/'); +// $loader->addPsr4('Swoft\\Swlib\\', $vendor . '/swoft/swlib/src/'); $app = new TestApplication($baseDir); $app->run(); From c86d6f62b4b75eb94df758e4773af6a1bb51f586 Mon Sep 17 00:00:00 2001 From: inhere Date: Sat, 9 May 2020 10:06:13 +0800 Subject: [PATCH 197/211] update for api tests --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index 6cbbe5b4..45dde42b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,8 @@ before_script: - bin/php-cs-fixer -V - composer config -g process-timeout 900 && composer update - composer require --dev phpstan/phpstan + # start http server for api-tests + - php bin/swoft http:start -d script: - composer check-cs @@ -31,3 +33,6 @@ script: - composer api-tests - composer unit-tests # - php bin/swoft dinfo:env + +after_script: + - php bin/swoft http:stop From f51c9933c559cb7e628c474c90ce40e9a0277fdb Mon Sep 17 00:00:00 2001 From: Inhere Date: Mon, 18 May 2020 19:53:27 +0800 Subject: [PATCH 198/211] Create config.yml --- .github/ISSUE_TEMPLATE/config.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..393a2216 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Swoft Chinese Documents + url: https://swoft.org + about: Please ask and answer questions here. + - name: Swoft English Documents + url: http://swoft.io + about: Please report security vulnerabilities here. From 42b94659508198584e100a6bd40d4e5332b2772d Mon Sep 17 00:00:00 2001 From: Gulzar Ahmed Date: Wed, 29 Jul 2020 18:46:59 +0530 Subject: [PATCH 199/211] Typo Fix: CORNTAB to CRONTAB --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3f6b4625..57b2f5d4 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Through three years of accumulation and direction exploration, Swoft has made Sw - Flexible annotation function - Diversified command terminal(Console) - Powerful Aspect Oriented Programming(AOP) -- Perfect Container management、Dependency Injection (DI) +- Perfect Container management, Dependency Injection (DI) - Flexible event mechanism - Implementation of HTTP message based on PSR-7 - Event Manager Based on PSR-14 @@ -39,7 +39,7 @@ Through three years of accumulation and direction exploration, Swoft has made Sw - Database is highly compatible Laravel - Cache Redis highly compatible Laravel - Efficient task processing -- Efficient seconds corntab +- Efficient seconds crontab - Process pool - Flexible exception handling - Powerful log system From b7a990115fea30773c0ef284b1a00b1ce448fee5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 6 Aug 2020 09:13:52 +0000 Subject: [PATCH 200/211] Create Dependabot config file --- .github/dependabot.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..c630ffa6 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: composer + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 From b98e5017326bfa6f0a0f46d51739e5c64eeb94dc Mon Sep 17 00:00:00 2001 From: "jj.style" Date: Tue, 11 Aug 2020 17:39:46 +0800 Subject: [PATCH 201/211] correct the docs links --- README.zh-CN.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 4629158a..4566f1b8 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -57,8 +57,8 @@ Swoft 通过长达三年的积累和方向的探索,把 Swoft 打造成 PHP ## 在线文档 -- [中文文档](https://www.swoft.org/docs/2.x/zh-CN/README.html) -- [English](https://www.swoft.org/docs/2.x/en) +- [中文文档](https://www.swoft.org/documents/v2/index.html) +- [English](http://swoft.io/docs/2.x/en) ## 学习交流 From 543d4cd8e6bbdc2294f63b69ac796899bd609033 Mon Sep 17 00:00:00 2001 From: Inhere Date: Tue, 11 Aug 2020 19:47:40 +0800 Subject: [PATCH 202/211] Update README.zh-CN.md --- README.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 4629158a..aebaa6d8 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -9,7 +9,7 @@ [![Docker Build Status](https://img.shields.io/docker/build/swoft/swoft.svg)](https://hub.docker.com/r/swoft/swoft/) [![Php Version](https://img.shields.io/badge/php-%3E=7.1-brightgreen.svg?maxAge=2592000)](https://secure.php.net/) [![Swoole Version](https://img.shields.io/badge/swoole-%3E=4.3.3-brightgreen.svg?maxAge=2592000)](https://github.com/swoole/swoole-src) -[![Swoft Doc](https://img.shields.io/badge/docs-passing-green.svg?maxAge=2592000)](https://www.swoft.org/docs) +[![Swoft Doc](https://img.shields.io/badge/docs-passing-green.svg?maxAge=2592000)](https://www.swoft.org) [![Swoft License](https://img.shields.io/hexpm/l/plug.svg?maxAge=2592000)](https://github.com/swoft-cloud/swoft/blob/master/LICENSE) [![Gitter](https://img.shields.io/gitter/room/swoft-cloud/swoft.svg)](https://gitter.im/swoft-cloud/community) From 7109da511c80342afcf682da45d914ad89d7e9f3 Mon Sep 17 00:00:00 2001 From: zhenghongyang Date: Sun, 13 Sep 2020 14:39:57 +0800 Subject: [PATCH 203/211] supprot muti mig db pool --- app/Migration/User.php | 2 +- bin/swoft | 0 2 files changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 bin/swoft diff --git a/app/Migration/User.php b/app/Migration/User.php index 2292766d..9f04f459 100644 --- a/app/Migration/User.php +++ b/app/Migration/User.php @@ -18,7 +18,7 @@ * * @since 2.0 * - * @Migration(20190630164222) + * @Migration(time=20190630164222, pool="db.pool,db1.pool") */ class User extends BaseMigration { diff --git a/bin/swoft b/bin/swoft old mode 100644 new mode 100755 From c39436108a07b8b4c7f8a399d0e01f5248832dd6 Mon Sep 17 00:00:00 2001 From: zhenghongyang Date: Sun, 13 Sep 2020 15:02:37 +0800 Subject: [PATCH 204/211] perfect db demo --- app/bean.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/bean.php b/app/bean.php index a0e8d54b..ce36b774 100644 --- a/app/bean.php +++ b/app/bean.php @@ -84,6 +84,7 @@ 'dsn' => 'mysql:dbname=test2;host=127.0.0.1', 'username' => 'root', 'password' => 'swoft123456', + 'charset' => 'utf8mb4', // 'dbSelector' => bean(DbSelector::class) ], 'db2.pool' => [ @@ -94,7 +95,8 @@ 'class' => Database::class, 'dsn' => 'mysql:dbname=test2;host=127.0.0.1', 'username' => 'root', - 'password' => 'swoft123456' + 'password' => 'swoft123456', + 'charset' => 'utf8mb4', ], 'db3.pool' => [ 'class' => Pool::class, From 114de481db59b876de96a559969baa77d7ddb753 Mon Sep 17 00:00:00 2001 From: inhere Date: Sun, 13 Sep 2020 22:57:17 +0800 Subject: [PATCH 205/211] update some examples --- .php_cs | 21 +++--- app/Http/Middleware/DomainLimitMiddleware.php | 67 +++++++++++++++++++ app/Http/Middleware/FavIconMiddleware.php | 5 +- test/README.md | 26 ++++--- 4 files changed, 98 insertions(+), 21 deletions(-) create mode 100644 app/Http/Middleware/DomainLimitMiddleware.php diff --git a/.php_cs b/.php_cs index e6077b74..83e4640a 100644 --- a/.php_cs +++ b/.php_cs @@ -13,21 +13,24 @@ return PhpCsFixer\Config::create() ->setRiskyAllowed(true) ->setRules([ '@PSR2' => true, - 'header_comment' => [ - 'comment_type' => 'PHPDoc', - 'header' => $header, - 'separate' => 'bottom' - ], 'array_syntax' => [ 'syntax' => 'short' ], - 'encoding' => true, // MUST use only UTF-8 without BOM - 'single_quote' => true, 'class_attributes_separation' => true, + 'declare_strict_types' => true, + 'encoding' => true, // MUST use only UTF-8 without BOM + 'global_namespace_import' => [ + 'import_constants' => true, + 'import_functions' => true, + ], + 'header_comment' => [ + 'comment_type' => 'PHPDoc', + 'header' => $header, + 'separate' => 'bottom' + ], 'no_unused_imports' => true, - 'global_namespace_import' => true, + 'single_quote' => true, 'standardize_not_equals' => true, - 'declare_strict_types' => true, ]) ->setFinder( PhpCsFixer\Finder::create() diff --git a/app/Http/Middleware/DomainLimitMiddleware.php b/app/Http/Middleware/DomainLimitMiddleware.php new file mode 100644 index 00000000..bfd49321 --- /dev/null +++ b/app/Http/Middleware/DomainLimitMiddleware.php @@ -0,0 +1,67 @@ + [ + // match all /user/* + '/user/', + ], + 'blog.com' => [ + // match all /blog/* + '/blog/', + ] + ]; + + /** + * Process an incoming server request. + * + * @param ServerRequestInterface|Request $request + * @param RequestHandlerInterface $handler + * + * @return ResponseInterface + * @inheritdoc + */ + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface + { + $uriPath = $request->getUriPath(); + $domain = $request->getUri()->getHost(); + + if (!isset($this->domain2paths[$domain])) { + return context()->getResponse()->withStatus(404)->withContent('invalid request domain'); + } + + foreach ($this->domain2paths[$domain] as $prefix) { + // not match route prefix + if (strpos($uriPath, $prefix) !== 0) { + return context()->getResponse()->withStatus(404)->withContent('page not found'); + } + } + + return $handler->handle($request); + } +} diff --git a/app/Http/Middleware/FavIconMiddleware.php b/app/Http/Middleware/FavIconMiddleware.php index 12ff387a..f5a4de80 100644 --- a/app/Http/Middleware/FavIconMiddleware.php +++ b/app/Http/Middleware/FavIconMiddleware.php @@ -14,7 +14,6 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use Swoft\Bean\Annotation\Mapping\Bean; -use Swoft\Exception\SwoftException; use Swoft\Http\Message\Request; use Swoft\Http\Server\Contract\MiddlewareInterface; use function context; @@ -34,10 +33,12 @@ class FavIconMiddleware implements MiddlewareInterface * * @return ResponseInterface * @inheritdoc - * @throws SwoftException */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { + $uriPath = $request->getUriPath(); + $domain = $request->getUri()->getHost(); + if ($request->getUriPath() === '/favicon.ico') { return context()->getResponse()->withStatus(404); } diff --git a/test/README.md b/test/README.md index 648da8a2..e4b70cca 100644 --- a/test/README.md +++ b/test/README.md @@ -1,19 +1,11 @@ # Tests -## Http tests - -**If you want to run http client tests, you must start the http server.** - -### Run http tests - -Can only be run inside phpstorm. - -![http-client-tests](testdata/http-client-tests.png) - ## API tests **If you want to run api tests, you must start the http server.** +tests case dir: `/test/api/` + ## Start server ```bash @@ -30,8 +22,22 @@ php test/run.php -c phpunit.xml --testsuite apiTests ## Unit tests +tests case dir: `/test/unit/` + ### Run unit tests ```bash php test/run.php -c phpunit.xml --testsuite unitTests ``` + +## Http tests + +tests case dir: `/test/httptest/` + +**If you want to run http client tests, you must start the http server.** + +### Run http tests + +Can only be run inside phpstorm. + +![http-client-tests](testdata/http-client-tests.png) From 85df5e25cb98d306756e01c28d31acc063f570c1 Mon Sep 17 00:00:00 2001 From: inhere Date: Sun, 13 Sep 2020 23:08:55 +0800 Subject: [PATCH 206/211] upsome --- test/unit/Common/MyBeanTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/unit/Common/MyBeanTest.php b/test/unit/Common/MyBeanTest.php index 11f39078..bde9377e 100644 --- a/test/unit/Common/MyBeanTest.php +++ b/test/unit/Common/MyBeanTest.php @@ -12,6 +12,7 @@ use App\Common\MyBean; use PHPUnit\Framework\TestCase; +use Swoft\Log\Helper\Log; use function bean; /** @@ -25,6 +26,9 @@ public function testMyMethod2(): void { $bean = bean(MyBean::class); + vdump('test message'); + Log::info('test message'); + $this->assertSame(MyBean::class . '::myMethod2', $bean->myMethod2()); } } From 2599c30ec22d2a0bbeb89851681dff28691f3b30 Mon Sep 17 00:00:00 2001 From: Inhere Date: Wed, 9 Dec 2020 10:38:51 +0800 Subject: [PATCH 207/211] Create release.yml --- .github/workflows/release.yml | 62 +++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..a33279f9 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,62 @@ +name: Tag-release + +on: + push: + tags: + - v* + +jobs: + release: + name: Test on php ${{ matrix.php}} + runs-on: ubuntu-latest + timeout-minutes: 10 + strategy: + fail-fast: true + matrix: + php: [7.3] + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Set ENV for github-release + # https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable + run: | + echo "RELEASE_TAG=${GITHUB_REF:10}" >> $GITHUB_ENV + echo "RELEASE_NAME=$GITHUB_WORKFLOW" >> $GITHUB_ENV + + # usage refer https://github.com/shivammathur/setup-php + - name: Setup PHP + timeout-minutes: 5 + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php}} + tools: pecl, php-cs-fixer, phpunit + extensions: mbstring, dom, fileinfo, mysql, openssl # , swoole-4.4.19 #optional, setup extensions + ini-values: post_max_size=56M, short_open_tag=On #optional, setup php.ini configuration + coverage: none #optional, setup coverage driver: xdebug, none + + - name: Install dependencies # eg: v1.0.3 + run: | + tag1=${GITHUB_REF#refs/*/} + echo "release tag: ${tag1}" + composer install --no-progress --no-suggest + + # Add a test script to composer.json, for instance: "test": "vendor/bin/phpunit" + # Docs: https://getcomposer.org/doc/articles/scripts.md + +# - name: Build phar and send to github assets +# run: | +# echo $RELEASE_TAG +# echo $RELEASE_NAME +# php -d phar.readonly=0 bin/kite phar:pack -o kite-${RELEASE_TAG}.phar --no-progress +# php kite-${RELEASE_TAG}.phar -V + + # https://github.com/actions/create-release + - uses: meeDamian/github-release@2.0 + with: + gzip: false + token: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ env.RELEASE_TAG }} + name: ${{ env.RELEASE_TAG }} +# files: kite-${{ env.RELEASE_TAG }}.phar From 02430c87cc4ec42590af93d9cc7c7b205743add7 Mon Sep 17 00:00:00 2001 From: inhere Date: Sun, 2 May 2021 00:03:07 +0800 Subject: [PATCH 208/211] update for phpunit version --- composer.cn.json | 2 +- composer.json | 2 +- dev.composer.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.cn.json b/composer.cn.json index a63797b5..376ba4d0 100644 --- a/composer.cn.json +++ b/composer.cn.json @@ -27,7 +27,7 @@ }, "require-dev": { "swoft/swoole-ide-helper": "dev-master", - "phpunit/phpunit": "^7.5", + "phpunit/phpunit": "^7.5 || ^8.0", "swoft/devtool": "~2.0.0" }, "autoload": { diff --git a/composer.json b/composer.json index 91988b4a..46570ed4 100644 --- a/composer.json +++ b/composer.json @@ -40,7 +40,7 @@ "require-dev": { "swoft/swlib": "~2.0.0", "swoft/swoole-ide-helper": "dev-master", - "phpunit/phpunit": "^7.5" + "phpunit/phpunit": "^7.5 || ^8.0" }, "autoload": { "psr-4": { diff --git a/dev.composer.json b/dev.composer.json index 99052245..f2c200e5 100644 --- a/dev.composer.json +++ b/dev.composer.json @@ -18,7 +18,7 @@ }, "require-dev": { "swoft/swoole-ide-helper": "dev-master", - "phpunit/phpunit": "^7.5" + "phpunit/phpunit": "^7.5 || ^8.0" }, "autoload": { "psr-4": { From 9bf50ff42e21c9fdb96021a29192a60eaff56ba1 Mon Sep 17 00:00:00 2001 From: inhere Date: Fri, 7 May 2021 00:11:55 +0800 Subject: [PATCH 209/211] update some for composer dev json --- dev.composer.json => composer.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename dev.composer.json => composer.dev.json (97%) diff --git a/dev.composer.json b/composer.dev.json similarity index 97% rename from dev.composer.json rename to composer.dev.json index f2c200e5..3544559b 100644 --- a/dev.composer.json +++ b/composer.dev.json @@ -12,11 +12,11 @@ "php": ">7.1", "ext-pdo": "*", "ext-json": "*", - "ext-swoole": ">=4.3", "swoft/component": "dev-master as 2.0", "swoft/ext": "dev-master as 2.0" }, "require-dev": { + "swoft/swlib": "~2.0.0", "swoft/swoole-ide-helper": "dev-master", "phpunit/phpunit": "^7.5 || ^8.0" }, From 215b203b601fe805571d643b39b8a0733fa90048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9C=96?= Date: Mon, 17 Jan 2022 10:26:14 +0800 Subject: [PATCH 210/211] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 57b2f5d4..3e6df3af 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,7 @@ swoft-limiter | [![Latest Stable Version](http://img.shields.io/packagist/v/swof swoft-view | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/view.svg)](https://packagist.org/packages/swoft/view) swoft-whoops | [![Latest Stable Version](http://img.shields.io/packagist/v/swoft/whoops.svg)](https://packagist.org/packages/swoft/whoops) + ## License Swoft is an open-source software licensed under the [LICENSE](LICENSE) From a658ae00fcab2dabad31dac56b95d3178793ba0d Mon Sep 17 00:00:00 2001 From: Vladimir Date: Sun, 31 Jul 2022 14:42:52 +0300 Subject: [PATCH 211/211] Add .gitattributes, exclude tests from archive --- .gitattributes | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..54adf57f --- /dev/null +++ b/.gitattributes @@ -0,0 +1,7 @@ +/.editorconfig export-ignore +/.gitattributes export-ignore +/.github export-ignore +/.gitignore export-ignore +/.travis.yml export-ignore +/phpunit.xml export-ignore +/test export-ignore