cclilshy/p-ripple-core

v0.5.4 2024-09-14 06:21 UTC

This package is auto-updated.

Last update: 2024-09-26 17:04:54 UTC


README

Logo

Build Status Download statistics Stable version License

Ripple 是一个现代、高性能的原生 PHP 协程引擎,旨在解决 PHP 在高并发、复杂网络通信和数据操作方面的挑战。该引擎采用创新的架构和高效的编程模型,为现代 Web 和 Web 应用程序提供强大的后端支持。通过使用 Ripple,您将体验到从系统全局视角管理任务以及高效处理网络流量和数据的优势。

设计理念

极致性能并非我们的首要目标

正是 Event 机制赋予了 PHP 火箭般的性能,我们提供了最佳实践的 Event

随着 PHP8 的推出,更轻量级的 Fiber 替换了 Generator 协程模型,

我们的设计理念可以通过 PHP 启动过程实现。同时,我们使用 revolt 作为 Ripple 的底层驱动库,使 Ripple 与原始 PHP 生态系统完美兼容。

完全解放 PHP 开发者的双手,无缝拥抱 PHP 协程的新时代

安装

composer require cclilshy/p-ripple-core

基本用法

Ripple 严格遵守最新的强类型编程标准,对 IDE 非常友好。以下复现过程在任何 IDE 中都得到完美支持和解释

最新文档

您可以通过访问 Ripple 的 文档 开始阅读

我们建议您从 手动安装 开始,以更好地理解 Ripple 的工作流程

如果您想快速部署和使用 Ripple 的服务,可以直接访问 快速部署

协程

通过 Co 类的 async 方法创建协程,并通过 Co 类的 sleep 方法模拟 IO 操作

\Co\async(static function (){
    \Co\sleep(1);
    
    echo 'Coroutine 1' , PHP_EOL;
});

\Co\async(static function (){
    \Co\sleep(1);
    
    echo 'Coroutine 2' , PHP_EOL;
});

\Co\async(static function (){
    \Co\sleep(1);
    
    echo 'Coroutine 3' , PHP_EOL;
});

\Co\sleep(2); // Wait for all coroutines to complete execution

HTTP 客户端

通过 Guzzle 创建 HTTP 协程客户端,完美支持代理、重定向、超时、上传和下载等功能

use GuzzleHttp\Exception\GuzzleException;
use Psc\Utils\Output;

$client = Co\Plugin::Guzzle()->newClient();

for ($i = 0; $i < 10; $i++) {
    \Co\async(static function (){
        try {
            $response = $client->get('https://www.google.com/');
            echo $response->getStatusCode(), \PHP_EOL;
        } catch (GuzzleException $e) {
            Output::exception($e);
        }
    });
}

\Co\wait();

HTTP 客户端 - 使用 SSE 进行 AI 开发

以阿里云百川为例,通过 SSE 获取 AI 生成的文本非常简单。

use GuzzleHttp\Exception\GuzzleException;
use Psc\Core\Http\Client\Capture\ServerSentEvents;

if (!$key = $argv[1] ?? null) {
    echo 'Please enter the key' .\PHP_EOL;
    exit(1);
}

//Create interceptor
$sse = new ServerSentEvents();
$sse->onEvent(function ($event) {
    \var_dump($event);
});

// Refer to the documentation and ask questions
$client = Co\Plugin::Guzzle()->newClient();
$header = [];
$header['Content-Type'] = 'application/json';
$header['Accept'] = 'text/event-stream';
$header['Authorization'] = 'Bearer ' . $key;
$body = [
    'model' => 'qwen-max',
    'input' => [
        'messages' => [
            ['role' => 'system', 'content' => 'Your name is ripple knowledge base'],
            ['role' => 'user', 'content' => 'Who are you?'],
        ],
    ],
];

try {
    $response = $client->post('https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation', [
        'headers' => $header,
        'body' => \json_encode($body, \JSON_UNESCAPED_UNICODE),

        'timeout' => 10,

        //Injection interceptor
        'capture_write' => $sse->getWriteCapture(),
        'capture_read' => $sse->getReadCapture(),
    ]);
} catch (GuzzleException $e) {
    echo $e->getMessage();
}

HTTP 服务器

通过 Co\Net 创建 HTTP 协程服务器,并通过 Co\NetonRequest 方法处理请求

use Psc\Core\Http\Server\Chunk;
use Psc\Core\Http\Server\Request;
use Psc\Core\Http\Server\Response;

$server = Co\Net::Http()->server('http://127.0.0.1:8008', \stream_context_create([
    'socket' => [
        'so_reuseport' => true,
        'so_reuseaddr' => true,
    ]
]));

$server->onRequest(static function (Request $request, Response $response) {
    switch (\trim($request->getRequestUri(), '/')) {
        case 'sse':
            $response->headers->set('Transfer-Encoding', 'chunked');
            $generator = static function () {
                foreach (\range(1, 10) as $i) {
                    Co\sleep(0.1);
                    yield Chunk::event('message', \json_encode(['id' => $i, 'content' => 'content']));
                }
                yield '';
            };
            $response->setContent($generator());
            $response->respond();
            break;
        default:
            $response->setContent('Hello, World!')->respond();
            break;
    }
});

$server->listen();

Co\wait();

更多

想了解 WebSocket 服务器和客户端、TCP 服务器和客户端、UDP 服务器和客户端、Unix 服务器和客户端等...

您可以通过访问 Ripple 的 文档 开始阅读

附录

适用组件库

我们允许用户自行选择适用组件库。所有组件均可按文档所述使用,无需额外配置。

🚀 Guzzle PHP 最广泛使用的 HTTP 客户端

🔥AmPHP 为用户提供丰富的 PHP 异步组件,可自行封装

🟢PDrive 官方高性能驱动库,提供无缝访问传统应用程序

🟢Ripple 提供标准协程架构和工具,用于快速开发或打包传统应用程序

事件库指南

Ev 扩展安装

pecl install ev

特别感谢

Jetbrains 为此项目提供免费开发工具

联系方式

邮箱 jingnigg@gmail.com