如何部署 PHP 应用

Flynn 使用 PHP 或者 HHVM 来支持 PHP 应用,使用的 web 服务器是 Apache2Nginx

Flynn 使用 Heroku PHP 构建包来完成 PHP 应用的检测,编译和部署。

应用检测

Flynn 通过应用根目录下的composer.json来检测是否为 PHP 应用。使用 Composer 来管理依赖关系,可以自动下载安装依赖的软件包。

即使应用没有外部依赖的软件包需要用 Composer 管理,也需要在应用的根目录下创建一个composer.json空文件,Flynn 据此判断应用类型。

软件依赖

软件包

composer.json文件的主要用途是用来声明软件包的依赖关系。下面composer.json的例子,声明了应用对 monolog 的依赖:

  1. {
  2. "require": {
  3. "monolog/monolog": "1.11.*"
  4. }
  5. }

运行composer install命令会自动下载安装所依赖的软件,并创建一个composer.lock文件,其中包含所有已安装的软件版本的快照。当应用部署时,必须包含一个composer.lock文件,Flynn 据此检测软件包安装的版本。

Composer同时创建vendor/autoload.php文件,可以在 PHP 程序中包含进去,能在程序里自动加载所依赖的软件包。例如,刚才依赖的monolog,在程序里按如下方式使用:

  1. require 'vendor/autoload.php';
  2. // you can now reference Monolog
  3. use Monolog\Logger;
  4. $log = new Logger('my-application');
  5. ...

关于composer.json文件的详细信息,参见:Composer JSON 模式说明页面

环境配置

可能有些软件包只需要在本地使用,部署到生产系统时不需要安装,这可以通过运行composer install时,增加—no-dev参数实现。这样在部署时,系统会忽略composer.json文件里require-dev中定义的内容。

例如:本地环境可能会使用 phpunit,但在部署后很少会需要使用,你可以这样配置require-dev

  1. {
  2. "require": {
  3. "monolog/monolog": "1.11.*"
  4. },
  5. "require-dev": {
  6. "phpunit/phpunit": "4.3.*"
  7. }
  8. }

针对上面配置,完整运行的 Composer 命令如下:

  1. composer install \
  2. --no-dev \
  3. --prefer-dist \
  4. --optimize-autoloader \
  5. --no-interaction

关于composer install的详细信息,请参加composer install 文档

PHP运行环境

Flynn 默认使用最新的稳定版 PHP,也可以在依赖关系里配置特定的 PHP 或 HHVM 版本。

例如,使用 PHP 5.6.x:

  1. {
  2. "require": {
  3. "php": "~5.6.0"
  4. }
  5. }

使用 HHVM 3.2.x:

  1. {
  2. "require": {
  3. "hhvm": "~3.2.0"
  4. }
  5. }

建议在版本号前增加~操作符号,这样应用会使用该大版本下最新的稳定小版本。关于~的详细介绍,参见 Composer 文档

应用类型

在应用根目录下的Procfile里声明应用的类型。格式:TYPE: COMMAND

web

web类型的应用包含 HTTP 路由,配置了通信端口等环境变量,一般来说还会启动一个 HTTP 服务器。

Flynn 内置支持两种 web 服务器。

Apache2

系统使用heroku-php-apache2脚本启动 Apache2(包括 PHP-FPM):

  1. web: vendor/bin/heroku-php-apache2

如果使用 HHVM 运行环境,则使用heroku-hhvm-apache2脚本:

  1. web: vendor/bin/heroku-hhvm-apache2

Nginx

启动 Nginx (和 PHP-FPM ),使用 heroku-php-nginx脚本:

  1. web: vendor/bin/heroku-php-nginx

如果使用 HHVM 运行环境,则使用heroku-hhvm-nginx脚本:

  1. web: vendor/bin/heroku-hhvm-nginx

默认如果应用没有配置Procfile文件,系统会默认使用 Apache 作为 web 服务器,并使用composer.json里定义的运行环境(vendor/bin/heroku-php-apache2vendor/bin/heroku-hhvm-apache2)。

原文: http://doc.oschina.net/flynn?t=54099