puper / php-pm
Requires
- php: >=5.6.0
- mkraemer/react-pcntl: 2.0.*
- monolog/monolog: ^1.3
- react/event-loop: ^0.4
- react/http: dev-master#cd15204bd15d106d7832c680e4fb0ca0ce2f5e30
- 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)
- mockery/mockery: ^0.9.4
- phpunit/phpunit: ^5.3
- puper/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/zend-adapter: Zend application framework adapter
- puper/httpkernel-adapter: HttpKernel adapter for Symfony and Laravel frameworks
This package is not auto-updated.
Last update: 2024-09-23 12:56:49 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 权限。
一切事物都带有徽章
您的应用程序/库支持 PPM 吗?展示出来!
[](https://github.com/php-pm/php-pm)
安装
要获取 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
默认情况下,cgi 目录位于 /usr/lib/cgi-bin/php
,因此您需要运行
sudo ln -s /usr/lib/cgi-bin/php /usr/bin/php7.0-cgi
Red Hat/Centos (RHEL-7, 6) (https://webtatic.com/packages/php70/)
首先安装 Webtatic
yum install php70w-cli
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 --cgi-path=/opt/local/bin/php-cgi70
)。
例如,在 Ubuntu 上,默认情况下禁用了 pcntl_*
函数。如果您收到 Warning: pcntl_signal() has been disabled for security reasons
警告,您应该激活这些函数
打开 /etc/php5/cgi/php.ini
,找到行 disable_functions = pcntl_alarm,pcntl_fork, ...
并在它前面放置一个 ;
; This directive allows you to disable certain functions for security reasons.
; It receives a comma-delimited list of function names.
; https://php.ac.cn/disable-functions
;disable_functions = pcntl_alarm,pcntl_fork, ...
全局
$ git clone https://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
。
为了获得更高的性能(用于静态文件服务或相对较快的应用程序),尝试使用不同的事件循环(见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
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
Wordpress
对于所有 WordPress 爱好者:由于缺少请求-响应抽象,PPM 不适用于 WordPress。我们高度怀疑 WordPress 今后会与之兼容,因为其架构是按照当前不可能在单个应用程序进程中处理多个请求的方式编写的。
每个工作进程都启动自己的 HTTP 服务器,并监听端口 5501、5502、5503 等。范围是 5501 -> 5500+<workersCount>
。您可以直接将其集成到负载均衡器中,如 NGINX,或直接使用 http://127.0.0.1:8080。
性能(请求/秒)
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
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。
- 尚未完全实现 HTTP/1.1,但 reactphp/http 正在努力解决此问题。
请通过创建 pull requests 帮助我们修复这些问题。:)
设置 1. 使用 NGINX
NGINX 的示例配置
server { root /path/to/symfony/web/; server_name servername.com; location / { try_files $uri @ppm; } location @ppm { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:8080; } }
例如,在您的 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。
设置 2. 直接使用 PPM
由于 PPM 还有一个静态文件服务器(虽然速度不如 nginx 快,但适用于基本使用,请参阅性能部分),您可以直接在服务器或本地使用 PPM。不要以 root 身份运行 ppm(以使端口如 80 的工作),因为它不会为当前进程设置新的 UID,并且会一直以 root 身份运行,这非常不推荐。