marcj/php-pm

该软件包的最新版本(dev-master)没有可用的许可证信息。

维护者

详细信息

github.com/marcj/php-pm

源代码

安装: 99

依赖: 1

建议: 0

安全性: 0

星级: 3

关注者: 3

分支: 368

dev-master 2016-03-21 14:30 UTC

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

命令

ppm-help

启动

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

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. 使用外部负载均衡器

ReactPHP with external Load-Balancer

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 那样快速地负载均衡传入的连接,但它是测试目的的完美选择。

ReactPHP with internal Load-Balancer