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 应用程序最快的方法之一(请参阅下面的独立研究)。
其设计旨在承受高负载的同时,仍然 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
RoadRunner
这个是go对外暴露,然后路由后端多个常驻内存的php进程,通过rpc通信搭建的一套服务吗。感觉依赖有点多,个人物理机的话不太好做热更。
看完了,我对nginx-unit 产生了兴趣。觉得可以尝试下那个了。