subit/php-pm

PHP-PM 是一个 PHP 应用程序的过程管理器、加速器和负载均衡器。

此包的规范存储库似乎已不存在,因此该包已被冻结。

维护者

详细信息

github.com/subit-io/php-pm

来源

安装: 1,384

依赖项: 1

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 357

2.0.3 2020-01-02 20:10 UTC

This package is auto-updated.

Last update: 2020-12-25 22:13:17 UTC


README

11821812?v=3&s=200

PHP-PM 是一个 PHP 应用程序的过程管理器、加速器和负载均衡器。

Build Status Gitter

它基于 ReactPHP,与使用请求-响应框架(如 Symfony 的 HTTPKernel)的应用程序配合使用最佳。此方法是通过杀死 PHP 的昂贵引导(声明符号、加载/解析文件)和功能丰富的框架的引导来实现的。有关快速提示,请参阅性能部分。PHP-PM 基本上会启动几个 PHP 实例作为工作引导您的应用程序(例如整个 Symfony Kernel),并在内存中保持它以准备每个传入请求:这就是为什么 PHP-PM 让您的应用程序变得如此快速的原因。

更多信息可以在文章中找到: 将高性能带入您的 PHP 应用(使用 ReactPHP)

功能

  • 性能提升高达 15 倍(与 PHP-FPM、Symfony 应用程序相比)。
  • 集成负载均衡器。
  • 热代码重新加载(当 PHP 文件更改时)。
  • 静态文件服务,便于开发流程。
  • 支持 HttpKernel(Symfony/Laravel)、Drupal(实验性)、Zend(实验性)。

所有徽章

您的应用程序/库支持 PPM 吗?展示出来!

PPM Compatible

[![PPM Compatible](https://raw.githubusercontent.com/php-pm/ppm-badge/master/ppm-badge.png)](https://github.com/php-pm/php-pm)

使用

cd into/your-application

# run Symfony
docker run -v `pwd`:/var/www -p 8080:80 phppm/nginx --bootstrap=symfony --static-directory=web/

# run Laravel
docker run -v `pwd`:/var/www -p 8080:80 phppm/nginx --bootstrap=laravel --static-directory=public/

Docker 更易于设置和维护。如果您的应用程序需要额外的环境工具或库,您可以根据我们的图像构建自己的图像。有关更多信息,请参阅 github.com/php-pm/php-pm-docker

debug 启用时,PHP-PM 会检测文件更改并自动重启其工作进程。

无 Docker 使用

遵循 wiki 文章 无 Docker 使用

性能

为了获得最佳性能,您通常应使用 --app-env=prod 并禁用调试 --debug=0。同时确保禁用 xdebug。尝试使用不同数量的工作进程。通常比 CPU 核心计数多 10% 是好的。例如:如果您有 8 个真实核心(不包括超线程),则使用 --workers=9

为了获得更高的性能(用于静态文件服务或快速应用程序),请尝试不同的事件循环(请参阅 https://github.com/reactphp/event-loop)。

调试

如果您在应用程序中遇到奇怪的问题,并且您不知道它们来自哪里,请尝试仅使用一个工作进程 --workers=1 并启用 -v-vv

在调试时,您应该像平时一样使用 xdebug。如果您设置了断点并保持应用程序,则只有当您释放断点时才会停止一个工作进程。所有其他工作进程都是完全功能的。

XDebug 和 PHPStorm 注意事项:由于 php-pm 至少使用两个进程,因此也有两个 xdebug 实例。PHPStorm 默认配置为每次只接受一个连接。您需要增加这个数值。如果不增加这个数值,您的应用程序将无法正常使用 xdebug。

Xdebug and PHPStorm

在所有工作进程中,STDOUT 都被重定向到连接的客户端。因此请注意,var_dumpecho 在控制台上不会显示。STDERR 不会被重定向到客户端,而是重定向到控制台。因此,对于非常简单的调试,您可以使用 error_log('hi') 并在控制台上看到它。默认情况下,异常和错误仅在控制台上显示,并使用 Symfony/Debug 组件进行了美化。

适配器

Symfony/Laravel 的 HttpKernel - https://github.com/php-pm/php-pm-httpkernel

Zend - https://github.com/php-pm/php-pm-zend

CakePHP - https://github.com/CakeDC/cakephp-phppm

命令

ppm-help

ppm-start

Symfony

cd my-project
docker run -v `pwd`:/var/www -p 8080:80 phppm/nginx --static-directory=web/

Laravel

cd my-project
docker run -v `pwd`:/var/www -p 8080:80 phppm/nginx --bootstrap=laravel --static-directory=web/

Zend

cd my-project
docker run -v `pwd`:/var/www -p 8080:80 phppm/nginx --bootstrap=Zf2

Wordpress

对于所有的 WordPress 爱好者:由于缺乏请求-响应抽象,PPM 不会与 WordPress 一起工作。我们非常怀疑 WordPress 今后会兼容,因为它的架构是以一种使其在当前无法在一个应用程序进程中处理多个请求的方式编写的。

性能(每秒请求数)

6x4GHz Intel i7,16GB RAM。10个并发,1000个总请求:ab -c 10 -n 1000 http://127.0.0.1:8080/

Symfony,CMS 应用程序

ppm start --bootstrap=symfony --app-env=prod --logging=0 --debug=0 --workers=20

https://github.com/jarves/jarves

PHP 版本 在 Jarves 中动态 静态文件
7.0.3,StreamSelectLoop 2387,67 3944,52
5.6.18,StreamSelectLoop 1663,56 2636,09
5.6.18,LibEventLoop 1811,76 3441,72

Laravel,示例包

https://github.com/bestmomo/laravel5-example

ppm start --bootstrap=laravel --app-env=prod --debug=0 --logging=0 --workers=20

laravel.png

问题

  • 内存泄漏,内存泄漏,还有很多内存泄漏。您也会在您的应用程序中找到泄漏。 :) 但这不是大问题,因为工作进程会自动重启。
  • 与 ExtEventLoop 不兼容。(因此不要安装 php70-event,但您可以尝试 LibEventLoop php56-libevent
  • Drupal 和 Zend 非常实验性,并且不完全工作。请尝试使用 https://github.com/php-pm/php-pm-drupal
  • 由于需要在每次请求后重置一些内容,Laravel 的调试器尚未完全工作。
  • 流式响应尚未流式传输
  • 由于信号处理,不支持 Windows

请通过创建拉取请求来帮助我们修复这些问题。 :)

设置

我们提供即用型Docker镜像,您可以直接使用。如果您有自己的设置,请参阅PHP-PM Docker仓库了解如何将PHP-PM集成到您的NGiNX配置中。

受信任的代理 Symfony

例如,为了在您的Symfony应用程序中获取真实的远程IP,请务必将ppm(默认127.0.0.1)添加为受信任的反向代理。

# app/config/config.yml
# ...
framework:
    trusted_proxies:  [127.0.0.1]

更多信息请查看https://symfony.com.cn/doc/current/cookbook/request/load_balancer_reverse_proxy.html