drift/server

基于 ReactPHP 的 DriftPHP 服务器

0.1.30 2023-11-14 15:50 UTC

README

CircleCI

本软件包提供了一个基于 ReactPHP 的异步、反应式和非阻塞服务器,适用于在 ReactPHP Promises 和 PSR 标准之上运行的 PHP 应用程序。服务器具有针对多个领域实现优化的内核/应用程序抽象的小型内核。以下是一些功能。

  • 基于 Promise 处理请求
  • 以非阻塞方式提供静态内容
  • 压缩响应和流数据
  • 与不同的工作者协同工作,使用多个 PHP 线程(和 CPU)
  • 可视化使用情况并检查请求处理的速度和效率
  • 使用 PHP-Watcher(只有当 PHP-Watcher 包含在您的 composer 中时才可用)来自动更新服务器,如果您更改了某些代码

默认情况下,服务器将使用 DriftPHP 内核适配器,但您可以在启动服务器时轻松更改适配器(请参阅适配器章节)

目录

安装

您可以通过在 composer.json 文件中添加依赖项来安装服务器

"require": {
    "drift/server": "^0.1"
}

启动服务器

本软件包提供了一个基于 ReactPHP 包和 Promise 实现的异步服务器,用于 DriftPHP 框架。服务器附带所有基于 Symfony 的内核适配器,并可以轻松扩展以进行新的内核修改。

要启动服务器,只需键入此行。您可能的项目有一个自定义的 bin 文件夹,请检查它。

php vendor/bin/server run 0.0.0.0:8000

您也可以使用简短模式,只定义端口并假设此主机 0.0.0.0

php vendor/bin/server run 8000

就这样。您将拥有一个适用于应用程序的完整服务器。

构建您的适配器

为了构建您的适配器,您只需要创建一个 Drift\Server\Adapter\KernelAdapter 接口的实现。这一层将允许服务器启动您的应用程序、处理每个请求、定位您的静态资源以及关闭应用程序。此外,ObservableKernel 还将提供有关您的代码位置的信息,特别是为监视器功能而设计的。

/**
 * Class KernelAdapter.
 */
interface KernelAdapter extends ObservableKernel
{
    /**
     * @param LoopInterface            $loop
     * @param string                   $rootPath
     * @param ServerContext            $serverContext
     * @param OutputPrinter            $outputPrinter
     * @param MimeTypeChecker          $mimeTypeChecker
     * @param FilesystemInterface|null $filesystem
     *
     * @return PromiseInterface<self>
     *
     * @throws KernelException
     */
    public static function create(
        LoopInterface $loop,
        string $rootPath,
        ServerContext $serverContext,
        OutputPrinter $outputPrinter,
        MimeTypeChecker $mimeTypeChecker,
        ?FilesystemInterface $filesystem
    ): PromiseInterface;

    /**
     * @param ServerRequestInterface $request
     *
     * @return PromiseInterface<ResponseInterface>
     */
    public function handle(ServerRequestInterface $request): PromiseInterface;

    /**
     * Get static folder.
     *
     * @return string|null
     */
    public static function getStaticFolder(): ? string;

    /**
     * @return PromiseInterface
     */
    public function shutDown(): PromiseInterface;
}

当您创建了适配器后,启动服务从您的应用程序开始就像这样简单

php vendor/bin/server run 0.0.0.0:8000 --adapter='My\Namespace\Adapter"

自定义响应输出

您可以使用内部 x-server-message 标头来使用自定义服务器消息。服务器将在返回响应内容之前删除此服务器值。

工作者

默认情况下,此服务器创建单个工作者。一个使用单个 CPU 的简单 PHP 线程。幸运的是,此服务器提供了一个简单的方法来创建多个实例,监听同一端口,在 N 个线程之间模拟简单的平衡器。

php vendor/bin/server run 0.0.0.0:8000 --workers=8

您可以使用值 -1 来猜测您的宿主机的物理线程数。默认情况下,将使用单个工作者。

此功能不是为生产环境设计的,也不打算用于生产环境。我们鼓励您在需要在不同进程之间进行平衡时使用反向代理或小型平衡器。此外,此功能使用 pcntl_fork,因此如文档所述,它不可用于 Windows 用户。

监视器

您可以通过在 composer 中安装 seregazhuk/php-watcher 依赖项来使用监视器。

"require-dev": {
    "seregazhuk/php-watcher": "*"
}

安装依赖项后,您将能够通过检查代码更改来启动您的服务器。

php vendor/bin/server watch 0.0.0.0:8000

此功能仅用于开发。

静态服务器

此服务器可以同时提供位于您项目中的静态文件。默认情况下,适配器将提供静态文件应找到的路径(例如,DriftPHP的静态文件位于public/文件夹下),但您可以覆盖此值,甚至替换它。

php vendor/bin/server watch 0.0.0.0:8000 --static-folder=/my/own/folder/
php vendor/bin/server watch 0.0.0.0:8000 --no-static-folder

如果您需要,还可以创建别名。如果您想要用外部路径掩盖内部路径,只暴露第二个路径,这将很有用。这两个值必须由符号:分隔,第一部分是别名,第二部分是内部路径。

php vendor/bin/server watch 0.0.0.0:8000 --static-folder=/public/:/internal/public/path

在这个例子中,位于/internal/public/path/文件夹下的一个名为app.js的文件将在http://localhost:8000/public/app.js处可访问。默认情况下,此功能是禁用的。

静态服务器缓存

您可以通过在任何位置添加一个YAML文件并启动服务器时引用它来定义您的静态文件夹缓存。

php vendor/bin/server watch 0.0.0.0:8000 --static-cache=/my/path/static.cache.yml

在此文件中,您可以定义所有静态资源(实际上不仅仅是缓存)的特定标题。您还可以定义用于匹配它们的正则表达式。

/public/js/.*:
  Cache-Control: max-age=31536000
/public/css/app.js:
  Content-Type: application/javascript
/public/images/logo.png:
  Other-Header: Other-Value

默认情况下,此功能是禁用的,不会将任何额外标题添加到您的静态资源中。

重要

默认情况下,此包不会安装react/filesystem包。这意味着,如果您没有在项目中手动安装它,所有磁盘操作都将阻塞。这些同步执行的操作将更快、更有效,但使用大文件可能会减慢整个流程。

Symfony 桥接

为了帮助您从Symfony迁移到DriftPHP,假设这意味着您的整个领域都应该在Promise的基础上运行,包括您的基础设施层,此服务器附带了一个小的Symfony适配器。将其用作工具,切勿在生产环境中使用(在阻塞应用程序中使用基于ReactPHP的服务器在性能和服务可用性方面绝对不可取)。该适配器将帮助您从一种平台迁移到另一种平台,因为它允许此服务器与您的Symfony内核一起工作。

php vendor/bin/server watch 0.0.0.0:8000 --adapter=symfony

DriftPHP 资源

一些为您提供的初步步骤!