RoadRunner: 使用 Golang 编写的 PHP 加速引擎

RoadRunner PHP是一个新兴的应用服务器,用Golang编写。软件配置为Go的HTTP处理程序在HTTP请求之前,作为负载均衡器/进程管理器将请求分配给PHP的Worker。RoadRunner的作者Spiral Scout在realized说,Golang的威力可以在开发中体现,增强现有的PHP应用也是有可能的。这似乎是一个发展的机会。而除了常规的HTTP服务器外,Roadrunner实现的gRPC servers也展示PHP的新潜力。

该软件速度闪电,稳定性强,性能强大。它的一些功能包括:

  • 生产就绪:RoadRunner不仅是多年规划、测试和编码的产品,目前还用于不断经历重载的大型企业级项目。您现在就可以在您的应用程序中安装它并在生产中运行它。
  • 高性能:它将利用Golang的Goroutines和多线程来加快处理速度,同时降低实际服务器负载,从而最大限度地提高您的应用程序的性能。这将提升性能并显著减少开发资源。
  • 无需扩展:无需自定义构建或安装扩展即可使Roadrunner PHP正常工作。任何使用PHP7或更高版本的应用程序都将在几秒钟内与RoadRunner无缝集成。
  • HTTP中间件:在RoadRunner中创建自定义HTTP中间件,在应用程序到达PHP之前处理特定用例的繁重工作,如限速和JWT解析!
  • 日志记录和报告:使用RoadRunner的内部事件系统收集和管理应用程序日志,监控性能,并处理致命错误。
  • AWS Lambda:将Roadrunner二进制文件与您的PHP Lambda函数一起提供,通过在多个上下文中重用您的PHP应用程序的部分来大幅提高性能。
  • 任何库:使用我们的GORIDGE RPC协议将现有的任何Golang库与您的PHP应用程序集成。
  • grpc:使用PHP-GRPC实现高性能的grpc您应用的API。
  • Queue:实现RoadRunner的Spiral/Jobs包,让Roadrunner作为支持内存队列的队列消费者,AMQP、Amazon SQS和Beanstalk。

应用性能

RoadRunner PHP 是运行 PHP 应用程序最快的方法之一(请参阅下面的独立研究)。

Roadrunner PHP

其设计旨在承受高负载的同时,仍然 100% 可用。

Roadrunner PHP 的使用

要开始使用 RoadRunner,你可以下载预编译的二进制文件或使用 Go 来构建它。最简单的方法是运行一个 docker 实例:

FROM php:7.2-cli

RUN apt-get update && apt-get install -y --no-install-recommends \
  wget \
  git \
  vim \
  zlib1g-dev \
  unzip

# Install Go
RUN wget -O - https://dl.google.com/go/go1.11.4.linux-amd64.tar.gz | tar -C /usr/local -xzf -
ENV PATH $PATH:/usr/local/go/bin
ENV GO111MODULE on

# Install RoadRunner
WORKDIR /go/src
RUN git clone --depth 1 https://github.com/spiral/roadrunner \
  && cd /go/src/roadrunner \
  && make \
  && make install
COPY ./.rr.yaml /etc/roadrunner/.rr.yaml

# Install PHP Extensions
RUN docker-php-ext-install zip \
  && docker-php-ext-install opcache \
  && docker-php-ext-enable opcache

# Install Composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
  && php -r "if (hash_file('SHA384', 'composer-setup.php') === rtrim(file_get_contents('https://composer.github.io/installer.sig'))) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
  && php composer-setup.php \
  && php -r "unlink('composer-setup.php');" \
  && mv composer.phar /usr/local/bin/composer

WORKDIR /var/www

ENTRYPOINT ["/usr/local/bin/rr", "serve", "-c", "/etc/roadrunner/.rr.yaml"]

它基于php的镜像,但我也包含了用于Roadrunner的GO 1.11。

您可以通过克隆以下Git仓库,通过docker-compose轻松启动环境。

$ git clone https://github.com/n1215/roadrunner-docker-skeleton

在 RoadrRunner 的配置文件中, 也指定了一个PHP脚本作为入口文件:

http:
  address: :8080
  workers:
    command: "php /var/www/app/psr-worker.php"
    pool:
      numWorkers: 4

最后,这个文件的基本操作是处理PSR-7请求和返回PSR-7响应:

<?php
declare(strict_types=1);

ini_set('display_errors', 'stderr');
include 'vendor/autoload.php';

$relay = new Spiral\Goridge\StreamRelay(STDIN, STDOUT);
$psr7 = new Spiral\RoadRunner\PSR7Client(new Spiral\RoadRunner\Worker($relay));

while ($req = $psr7->acceptRequest()) {
    try {
        $resp = new \Zend\Diactoros\Response();
        $resp->getBody()->write('Hello, world!');
        $psr7->respond($resp);
    } catch (\Throwable $e) {
        $psr7->getWorker()->error((string)$e);
    }
}

文档 中可以找到更多的信息,请点击 此处 下载。 在 MIT 许可下发布。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://phpmagazine.net/2019/05/roadrunn...

译文地址:https://learnku.com/php/t/61893

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 3

这个是go对外暴露,然后路由后端多个常驻内存的php进程,通过rpc通信搭建的一套服务吗。感觉依赖有点多,个人物理机的话不太好做热更。

2年前 评论

看完了,我对nginx-unit 产生了兴趣。觉得可以尝试下那个了。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!