hermes-php / hermes-micro
适用于知道自己在做什么的开发者的框架
Requires
- php: >=7.2
- hermes-php/http-app: ^1.0
- http-interop/response-sender: ^1.0
- league/container: ^3.2
- react/http: ^0.8.3
- spiral/roadrunner: ^1.3
- zendframework/zend-diactoros: ^2.0
- zendframework/zend-expressive-fastroute: ^3.0
- zendframework/zend-httphandlerrunner: ^1.0
Requires (Dev)
- phpunit/phpunit: ^7.5
README
力量已经到来
介绍
感谢您信任Hermes。我们相信这个最小化、下一代PHP框架将成为您的宝贵工具。
在开始之前,您必须知道我们为您做出了一些重要的决定,如果您觉得它们不适合您,您可以完全更改。例如
- 我们为您选择了PSR-7 (Http Messages)实现,称为Zend Diactoros。它还附带了一个PSR-17 (Http Message Factories)实现。
- 我们为您选择了PSR-11 (DI Container)实现,League Container。您可以随时将其替换为您最喜欢的容器。
- 我们为您选择了Zend Router实现,Nikita的著名Fast Route。如果它不适合您的需求,您也可以更改它。
- 我们添加了Road Runner,这是一个高性能的PHP应用程序服务器、负载均衡器和进程管理器。阅读快速入门指南以了解更多信息。
- 我们添加了http-interop/response-sender,这是一个简单的函数,用于向客户端发送PSR-7响应。
- 我们使用容器通过简单的PHP配置文件连接了一切。您可以自由地创建自己的配置方法。所有这些都在
config/
文件夹中。 - 我们添加了一个名为views的文件夹,其中包含Hermes主页的视图,主要是为了使其看起来更好看。您应该删除views文件夹和默认的主页处理器(在
App\Http\Middleware
中)。 - 我们创建了一个
public/
目录,其中包含一个入口脚本index.php
,以防您想回到旧式的PHP方式并将其放在Apache或Nginx后面。
请记住所有这些,并在开发过程中尽早进行所需的更改。
快速入门指南
这份简短的指南将帮助您处理基本内容。它非常浅显,并假设您有大量的知识。如果您在遵循它时遇到麻烦,请阅读正确的Hermes文档。
通过HTTP提供服务
Hermes Micro支持三种方式在HTTP上提供服务。
传统的索引前端控制器
其中一种是传统的公共文件夹,包含index.php
前端控制器。您可以用任何Web服务器(Apache、Nginx + PHP-FPM)指向该脚本并执行它。这个入口点对于使用PHP内置的开发Web服务器进行开发非常有用。只需运行php -S 0.0.0.0:8000 -t public
,一切就会运行。
React PHP Web Server
另一种方式,稍微现代一些,是使用React的PHP HTTP Web服务器在TCP套接字上创建一个HTTP服务器(是的,这一切都在PHP中完成)并将您的应用作为长时间运行进程执行。您可以通过运行php bin/server.php
来完成此操作。这非常高效,因为文件只由Zend引擎解析一次,由Composer的Autoload自动加载一次,以及由您的DI容器配置一次。然而,您必须编写会意识到请求之间可能存在内存泄漏的代码。如果您想看到代码更改,您必须重新启动服务器。
如果您打算从您的应用程序中制作无状态的Docker容器,这将是理想的设置,这也是Dockerfile默认运行的命令。
重要提示:当使用React PHP web服务器时,如果您不使用中间件,您的静态文件(资源)可能无法正确加载。请检查
hermes-php/asset-middleware
以获取一个。如果您不需要您的应用提供静态文件,您可以忽略此内容。
Road Runner负载均衡器
当您想在单台机器上运行您的应用,但在其后面放置进程管理和负载均衡器以充分利用您的核心时,您可以使用Road Runner。这是一个能够生成您的应用程序的多个进程并处理它们之间负载的Go应用。我们包括了一个默认的配置文件和一个工作进程,但您必须自行下载适用于您平台的二进制文件。这是在单台机器上提供服务最有效的方式(比PHP-FPM+Nginx+OpCache快得多)。
基准测试
我们使用ab
在三种方式下对Hermes Micro的首页进行了基准测试。
测试:5000次请求(50并发)
服务器 | 总时间 | 完成 | 失败 | 每秒请求数 | 每个请求时间 |
---|---|---|---|---|---|
Road Runner | 2.377秒 | 5000 | 0 | 2103.46 | 23.770毫秒 |
ReactPHP | 7.794秒 | 5000 | 0 | 641.49 | 77.943毫秒 |
PHP开发服务器 | 16.861秒 | 5000 | 0 | 296.54 | 168.609毫秒 |
事实
- React PHP比常规PHP开发服务器快至少两倍。
- Road Runner比React PHP快至少三倍。
- 当并发请求数增加到150时,React PHP和PHP开发服务器都崩溃并抱怨请求过多。Road Runner可以毫无问题地处理。
Road Runner之所以最优秀,是因为它生成四个工作进程并在它们之间分配负载,非常有效地利用所有核心。React PHP由于只使用一个核心,无法与之竞争,但由于每个请求中已经设置的引导程序,它仍然比PHP开发服务器快。
- 测试是在Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz(4核心)和16 GB RAM的机器上进行的。
在开发您的应用
如您所意识到的,Hermes不使用花哨的yaml
、toml
或json
配置文件来连接您的服务和引导代码:您必须自己完成所有这些。这使您能够在开发速度的代价下获得完全的灵活性。
我们坚信编程不是魔法,这是为什么Hermes不会帮助您创建CRUD或为您自动生成代码。您有其他HTTP框架来做这些。编程是艰苦的工作:不要试图使用工具来避免编写代码。遵循这些建议,您将看到作为专业人士您将增长多少。
话虽如此,我的意思并不是说您必须亲自编写应用程序的每一个组件。在可能的情况下,请依靠库,特别是那些可互操作的库。您可以使用PSR-15 Middleware构建一个相当稳固的HTTP层。
对于不太可互操作的库,实现适合您应用程序的合同并创建适配器。不要因为不遵循最佳实践而将自己锁定在某个供应商上。
在容器中注册服务,并从这里连接一切。这将帮助您简化启动过程。别忘了编写代码注释,因为它们现在对某些组件来说是必要的,这样人们可以轻松找到服务定义。