pier-infor / nymfonya
Nymfonya Rest App
Requires
- php: >=7.3.10
- firebase/php-jwt: ^3.0 || ^4.0 || ^5.0
- monolog/monolog: ^1.25
- nilportugues/sql-query-builder: ^1.7
- pier-infor/nymfonya-config: ^1.0.2
- pier-infor/nymfonya-container: ^1.0.2
- pier-infor/nymfonya-http-foundation: ^1.0.2
- pier-infor/nymfonya-pubsub: ^1.0.1
- swiftmailer/swiftmailer: ^6.2
- zircote/swagger-php: ^3.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.17
- phan/phan: 3.x
- phploc/phploc: ^5.0
- phpmd/phpmd: @stable
- phpunit/phpunit: ^8.0
- squizlabs/php_codesniffer: *
- theseer/phpdox: ^0.12.0
This package is auto-updated.
Last update: 2024-09-08 07:12:52 UTC
README
is not a Symfony app...¯\(ツ)/¯
ʕʘ̅͜ʘ̅ʔ 为什么
我想
- 只玩 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 令牌
- https://:8888/api/v1/stat/filecache
- https://:8888/api/v1/test/jwtaction
- https://:8888/api/v1/test/upload
中间件 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 配置。
🔥 安全性
开发应用程序是开发工作的一部分,而安全性则是另一部分。
开发端
在所有地方使用过滤器和验证器,并永远不要信任输入参数。
- 过滤器类型 , filter_input . , filter_input_array . , filter_var_array .
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 的 JIT 和 DynAsm。
它应该比 v7.4 的性能提高 4 倍,并生成原生代码(VM + AOT)。
您可以从 PHP v7.4 开始尝试 JIT,作为实验性功能(编译时间)!
给它 star 或 fork 然后提交 PR 来改进它。
测试它并感到高兴或不高兴 ¯_(ツ)_/¯
🐼 额外内容
- Markdown 表情符号。