如何部署 PHP 应用 #如何部署 PHP 应用 Flynn 使用 PHP 或者 [HHVM](http://hhvm.com/) 来支持 PHP 应用,使用的 web 服务器是 [Apache2](http://httpd.apache.org/) 或 [Nginx](http://wiki.nginx.org/Main)。 Flynn 使用 [Heroku PHP 构建包](https://github.com/heroku/heroku-buildpack-php)来完成 PHP 应用的检测,编译和部署。 ##应用检测 Flynn 通过应用根目录下的`composer.json`来检测是否为 PHP 应用。使用 [Composer](https://getcomposer.org/) 来管理依赖关系,可以自动下载安装依赖的软件包。 即使应用没有外部依赖的软件包需要用 Composer 管理,也需要在应用的根目录下创建一个`composer.json`空文件,Flynn 据此判断应用类型。 ##软件依赖 ###软件包 `composer.json`文件的主要用途是用来声明软件包的依赖关系。 下面`composer.json`的例子,声明了应用对 [monolog](https://github.com/Seldaek/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 模式说明页面](https://getcomposer.org/doc/04-schema.md)。 ##环境配置 可能有些软件包只需要在本地使用,部署到生产系统时不需要安装,这可以通过运行`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 文档](https://getcomposer.org/doc/03-cli.md#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 文档](https://getcomposer.org/doc/01-basic-usage.md#next-significant-release-tilde-operator-)。* ##应用类型 在应用根目录下的`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`)。