alterrabr/comet

现代PHP框架,用于构建快速REST API和微服务

dev-master 2024-04-30 08:33 UTC

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 这样的端口。