文档/启动应用程序/WebRotor

WebRotor

WebRotor 是一个 PHP 库,支持在共享主机上实现应用的异步执行。 众所周知,shared hosting 有许多使用限制,但这个专用程序甚至可以在共享主机上带来异步功能的所有优势。

WebRotor 的核心原理是,当应用接收到请求时,索引文件不会直接处理请求,而是将其发送到工作进程(workers),再接收返回的响应用于显示。 此外,工作进程实际上由同一个索引文件的代码实现。 这些工作进程是常见的类似 CRON 的进程,这些在几乎每个主机服务中都可以找到。 配置这些工作进程的区别仅在于主机服务管理面板的界面设计差异。

为了确保使用此技术启动的应用程序正常运行,必须开发支持异步模式。

在异步模式中,已加载的框架配置、类、初始化的服务和缓存的数据将被重用,从而显著加速性能。
但是,也存在一些特点,例如需要更加密切地监控内存泄漏并消除阻塞操作,许多熟悉的第三方库不支持异步模式。
在应用程序的逻辑部分存储状态变得不合适,尤其是当它与请求相关时。

框架的 RollbackInterface 旨在每次异步请求后重置状态

要使用 WebRotor,需要修改文件 /public_html/index.php(这是共享主机上索引文件的假定路径),以让 HLEB2 框架在循环中运行。 这是一个基本的工作示例:

<?php
// File /public_html/index.php

use Phphleb\Webrotor\Config;
use 
Phphleb\Webrotor\Src\Handler\NyholmPsr7Creator;
use 
Phphleb\Webrotor\WebRotor;
use 
Psr\Http\Message\ResponseInterface;
use 
Psr\Http\Message\ServerRequestInterface;

include 
__DIR__ "/../vendor/autoload.php";

$psr7Creator = new NyholmPsr7Creator(); // or GuzzlePsr7Creator()

$config = new Config();
$config->logLevel 'warning';
$config->workerNum 2// Must correspond to the number of workers
$config->workerLifetimeSec 120// Must correspond to the worker launch interval
$config->runtimeDirectory __DIR__ '/../storage/wr-runtime';
$config->logDirectory __DIR__ '/../storage/wr-logs';

$server = new WebRotor($config);
$server->init($psr7Creator);

// Framework initialization outside the loop.
$framework = new Hleb\HlebAsyncBootstrap(__DIR__);

$server->run(function(ServerRequestInterface $requestResponseInterface $response) use ($framework) {
    
$res $framework->load($request)->getResponse();

    
$response->getBody()->write($res->getBody());
    foreach(
$res->getHeaders() as $name => $header) {
        
$response $response->withHeader($name$header);
    }
    return 
$response->withStatus($res->getStatus());
});

此代码使用了 HTTP 客户端库 nyholm/psr7nyholm/psr7-server,需要额外安装。

为完成该配置,还需要在主机上启动 “workers”,这些实际上是主机服务提供的类似 CRON 的进程。 通常,它们在主机管理面板中配置,尽管界面可能不同,但原则相同。你需要以两分钟的间隔启动两个处理程序(如前述设置):

*/2 * * * * /usr/local/bin/php7.2 /my-project/public_html/index.php --id=1

*/2 * * * * /usr/local/bin/php7.2 /my-project/public_html/index.php --id=2

这两个进程的唯一区别是工作进程的ID编号。完成后,所有传入的应用请求会由两个异步工作进程处理。
更多细节请参考库文档:github.com/phphleb/webrotor

在本地开发中,可以不运行工作进程(workers),因为如果它们未运行或处于非激活状态,请求将以通常的方式处理。 这样,在本地可以使用常规的调试工具,例如 xDebug

共享主機 FrankenPHP

Страница создана: @fomiash
К началу страницы