共振
关于共振
共振是从零开始设计的,旨在促进基础设施内部及更广泛范围内服务之间的互操作性和消息传递。它提供AI功能,内置网络服务器,并集成了llama.cpp。
充分利用PHP的异步特性。基于Swoole构建。
为什么选择共振?
可预测的性能
共振的设计优先考虑:无内存泄漏、无阻塞操作和无垃圾收集器带来的意外。
大部分内部结构是只读和无状态的。应用程序启动后,不会干扰JIT和操作码(反射仅在应用程序启动期间使用),因此在运行时不会出现意外的性能下降。
有主见的
所有底层库都经过彻底测试,确保它们能够正确协同工作,相互补充,并在异步环境中完美运行。
例如,共振实现了自定义的Doctrine驱动,因此它使用Swoole的连接池。
解决输入/输出问题
共振旨在处理IO密集型任务,如提供机器学习模型服务、处理WebSocket连接和处理长时间运行的HTTP请求。
它将现代应用程序视为一组异步通信的服务混合体,包括AI补全和机器学习推理,因此提供了一套工具,使这种通信尽可能简单。
完整的软件包
共振包含构建现代Web应用程序所需的一切,从HTTP服务器到AI功能。
它提供安全特性、HTML模板、与开源LLM的集成,并提供服务机器学习模型的能力。
文档
https://resonance.distantmagic.com/
安装
最佳的安装方法是使用Composer的create-project命令:
composer create-project distantmagic/resonance-project my-project
共振要求PHP最低版本为8.2,并需要Data Structures和Swoole扩展。在我们的安装指南中可以了解更多关于必需和推荐扩展的信息,以及其他安装方法。
首次使用
安装项目后,您需要创建一个config.ini
文件(提供了config.ini.example
),然后使用bin/resonance.php
作为入口点。
运行服务器
php bin/resonance.php serve
启动内置的HTTP服务器。如果需要,您可以生成本地开发用SSL证书。
特性
与开源LLM聊天
创建提示控制器直接回答用户的提示。
LLM负责确定用户的意图,您可以专注于采取适当的行动。
#[RespondsToPromptSubject(
action: 'adopt',
subject: 'cat',
)]
#[Singleton(collection: SingletonCollection::PromptSubjectResponder)]
readonly class CatAdopt implements PromptSubjectResponderInterface
{
public function respondToPromptSubject(PromptSubjectRequest $request, PromptSubjectResponse $response): void
{
// 通过WebSocket传输消息...
$response->write("给你:\n\n");
$response->write(" |\_._/|\n");
$response->write(" | o o |\n");
$response->write(" ( T )\n");
$response->write(" .^`-^-`^.\n");
$response->write(" `. ; .`\n");
$response->write(" | | | | |\n");
$response->write(" ((_((|))_))\n");
$response->end();
}
}
关键之处异步化
以较小的开销异步响应传入的RPC或WebSocket消息(或两者结合)。
您可以使用属性设置所有异步功能。无需复杂的配置。
#[RespondsToWebSocketJsonRPC(JsonRPCMethod::Echo)]
#[Singleton(collection: SingletonCollection::WebSocketJsonRPCResponder)]
final readonly class EchoResponder extends WebSocketJsonJsonRPCResponder
{
public function getConstraint(): Constraint
{
return new StringConstraint();
}
public function onRequest(
WebSocketAuthResolution $webSocketAuthResolution,
WebSocketConnection $webSocketConnection,
RPCRequest $rpcRequest,
): void {
$webSocketConnection->push(new JsonRPCResponse(
$rpcRequest,
$rpcRequest->payload,
));
}
}
简单的事情保持简单
编写HTTP控制器与同步代码类似。
控制器具有新的令人兴奋的功能,充分利用了异步环境。
#[RespondsToHttp(
method: RequestMethod::GET,
pattern: '/',
)]
function Homepage(ServerRequestInterface $request, ResponseInterface $response): TwigTemplate
{
return new TwigTemplate('website/homepage.twig');
}
一致性是关键
无论项目规模如何,您都可以保持相同的软件编写方法。
没有不断增长的中央配置文件或服务依赖注册表。代码模块之间的每个关系都局限于这些模块。
#[ListensTo(HttpServerStarted::class)]
#[Singleton(collection: SingletonCollection::EventListener)]
final readonly class InitializeErrorReporting extends EventListener
{
public function handle(object $event): void
{
// ...
}
}
PHP中的Promise
共振提供了Promise/A+规范的部分实现,以处理各种异步任务。
$future1 = new SwooleFuture(function (int $value) {
assert($value === 1);
return $value + 2;
});
$future2 = $future1->then(new SwooleFuture(function (int $value) {
assert($value === 3);
return $value + 4;
}));
assert($future2->resolve(1)->result === 7);
内置GraphQL支持
您可以仅使用PHP属性构建复杂的GraphQL模式。
共振负责重用SQL查询并优化资源使用。
所有字段都可以异步解析。
#[GraphQLRootField(
name: 'blogPosts',
type: GraphQLRootFieldType::Query,
)]
#[Singleton(collection: SingletonCollection::GraphQLRootField)]
final readonly class Blog implements GraphQLFieldableInterface
{
public function __construct(
private DatabaseConnectionPoolRepository $connectionPool,
private BlogPostType $blogPostType,
) {}
public function resolve(): GraphQLReusableDatabaseQueryInterface
{
return new SelectBlogPosts($this->connectionPool);
}
public function toGraphQLField(): array
{
return [
'type' => new ListOfType($this->blogPostType),
'resolve' => $this->resolve(...),
];
}
}
教程
- 共振的'Hello, World'
- 基于会话的身份验证
- 构建基本的GraphQL模式
- 如何提供LLM补全(使用llama.cpp)?
- 如何使用llama.cpp创建LLM WebSocket聊天?
- 半脚本化对话应用
社区
您可以在这里找到官方渠道:
许可证
共振框架是根据MIT许可证开源的软件。