onurakman/php-pm

PHP-PM 是一款用于 PHP 应用的进程管理器、加速器和负载均衡器。

维护者

详细信息

github.com/onurakman/php-pm

源代码

dev-master 2022-10-08 15:58 UTC

This package is not auto-updated.

Last update: 2024-09-22 23:43:45 UTC


README

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 组件进行美化。

适配器

HttpKernel for Symfony/Laravel - 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

Laravel,示例包

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

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

问题

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

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

设置

我们提供即用型Docker镜像,您可以立即使用。如果您有自己的设置,请查看PHP-PM docker仓库,了解如何在您的NGiNX设置中集成PHP-PM。

受信任的代理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