pier-infor/nymfonya

Nymfonya Rest App

1.0.6 2020-12-30 18:25 UTC

This package is auto-updated.

Last update: 2024-09-08 07:12:52 UTC


README

is not a Symfony app...¯\(ツ)

TravsisBadgeBuild CoverageCi ScrutinizerCq Latest Stable Version Total Downloads Latest Unstable Version

logo

ʕʘ̅͜ʘ̅ʔ 为什么

我想

  • 只玩 REST。
  • Slim 配置。
  • 控制台特性。
  • 低内存占用。
  • 最小化加载文件(最多 150 个)以适应任何最终用途。
  • 响应时间始终低于 10ms。
  • 所有可测试。
  • 可打包。
  • CI 兼容。

👀 简介

在基于 Symfony 或 Laravel 的后端项目以及使用 Angular 作为前端的项目中,我对性能感到沮丧。我转向了像 Silex、Slim 这样的微框架来进一步提高性能。其中许多都被遗弃,以支持主要演员。我无法理解原因,可能是维护者不足,或者人们更喜欢更通用和功能丰富的解决方案。

Composer 包管理器,于 2011 年引入,改变了使用包和依赖关系概念设计 PHP 应用程序的方式。随后引入了 PSR-0 和 PSR-4 自动加载 RFC,将包与命名空间对齐,以 vendor/feature 的形式。
PHP 仍然是解释的,需要加载源文件,解析(AST),编译(opcode)然后在请求时间执行在 Zend VM 上。一些公司尝试使用 JIT 编译源文件来加快这些步骤(HipHop、HHVM),但并没有确保与原生源代码的兼容性... 😞 !

😿 情况

为了加快包的依赖关系,Composer 引入了优化选项,通过命名空间构建一个“资源目录”。为了加快解释过程,PHP 引入了 Opcache 作为 opcode 缓存,但首次运行仍然较慢。尽管所有这些好处,某些框架启动时需要大约 3K 个文件,这会增加存储设备上的 I/O,浪费内存。
这让人沮丧 😡 !
我们可以做得更好,不是吗?

🌊 最佳实践

  • 一次性实例化对象。
  • 到处注入容器。
  • 当可能时使用类型提示(最好使用 php => 7.3)。
  • 避免慢过程,如 Reflection。
  • 禁止函数式注释。
  • 通过 env 记录一切(Monolog),包括错误。
  • 以错误代码和消息的最小结构响应,即使没有错误。
  • 没有魔法方法。
  • 没有全局变量或定义。
  • 避免静态。
  • 在接口中声明类常量。

🐴 架构

  • 😎 REST 应用。
  • 🐠 作为功能额外提供的包(不受支持)。
  • 🍺 我会说 MVC,但我喜欢忘记控制器并使用闭包。
  • 🌀 在 config/$env 中配置。
  • 🐚 使用 php >= 7.0 运行。

配置

  • 🐟 nymfonya-config 外部包依赖(受支持)。
  • 配置管理器。
  • 保持配置为关联数组。
  • 通过 Env 隔离。
  • 可测试性:检查 autoload-dev psr-4 命名空间。

容器

  • 🐟 nymfonya-container 外部包依赖(受支持)。
  • 不是 PSR-11。
  • 使用注入的参数实例化类。
  • 优先级顺序回滚。
  • 容器配置是关联数组(classname => params)。
  • 可测试性:检查 autoload-dev psr-4 命名空间。

Kernel & Http Foundation

  • 🐟 nymfonya-http-foundation 外部包(受支持)。
  • 加载配置。
  • 在服务器和 CLI 模式下运行 Kernel。
  • 从容器中实例化服务。
  • 按设计顺序设置中间件(before/core/after)。
  • 当路由匹配时运行中间件序列。
  • 将控制器操作作为中间件核心闭包执行。
  • 可测试性:检查 autoload-dev psr-4 命名空间。

服务

  • 配置
  • 日志记录器(Monolog)
  • 请求(尚未 PSR-7)
  • 路由
  • 路由器
  • 控制器
  • 响应(暂无PSR-7)

规则

  • 请求是'不可变'的。
  • 容器服务可以被修改。
  • 容器将 Peel 方法中间件作为第一个参数注入。
  • 容器将构造函数控制器方法作为第一个参数注入。
  • 响应可以被中间件和控制器随时修改。

中间件

中间件栈必须至少包含一个。

  • Cors:处理跨域请求(Angular OPTIONS 预检请求)。
  • Jwt:处理基于 Jwt 令牌的认证。
  • After:终止符,确保中间件逻辑完全有效。

💥 使用

服务器

启动

从根路径

composer run start

运行

推荐使用 Postman。

中间件 Jwt
#!/bin/bash
curl -v \
	--request POST \
	--url https://:8888/api/v1/auth/login \
	--header 'Cache-Control: no-cache' \
	--header 'Connection: keep-alive' \
	--header 'Content-Type: application/json' \
	--header 'Host: localhost:8888' \
	--header 'cache-control: no-cache' \
	--data '{"login": "admin@domain.tld","password": "adminadmin"}'

免费访问

需要 Bearer 令牌

中间件 Restufl
中间件 Cors & After

对所有端点启用。

Cli

适用于批量模式、cron 任务。从项目根目录开始。这不需要运行任何服务器。中间件 Jwt 被禁用。
使用 jq 在控制台中格式化或过滤 json。

示例认证

php src/index.php '/api/v1/auth/login?login=admin@domain.tld&password=adminadmin' | jq

示例统计 Opcache

php src/index.php '/api/v1/stat/opcache' | jq

示例 OpenApi 生成器

php src/index.php '/config/swaggerdoc'

🌟 代码

目录

find ./src -name *.php | grep -E -v 'vendor|config|test' | wc -l

复杂度

  • 运行 phploc
composer run cq

杂乱

  • 运行 phpmd(杂乱检测器)
composer run md

😇 测试

运行 phpunit 所有测试。

composer run test

要获取代码覆盖率,请运行以下命令,然后浏览 coverage/index.html 文件。

要运行 xdebug 驱动(需要 xdebug),被认为是肥胖和有缺陷的。

composer run cov

要运行 phpdbg 驱动(需要 phpdbg),更快且更精确。

composer run covdbg

您还可以使用一个非常快的驱动程序 PCOV
检查 S.Bergmann travis 配置

🔥 安全性

开发应用程序是开发工作的一部分,而安全性则是另一部分。

开发端

在所有地方使用过滤器和验证器,并永远不要信任输入参数。

Devops 端

Devops/SysAdmins 应该提出/设置解决方案。

  • 首选 php-fpm 而不是模块,以获得灵活性。
  • 首选 Nginx 而不是 Apache,以获得性能和 http/2。
  • 不要在生产环境中使用 php 服务器(单线程)。
  • 为静态内容设置 varnish。

如果暴露如下,我建议使用第三方服务

  • apache(2) mod_security(2) 以让 OWASP 破解并记录最常见的攻击。
  • Nginx ModSecurity。
  • fail2ban 与 mod_security(2) 或 ModSecurity 一起使用,以阻止反复攻击者。

这应该阻止最常见的攻击,但并不能免除您的应用程序需要坚不可摧。

使用 Tail for Monolog 检查您的应用程序日志,使日志阅读更容易。

在 php.ini 中更改一些设置

🐹 待办事项

核心

  • 重构请求以使用代理后端。
  • 控制台工具。
  • 在 Acl、Waf、Transfos... 之前添加更多中间件。
  • 实现控制器转发方法。
  • 实现响应重定向 30X。

额外包

  • 使用 doctrine、mongodb、elasticsearch 的模型。
  • 使用 swiftmailer 发送邮件。

🐔 命名规范

  • (I) 接口。
  • (T) 特性。

控制器动作必须声明为最终公共。

👅 结论

我意识到这需要在许多方面进行改进,并且很抱歉破坏了大多数 PSR。(⌐■_■)
性能出色(第一次运行 40X 响应时间为 15ms,然后为 6ms)。

我尽量保持代码

  • 简短。
  • 可读,并附有注释。
  • 可测试(Wip 93% 方法覆盖率)。
  • 明确。
  • 解耦。
  • 进行了代码风格检查。
  • 类型提示(考虑到 PHP v7.X 兼容性)。

迫不及待想尝试 PHP v8.0 的 JITDynAsm
它应该比 v7.4 的性能提高 4 倍,并生成原生代码(VM + AOT)。
您可以从 PHP v7.4 开始尝试 JIT,作为实验性功能(编译时间)!
给它 star 或 fork 然后提交 PR 来改进它。
测试它并感到高兴或不高兴 ¯_(ツ)_/¯

🐼 额外内容