如何部署 PHP 应用
Flynn 使用 PHP 或者 HHVM 来支持 PHP 应用,使用的 web 服务器是 Apache2 或 Nginx。
Flynn 使用 Heroku PHP 构建包来完成 PHP 应用的检测,编译和部署。
应用检测
Flynn 通过应用根目录下的composer.json
来检测是否为 PHP 应用。使用 Composer 来管理依赖关系,可以自动下载安装依赖的软件包。
即使应用没有外部依赖的软件包需要用 Composer 管理,也需要在应用的根目录下创建一个composer.json
空文件,Flynn 据此判断应用类型。
软件依赖
软件包
composer.json
文件的主要用途是用来声明软件包的依赖关系。下面composer.json
的例子,声明了应用对 monolog 的依赖:
{
"require": {
"monolog/monolog": "1.11.*"
}
}
运行composer install
命令会自动下载安装所依赖的软件,并创建一个composer.lock
文件,其中包含所有已安装的软件版本的快照。当应用部署时,必须包含一个composer.lock
文件,Flynn 据此检测软件包安装的版本。
Composer同时创建vendor/autoload.php
文件,可以在 PHP 程序中包含进去,能在程序里自动加载所依赖的软件包。例如,刚才依赖的monolog
,在程序里按如下方式使用:
require 'vendor/autoload.php';
// you can now reference Monolog
use Monolog\Logger;
$log = new Logger('my-application');
...
关于composer.json
文件的详细信息,参见:Composer JSON 模式说明页面。
环境配置
可能有些软件包只需要在本地使用,部署到生产系统时不需要安装,这可以通过运行composer install
时,增加—no-dev
参数实现。这样在部署时,系统会忽略composer.json
文件里require-dev
中定义的内容。
例如:本地环境可能会使用 phpunit
,但在部署后很少会需要使用,你可以这样配置require-dev
:
{
"require": {
"monolog/monolog": "1.11.*"
},
"require-dev": {
"phpunit/phpunit": "4.3.*"
}
}
针对上面配置,完整运行的 Composer 命令如下:
composer install \
--no-dev \
--prefer-dist \
--optimize-autoloader \
--no-interaction
关于composer install
的详细信息,请参加composer install 文档。
PHP运行环境
Flynn 默认使用最新的稳定版 PHP,也可以在依赖关系里配置特定的 PHP 或 HHVM 版本。
例如,使用 PHP 5.6.x:
{
"require": {
"php": "~5.6.0"
}
}
使用 HHVM 3.2.x:
{
"require": {
"hhvm": "~3.2.0"
}
}
建议在版本号前增加~
操作符号,这样应用会使用该大版本下最新的稳定小版本。关于~
的详细介绍,参见 Composer 文档。
应用类型
在应用根目录下的Procfile
里声明应用的类型。格式:TYPE: COMMAND
。
web
web
类型的应用包含 HTTP 路由,配置了通信端口等环境变量,一般来说还会启动一个 HTTP 服务器。
Flynn 内置支持两种 web 服务器。
Apache2
系统使用heroku-php-apache2
脚本启动 Apache2(包括 PHP-FPM):
web: vendor/bin/heroku-php-apache2
如果使用 HHVM 运行环境,则使用heroku-hhvm-apache2
脚本:
web: vendor/bin/heroku-hhvm-apache2
Nginx
启动 Nginx (和 PHP-FPM ),使用 heroku-php-nginx
脚本:
web: vendor/bin/heroku-php-nginx
如果使用 HHVM 运行环境,则使用heroku-hhvm-nginx
脚本:
web: vendor/bin/heroku-hhvm-nginx
默认如果应用没有配置Procfile
文件,系统会默认使用 Apache 作为 web 服务器,并使用composer.json
里定义的运行环境(vendor/bin/heroku-php-apache2
或vendor/bin/heroku-hhvm-apache2
)。