subit / php-pm
PHP-PM 是一个 PHP 应用程序的过程管理器、加速器和负载均衡器。
此包的规范存储库似乎已不存在,因此该包已被冻结。
Requires
- php: ^7.1
- psr/http-server-handler: ^1.0
- react/child-process: ^0.6
- react/event-loop: ^1.0
- react/http: ^0.8
- react/socket: ^1.0
- react/stream: ^1.0
- ringcentral/psr7: ^1.2
- symfony/console: ^3.4|^4|^5
- symfony/error-handler: ^4.4
- symfony/process: ^3.4|^4|^5
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: ^7.0
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 使用
遵循 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。
在所有工作进程中,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 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
问题
- 内存泄漏,内存泄漏,还有很多内存泄漏。您也会在您的应用程序中找到泄漏。 :) 但这不是大问题,因为工作进程会自动重启。
- 与 ExtEventLoop 不兼容。(因此不要安装
php70-event,但您可以尝试 LibEventLoopphp56-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。




