marcj / php-pm
Requires
- mkraemer/react-pcntl: 2.0.*
- monolog/monolog: ^1.3
- react/event-loop: ^0.4
- react/http: dev-master
- react/socket-client: ^0.5.0
- react/stream: ^0.4
- symfony/console: ^2.6|^3.0
- symfony/debug: ^2.6|^3.0
- symfony/process: ^2.6|^3.0
Requires (Dev)
- php-pm/httpkernel-adapter: dev-master
Suggests
- ext-event: Allows for use of a more performant event-loop implementation.
- ext-libev: Allows for use of a more performant event-loop implementation.
- ext-libevent: Allows for use of a more performant event-loop implementation.
- php-pm/httpkernel-adapter: HttpKernel adapter for Symfony and Laravel frameworks
- php-pm/zend-adapter: Zend application framework adapter
This package is auto-updated.
Last update: 2024-09-10 23:58:04 UTC
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 作为开发服务器而不是 vagrant、nginx 或 apache?
- 无需处理文件权限(www-data 与本地用户 ID)。
- 无需痛苦的缓慢虚拟盒文件同步。
- PHP 应用的响应时间更快。
- 无需与 vagrant / 虚拟机设置争斗。
- 检出新项目,运行
ppm start
- 完成。(如果使用ppm config
配置) - 无需处理域名(/etc/hosts),只需为您的应用程序使用不同的端口,无需 root 权限。
安装
要获取 PHP-PM,您需要除了 php 可执行文件之外还需要 php-cgi,它通常与 php 一起提供。如果不可用,请尝试安装它
Debian/Ubuntu (https://www.digitalocean.com/community/tutorials/how-to-upgrade-to-php-7-on-ubuntu-14-04)
apt-get install php7.0-cgi
Mac OS X - Homebrew (https://github.com/Homebrew/homebrew-php)
brew install php70
Mac OS X - Macports
port install php70-cgi
默认情况下,PPM 会查找名为 php-cgi
的二进制文件。如果您的 PHP 安装使用不同的二进制文件名,您可以使用 php-cgi
配置选项指定该二进制文件的完整路径(例如:ppm config --php-cgi=/opt/local/bin/php-cgi70
)。
全局
$ git clone git@github.com:php-pm/php-pm.git $ cd php-pm $ composer install $ ln -s `pwd`/bin/ppm /usr/local/bin/ppm $ ppm --help
按项目
# change minimum-stability to dev in your composer.json (until we have a version tagged): "minimum-stability": "dev" composer require php-pm/php-pm:dev-master composer require php-pm/httpkernel-adapter:dev-master #if you have httpkernel (laravel, symfony) ./vendor/bin/ppm config --bootstrap=symfony #places a ppm.json in your directory ./vendor/bin/ppm start #reads ppm.json and starts the server like you want
一旦配置(composer 和 ppm.json),您就可以立即在您的开发机器或服务器上启动应用程序
composer install ./vendor/bin/ppm start
当 debug
启用时,PHP-PM 会检测文件更改并自动重新启动其工作进程。
性能 & 调试提示
为了获得最佳性能,您通常应该使用 --app-env=prod
并禁用调试 --debug=0
。还请确保禁用 xdebug。尝试使用不同数量的工作进程。通常,比 CPU 核心计数多 10% 是好的。例如:如果您有 8 个真实核心(不包括超线程),则使用 --workers=9
。
如果您的应用程序支持,请尝试启用每个工作进程的并发请求:--concurrent-requests=1
。
为了获得更高的性能(对于静态文件服务或对于相对较快的应用程序),请尝试不同的事件循环
如果您的应用程序中出现奇怪的异常,并且您不知道它们来自哪里,请尝试仅使用一个工作进程 --workers=1
。
适配器
Symfony/Laravel 的 HttpKernel - https://github.com/php-pm/php-pm-httpkernel
Drupal - https://github.com/php-pm/php-pm-drupal
Zend - https://github.com/php-pm/php-pm-zend
命令
启动
cd ~/my/path/to/symfony/ ppm start ppm start ~/my/path/to/symfony/ --bootstrap=Symfony --bridge=HttpKernel cd ~/my/path/to/symfony/ ./vendor/bin/ppm start
Symfony
cd my-project
composer require php-pm/httpkernel-adapter:dev-master
$ ./bin/ppm start --bootstrap=symfony
Laravel
cd my-project
composer require php-pm/httpkernel-adapter:dev-master
$ ./vendor/bin/ppm start --bootstrap=laravel
Drupal
cd my-project
composer require php-pm/httpkernel-adapter:dev-master
$ ./bin/ppm start --bootstrap=drupal
Zend
cd my-project
composer require php-pm/zend-adapter:dev-master
$ ./bin/ppm start --bridge=Zf2 --bootstrap=Zf2
每个工作进程都会启动自己的 HTTP 服务器,监听端口 5501、5502、5503 等。范围是 5501 -> 5500+<workersCount>
。您可以直接将这些工作进程集成到负载均衡器中,如 NGINX,或者直接使用 http://127.0.0.1:8080。
性能
6x3.2 GHz Intel,16GB RAM。20 个并发,1000 个总请求:ab -c 20 -n 1000 http://127.0.0.1:8080/
PHP 7,StreamSelectLoop
/usr/local/bin/php7 ./bin/ppm start ~/www/symfony--bridge=httpKernel --app-env=prod --logging=0 --debug=0 --workers=8
Static file: 2371.93 requests/s
Dynamic CMS application: 1685.80 request/s (http://jarves.io)
PHP 5.6.18,StreamSelectLoop
/usr/local/bin/php5 ./bin/ppm start ~/www/symfony --bridge=httpKernel --app-env=prod --logging=0 --debug=0 --workers=8
Static file: 1818.52 requests/s
Dynamic CMS application: 1270.30 request/s (http://jarves.io)
问题
- 内存泄漏,内存泄漏,还有内存泄漏。您也会在您的应用程序中发现泄漏。 :)
- 不与 ExtEventLoop 兼容。(因此请不要安装
php70-event
) - Drupal 非常实验性,并且尚未完全工作。尝试使用 https://github.com/php-pm/php-pm-drupal。
- Symfony 和 Laravel 的分析器尚未完全工作,因为每次请求后都需要重置一些东西。
- 流式响应尚未流式传输
- 文件上传是实验性的
- 由于信号处理,不支持 Windows
- 没有完全实现 HTTP/1.1,但是 reactphp/http 正在努力解决这个问题。
请通过创建拉取请求帮助我们修复这些问题。 :)
设置 1. 使用外部负载均衡器
NGiNX 的示例配置
upstream backend { server 127.0.0.1:5501; server 127.0.0.1:5502; server 127.0.0.1:5503; server 127.0.0.1:5504; server 127.0.0.1:5505; server 127.0.0.1:5506; } server { root /path/to/symfony/web/; server_name servername.com; location / { try_files $uri @backend; } location @backend { proxy_pass http://backend; } }
设置 2. 使用内部负载均衡器
此设置较慢,因为我们无法像 NGiNX 那样快速地负载均衡传入的连接,但它是测试目的的完美选择。