alterrabr / comet
现代PHP框架,用于构建快速REST API和微服务
Requires
- ext-json: *
- rakit/validation: ^1.4
- slim/slim: ^4.10
- workerman/workerman: ^4.1
Conflicts
- psr/http-message: <2
This package is auto-updated.
Last update: 2024-09-30 09:29:24 UTC
README
Comet
Comet是一个现代PHP框架,用于构建快速的REST API、CRUDs、管理面板和微服务。
Comet v2的新功能
- 性能改进 - 比第一版快20-30%!
- 内嵌安全Web服务器,用于提供静态内容,如图片、CSS样式和JS脚本
- 扩展会话支持,用于复杂的认证和授权服务
- 无需额外操作即可与全功能Auth库无缝集成
强大的功能
- 速度极快,每秒可处理100K个HTTP请求,在通用云硬件上的延迟约为0.1毫秒
- 真正的跨平台,在Linux、MacOS和Windows 7/10上运行流畅
- 内嵌Web服务器,用于提供静态内容,如CSS/JS和图片
- 与全功能认证库Comet\Auth集成,用于用户管理
- 内嵌验证和测试功能,可轻松创建健壮的软件
- 基于Guzzle、SlimPHP和Workerman的成熟组件
- 可通过Composer扩展:使用您选择的ORM和模板引擎(推荐使用Eloquent和Twig)
- 遵循PSR规范,具有所有PSR-7接口的原生实现和PHP会话抽象
- 具有自己的高效HTTP客户端,具有简单的编程接口
站在巨人的肩膀上
Comet结合了Slim PHP、Guzzle和Workerman的所有超级功能,并加入了自身的魔法,实现了10倍的速度提升。
Slim是一个微框架,有助于基于现代PSR标准编写Web应用程序和API。
Guzzle是一组PHP组件,用于与HTTP/1.1和HTTP/2服务一起工作。
Workerman是一个异步事件驱动框架,用于构建快速和可扩展的网络应用程序。
Comet允许您原生使用Slim框架的所有类和方法:https://slim.php.ac.cn/docs/v4/
性能
PHP常因其低吞吐量和高延迟而受到批评。但现代框架并不一定如此。让我们看看Comet是如何超越其他框架的。
在1000个并发连接下,对无ORM的框架的基准测试
如您所见,正确的架构使其在Symfony和其他流行框架上具有十倍的优势。
延迟
从API获取响应所需的时间往往比整体服务吞吐量更重要。这正是Comet真正闪耀的地方!
在一系列串行Web请求下,流行PHP框架的最小版本的响应延迟
Comet为典型场景提供亚毫秒级延迟。即使在千个并发连接的巨大压力下,它也能与编译平台(如Go和Java)的框架竞争。
太好了,太好了?
您可以在自己的机器上运行所有基准测试,以确保图表不是骗局:https://github.com/gotzmann/benchmarks
基础知识
安装
建议您使用Composer来安装Comet。
$ composer require gotzmann/comet
这将安装框架本身以及所有必需的依赖项。Comet需要PHP 7.2或更高版本。
Hello Comet
在项目根目录创建一个名为 app.php 的单个文件,内容如下
<?php require_once __DIR__ . '/vendor/autoload.php'; $app = new Comet\Comet(); $app->get('/hello', function ($request, $response) { return $response ->with("Hello, Comet!"); }); $app->run();
从命令行启动它
$ php app.php start
然后打开浏览器,输入默认地址 https:// - 你将看到来自 Comet 的问候!
简单的 JSON 响应
让我们开始一个监听自定义主机:端口的 Comet 服务器,并返回 JSON 有效负载。
<?php require_once __DIR__ . '/vendor/autoload.php'; $app = new Comet\Comet([ 'host' => '127.0.0.1', 'port' => 8080, ]); $app->get('/json', function ($request, $response) { $data = [ "message" => "Hello, Comet!" ]; return $response ->with($data); }); $app->run();
启动浏览器或 Postman,查看 GET 请求的 JSON 响应 http://127.0.0.1:8080
授权、身份验证、ACL 和用户管理
有一个功能齐全的 Comet/Auth 库,它允许你创建安全的、复杂的用户注册、电子邮件检查、密码管理、基于角色的访问等场景。
请参考相应文档了解如何在你的项目中使用 Comet\Auth。
验证
Comet 验证引擎基于干净而强大的 Rakit Validation 库。
要开始在项目中使用 Comet 验证,指定 use 语句
use Comet\Validator;
你可以使用预定义和用户定义的规则、自定义错误消息和控制逻辑来处理错误。看看这个例子
$payload = (string) $request->getBody(); // Prior to 7.3 PHP does not support RFC3339_EXTENDED (milliseconds are broken) $version = explode('.', PHP_VERSION); $dateFormat = ($version[0] == 7 && $version[1] >= 3) ? \DateTime::RFC3339_EXTENDED : "Y-m-d?H:i:s.???P"; $rules = [ 'paymentOrderId' => 'required', 'customerId' => 'required|uuid', 'clientKey' => 'required|alpha_dash', 'paymentDate' => 'required|date:' . $dateFormat, ]; $messages = [ 'required' => 'field is required', 'alpha_num' => 'only alphabet and digits allowed', 'alpha_dash' => 'only alphabet chars, digits and dashes are allowed', 'uuid' => 'UUID is wrong', 'date' => 'should be RFC3339 date', ]; $validator = new Validator; $validation = $validator->validate($payload, $rules, $messages); if (count($validation->getErrors())) { return $response ->with($validation->getErrors(), 400); }
请参考有关 Rakit Validation 的文档,了解更多关于可用规则和可能性的信息。
高级主题
PSR-4 和自动加载
在继续复杂的示例之前,请确保你的 composer.json 包含如下 "autoload" 部分
{ "require": { "gotzmann/comet": "^1.0", }, "autoload": { "psr-4": { "App\\": "src/" } } }
如果没有,你应该添加上述部分,并使用以下命令更新所有供应商包和自动加载逻辑
$ composer update
控制器
创建 src/Controllers/SimpleController.php
<?php declare(strict_types=1); namespace App\Controllers; use Comet\Request; use Comet\Response; class SimpleController { private static $counter = 0; public function getCounter(Request $request, Response $response, $args) { $response->getBody()->write(self::$counter); return $response->withStatus(200); } public function setCounter(Request $request, Response $response, $args) { $body = (string) $request->getBody(); $json = json_decode($body); if (!$json) { return $response->withStatus(500); } self::$counter = $json->counter; return $response; } }
然后在项目根目录创建 Comet 服务器 app.php
<?php declare(strict_types=1); use Comet\Comet; use App\Controllers\SimpleController; require_once __DIR__ . '/vendor/autoload.php'; $app = new Comet([ 'host' => 'localhost', 'port' => 8080, ]); $app->setBasePath("/api/v1"); $app->get('/counter', 'App\Controllers\SimpleController:getCounter'); $app->post('/counter', 'App\Controllers\SimpleController:setCounter'); $app->run();
现在你已准备好使用 API GET 端点获取计数器值。注意 URL 的 '/api/v1' 前缀
GET https://:8080/api/v1/counter
你可以通过 POST 方法发送 JSON 请求来更改计数器
POST https://:8080/api/v1/counter,请求体为 { "counter": 100 },并且带有 'application/json' 头部。
任何带有格式不正确的请求体的调用都将按控制器中定义的返回 HTTP 500 状态码。
部署
调试和日志记录
Comet 允许你在屏幕控制台上调试应用程序,显示错误和警告。当你将服务移动到生产环境时,最好使用文件日志。下面的代码片段展示了如何使用流行的 Monolog 库启用屏幕调试和日志记录
<?php declare(strict_types=1); use Comet\Comet; use Monolog\Logger; use Monolog\Handler\StreamHandler; use Monolog\Formatter\LineFormatter; require_once __DIR__ . '/vendor/autoload.php'; $formatter = new LineFormatter("\n%datetime% >> %channel%:%level_name% >> %message%", "Y-m-d H:i:s"); $stream = new StreamHandler(__DIR__ . '/log/app.log', Logger::INFO); $stream->setFormatter($formatter); $logger = new Logger('app'); $logger->pushHandler($stream); $app = new Comet([ 'debug' => true, 'logger' => $logger, ]); $app->run();
Docker
请参阅此存储库中的 Dockerfile 作为创建你自己的应用程序图像和容器的起点。
Nginx
如果你想要使用 Nginx 作为你的 Comet 应用程序的逆向代理或负载均衡器,请在 nginx.conf 中插入以下行
http {
upstream app {
server http://path.to.your.app:port;
}
server {
listen 80;
location / {
proxy_pass http://app;
proxy_redirect off;
}
}
}
常见问题解答
在 Ubuntu 上尝试启动 Comet 时遇到错误 stream_socket_server(): unable to connect to tcp://0.0.0.0:80 (Permission denied)
?
Comet 需要以 root 权限运行才能绑定到 80 或任何小于 1000 的端口。所以你可以使用 sudo 启动,或者直接使用 8080 这样的端口。