# 项目简介
# 框架介绍 WoW
HerosPHP 是一套基于Workerman 开发的超小内核,超高性能,极易上手的 PHP 应用开发框架。内核代码只有 200K,单进程的 RPS 达到 8 万多,真正做到了操作简单,性能可靠。
# 项目命名
为什么叫 heros(英雄)php?
- 它是我学习的第一门编程语言,是带我走上软件工程师生涯领路英雄。
- 在整个 Web 开发行业处于青黄不接的时候,PHP 像英雄一样横空出世,拯救了一大批的企业和码农。
- 这是一个组合词:高速引擎(Hyperspeed Engine) + 可靠(Reliable) + 面向对象(Object Oriented),好吧,这一点其实是牵强附会的啦,起名的时候压根就没有想这些...
# 为什么要造这个轮子?
PHP是世界上最好的编程语言,没有之一。 这句话虽然是一个梗但是他却代表了 PHP 这门语言在编程语言中的江湖地位。 既然是最好的语言,那么免不了就会出现各种各样的框架啦,包括 PHP 官方的 ZendFrame, Laravel,Yii,包括国产的ThinkPHP,ci等框架。
那既然有这么多框架,为什么我们还要造这个轮子呢?原因有以下几点:
- 最初是基于教学的目的,这个项目脱胎于本人做 PHP 培训的时候给学员演示 Web 框架开发的学习项目,后面经过一系列完善成现在这个样子。
- 当时开源的 PHP 框架要么就过于重量级,像ZendFrame,ThinkPHP那样太过于臃肿,学习成本太高,要么就是扩展性和或性能达不到要求,使用起来不那么方便。
- 大部分 PHP 开源框架都是为了兼容高中低端各种用户而牺牲了框架本身的性能和特性,这显然没有办法完全满足公司的全部需求,而个人觉得修改大型框架是一件很痛苦的事情,跟自己开发的成本差不多。这估计也是很多大点的公司都有自己的框架的原因了。
# 设计思想
我们认为好的开发框架应该是方便,快捷,优雅,干净的,我们一直坚持:一个体验良好的工具应该是操作简单的,同时又是性能可靠的 的原则。 我们希望框架既能封装良好,降低开发者学习成本,同时又不损失系统性能,既能快速搭建系统又能保持良好的扩展性,目前我们最新的版本已经基本做到这一点。
严格遵循约定优于配置的设计原则,一个问题只保留一种你能够实现的最优解决方案 如非必要不给用户提供选择配置,直接按照最优配置实现,尤其是是4.0.0之后,这个原则会更加明显,我们认为配置太多只会是系统越来越臃肿,执行效率越来越低。
坚持 最小框架内核 原则,框架只实现最基本的功能,我们对增加功能始终保持极度克制的态度,这也符合"英雄"的本色,英雄只求单点突破,做到极致,将军追求面面俱到,面面俱到的结果就是自身越来越臃肿,难免"屠龙少年成为恶龙"的命运。因此,herosphp 的附加功能(比如文件上传,ORM,中间件等)都通过
composer
组件来实现,按需引入。像其他框架一样,我们也会提供redis(缓存),Annotation(注解),files(文件处理),session(会话),middleware (中间件) 等开发过程中常用的工具的功能,跟其他框架不一样的是,我们还提供 Bean 容器托管和自动依赖注入...
HerosPHP 的特性
- 框架的原理简单易懂,使用和学习的成本低,想要二开也非常容易上手。
- 使用注解的方式实现路由,提供 Bean 容器,实现服务的自动注入,如丝般顺滑,提升开发效率。
- 良好的设计架构,保持性能强悍的同时,兼具良好的扩展性。
- 代码风格简洁漂亮,程序精简(内核代码不到 200K),注释详细,适合新手研究学习。
# 项目地址
如果觉得项目还不错,不要吝啬你的小星星哦 O(∩_∩)O~
# 压测数据
测试服务器的配置
- CPU: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
- RAM: 4 GiB
- 操作系统: Ubuntu-22.04 LTS Desktop
首先我们使用 herosphp 创建一个 demo 应用,并启动:
composer create-project herosphp/app demo
# 启动 Web 应用
cd demo
php web start
app 的默认配置(configs/app.config.php
)如下:
{
'server' => [
'name' => 'WebApp',
'listen' => 'http://0.0.0.0:2345',
'max_package_size' => 10, // 最大请求包,单位 MiB
'context' => [],
'worker_count' => 4, // 启用 4 个进程
'reloadable' => true,
'reusePort' => true,
]
}
控制器返回一个 JSON 数据,随机生成一个 20 位的 token:
#[Get(uri: '/bench')]
public function bench()
{
return $this->json(['token' => StringUtil::genRandomStr(20)]);
}
使用 apache bench
测试工具:
# 开启 20 个进程,访问 100 万次
ab -n 1000000 -c 20 -k http://localhost:2345/bench
实测结果如下,RPS 稳定在:31.5 万左右:
...
Concurrency Level: 20
Time taken for tests: 3.182 seconds
Complete requests: 1000000
Failed requests: 0
Keep-Alive requests: 1000000
Total transferred: 176000000 bytes
HTML transferred: 32000000 bytes
Requests per second: 314315.17 [#/sec] (mean)
Time per request: 0.064 [ms] (mean)
Time per request: 0.003 [ms] (mean, across all concurrent requests)
Transfer rate: 54022.92 [Kbytes/sec] received
...
每个进程的内存消耗在 1.67 MiB 左右:
Workerman version:4.1.1 PHP version:8.1.2
start time:2022-09-23 11:54:29 run 0 days 0 hours
load average: 0.96, 0.74, 0.7 event-loop:\Workerman\Events\Select
2 workers 5 processes
worker_name exit_status exit_count
FileMonitor 0 0
WebApp 0 0
----------------------------------------------PROCESS STATUS---------------------------------------------------
pid memory listening worker_name connections send_fail timers total_request qps status
28504 1.19M none FileMonitor 0 0 1 0 0 [idle]
28505 1.67M http://0.0.0.0:2345 WebApp 0 0 0 1694293 0 [idle]
28506 1.68M http://0.0.0.0:2345 WebApp 0 0 0 1775963 0 [idle]
28507 1.67M http://0.0.0.0:2345 WebApp 0 0 0 1722861 0 [idle]
28508 1.67M http://0.0.0.0:2345 WebApp 0 0 0 1806883 0 [idle]
----------------------------------------------PROCESS STATUS---------------------------------------------------
Summary 5M - - 0 0 1 7000000 0 [Summary]
TIP
Event扩展不是必须的,当业务需要支撑大于1000的并发连接时,推荐安装Event,能够支持巨大的并发连接。如果业务并发连接比较低,例如1000以下并发连接,则可以不用安装。
快速开始 →