php-pm / php-pm
PHP-PM 是一个用于 PHP 应用的进程管理器、超级加速器和负载均衡器。
Requires
- php: ^7.3 || ^8.0
- ext-pcntl: *
- psr/http-message: ^1.0.1
- psr/http-server-handler: ^1.0
- react/child-process: ^0.6
- react/event-loop: ^1.0
- react/http: ^1.0
- react/promise: ^2.0
- react/socket: ^1.0
- react/stream: ^1.0
- ringcentral/psr7: ^1.2
- symfony/console: ^4|^5|^6
- symfony/error-handler: ^4.4|^5|^6
- symfony/process: ^4|^5|^6
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- mockery/mockery: ^1.0
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^9.4
Suggests
- php-pm/httpkernel-adapter: HttpKernel adapter for Symfony and Laravel frameworks
README
PHP-PM 是一个用于 PHP 应用的进程管理器、超级加速器和负载均衡器。
它基于 ReactPHP,与使用请求-响应框架(如 Symfony 的 HTTPKernel)的应用程序配合使用效果最佳。该方法的思路是终止昂贵的 PHP 启动(声明符号、加载/解析文件)和功能丰富的框架的启动。请参阅性能部分以获取快速提示。PHP-PM 基本上会启动几个 PHP 实例作为工作启动器,以准备您的应用程序(例如整个 Symfony Kernel),并将其保留在内存中,以准备处理每个传入的请求:这就是为什么 PHP-PM 使您的应用程序如此快速的原因。
更多信息可以在以下文章中找到: 将高性能引入您的 PHP 应用(使用 ReactPHP)
特性
- 性能提升高达 15 倍(与 PHP-FPM、Symfony 应用程序相比)。
- 集成负载均衡器。
- 热代码重新加载(当 PHP 文件更改时)。
- 静态文件服务,便于开发流程。
- 支持 HttpKernel(Symfony/Laravel)、Drupal(实验性)、Zend(实验性)。
徽章一切
您的应用程序/库支持 PPM 吗?展示它!
[](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 使用
遵循维基文章 不使用 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。
所有工作进程都将STDOUT重定向到连接的客户端。因此请注意,var_dump
、echo
等命令不会在控制台上显示。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
命令
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英特尔i7,16GB内存。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
,但您可以尝试LibEventLoopphp56-libevent
) - Drupal和Zend非常实验性,且尚未完全工作。请尝试使用https://github.com/php-pm/php-pm-drupal。
- Laravel的调试器目前尚未完美工作,因为它需要在每次请求后重置一些内容。
- 流式响应尚未流式传输
- 由于信号处理,不支持Windows
请通过创建pull请求帮助我们修复这些问题。 :)
设置
我们提供可以直接使用的docker镜像。如果您有自己的设置,请参阅PHP-PM docker存储库中的说明,了解如何将PHP-PM集成到您的NGiNX设置中。
受信任的代理Symphony
例如,要在您的Symphony应用程序中获取真实的远程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。