digit-soft / re-action-pm
PHP-PM 是 PHP 应用的进程管理器、超级充电器和负载均衡器。
Requires
- php: >=5.6.0
- ext-pcntl: *
- http-interop/http-middleware: ^0.5
- mkraemer/react-pcntl: ^2.0|^3.0
- monolog/monolog: ^1.3
- paragonie/random_compat: ^2.0
- react/child-process: ^0.5
- react/event-loop: ^0.4
- react/http: ^0.8
- react/socket: ^0.8.6
- react/stream: ^0.7.1
- ringcentral/psr7: ^1.2
- symfony/console: ^2.6|^3.0|^4.0
- symfony/debug: ^2.6|^3.0|^4.0
- symfony/process: ^2.6|^3.0|^4.0
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: ^5.7
Suggests
- php-pm/httpkernel-adapter: HttpKernel adapter for Symfony and Laravel frameworks
This package is auto-updated.
Last update: 2021-05-28 09:30:09 UTC
README
针对 Re-action 框架适配
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 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。