[TOC] #### **语言识别** 代码的根目录下必须有 index.php 或者 composer.json 文件。 >[info] 如果根目录存在 composer.lock文件会优化读取composer.lock的配置,忽略掉 composer.json,需删除composer.phar #### **支持版本** 平台提供了不同的PHP版本,您可以使用PHP,HHVM 或者同时使用它们。 **支持的版本:** * **PHP 5.4** (5.4.40) * **PHP 5.5** (5.5.26) * **PHP 5.6** (5.6.11) * **PHP 7.0** (7.0.16) * **PHP 7.1** (7.1.2) **可选的版本:** **HHVM (3.2.0, 3.3.1, 3.3.4,3.4.2,3.5.0,3.5.1)** **选择PHP版本:** 有两种方式指定PHP版本: * 通过应用创建向导来完成 * 通过配置`composer.json`文件来实现,下面介绍配置方法。 在用户代码的根目录创建`composer.json`文件,指定使用`PHP 5.5.26`版本,文件具体内容如下: { "require": {"php": "5.5.26"} } 以下`composer.json`配置会使用`HHVM 3.2`版本: { "require": {"hhvm": "3.2"} } >#### **提示** PHP 的版本支持 ~5.5.16 这种 [Semantic Versioning](http://semver.org/) 的形式,如果用户指定~5.5.16系统会从平台中选择5.5分支版本最高的版本,但不会使用5.6.*,因此会选择5.5.26版本。 #### **扩展** - 通过应用创建向导,可以在高级选项页手动勾选启动内置未启动扩展。 - 通过composer.json里添加相关配置。 ##### **PHP 5.5 和 5.6** 以下的内置扩展会自动开启,这个列表没有包含 PHP 可使用的全部扩展,例如 [DOM](http://docs.php.net/dom),[JSON](http://docs.php.net/json),[PCRE](http://docs.php.net/pcre),[PDO](http://docs.php.net/pdo),其它的内置扩展可以通过配置 composer.json 来开启,参考下面的 可选扩展 章节。 * [Bzip2](http://docs.php.net/bzip2) * [cURL](http://docs.php.net/curl) * [FPM](http://docs.php.net/fpm) * [mcrypt](http://docs.php.net/mcrypt) * [MySQL(PDO)](http://docs.php.net/pdo_mysql) (使用 [mysqlnd](http://docs.php.net/mysqlnd)) * [MySQLi](http://docs.php.net/mysqli) (使用 [mysqlnd](http://docs.php.net/mysqlnd)) * [OPcache](http://docs.php.net/opcache) * [OpenSSL](http://docs.php.net/openssl) * [PostgreSQL](http://docs.php.net/pgsql) * [PostgreSQL(PDO)](http://docs.php.net/pdo_pgsql) * [Readline](http://docs.php.net/readline) * [Sockets](http://docs.php.net/sockets) * [Zip](http://docs.php.net/zip) * [Zib](http://docs.php.net/zlib) #### **内置扩展** 以下内置扩展默认没有开启,可以通过 composer.json 开启(包名已在括号内给出): * [BCMath](http://docs.php.net/bcmath)(bcmath) * [Calendar](http://docs.php.net/calendar)(calendar) * [Exif](http://docs.php.net/exif)(exif) * [FTP](http://docs.php.net/ftp)(ftp) * [GD](http://docs.php.net/manual/en/book.image.php)(gd) * [gettext](http://docs.php.net/gettext)(gettext) * [intl](http://docs.php.net/intl)(intl) * [mbstring](http://docs.php.net/mbstring)(mbstring) * [MySQL](http://docs.php.net/book.mysql)(mysql,注意,该扩展已经在php 5.5中废弃,推荐使用 MySQLi 或 PDO) * [PCNTL](http://docs.php.net/pcntl)(pcntl) * [Shmop](http://docs.php.net/shmop)(shmop) * [SOAP](http://docs.php.net/soap)(soap) * [SQLite3](http://docs.php.net/sqlite3)(sqlite3) * [SQLite](http://docs.php.net/pdo_sqlite)(PDO)(pdo_sqlite) * [XMLRPC](http://docs.php.net/xmlrpc)(xmlrpc) * [XSL](http://docs.php.net/xsl)(xsl) #### **可选扩展** 通过在 composer.json 内添加配置可以声明可选扩展,只需要在对应扩展的包名前加上 ext- 前缀,以下是使用 bcmath, Memcached, MongoDB 和 XSL 的例子: { "require": { "ext-bcmath": "*", "ext-memcached": "*", "ext-mongo": "*", "ext-xsl": "*" } } > **提示**: composer.json 是 PHP 的依赖管理器 composer 的配置文件,强烈推荐使用 “*” 来标识依赖包的版本号。 #### **第三方扩展** 以下第三方扩展可以通过 composer.json 开启(包名已在括号内给出): * [APCu(apcu)](http://pecl.php.net/package/apcu)(apcu) * [ImageMagick(imagick)](http://docs.php.net/imagick)(imagick) * [memcached](http://docs.php.net/memcached)(memcached) * [MongoDB](http://docs.php.net/mongo)(mongo) * [New Relic](http://newrelic.com/php)(newrelic) * [PHPRedis](http://pecl.php.net/package/redis)(redis) * [Yaf](http://pecl.php.net/package/yaf)(yaf) * [Phalcon](http://phalconphp.com/)(phalcon) >**注意**: HHVM 暂时不支持自定义扩展 ##### **PHP 7.0和7.1** 官方出品过2个mongodb的扩展,一个叫mongo,一个是mongodb,前者已经被官方废弃,不再提供稳定的更新,官方推荐使用后者,并且后者是支持php7的。 所以在使用mongodb扩展时,需要在composer.json中指定扩展为mongodb。 ``` { "require": { "php": "~7.1.2", "ext-memcached": "*", "ext-mongodb": "*", "ext-mbstring": "*" } } ``` #### **构建** 系统会运行以下命令来解决依赖: composer install --no-dev --prefer-dist --optimize-autoloader --no-interaction >提示:Composer 会在每次运行的时候使用 self-update 自动更新到最新版本 #### **Web 服务器** 支持 [Apache](http://httpd.apache.org/) 和 [Nginx](http://nginx.org/) 两种 Web 服务器,如果代码根目录没有 Procfile 文件,应用创建向导会提示用户选择Apache或Nginx作为Web Server,否则遵循用户定义的Procfile文件设置。 **Apache** Apache 可以使用 mod_proxy+fcgi 连接 PHP-FPM 或 HHVM。 创建 Procfile 文件为下面的内容来开启 PHP-FPM: web: vendor/bin/heroku-php-apache2 如果要运行 HHVM 的话,Procfile 内容如下: web: vendor/bin/heroku-hhvm-apache2 你可以通过 .htaccess 文件来自定义 Apache 的行为,也可以使用自定义 Apache 配置文件的方式,例如: 将以下内容保存为 apache_app.conf: ~~~ RewriteEngine On RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ RewriteRule ^(.*) - [E=BASE:%1] RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L] RewriteCond %{REQUEST_FILENAME} -f RewriteRule .? - [L] RewriteRule .? %{ENV:BASE}/app.php [L] ~~~ 然后修改 Procfile 文件加载此配置: web: vendor/bin/heroku-php-apache2 -C apache_app.conf **Nginx** Nginx 使用 FastCGI 连接 PHP-FPM,使用下面的 Procfile 开启 Nginx: web: vendor/bin/heroku-php-nginx 如果要运行 HHVM 的话,Procfile 内容如下: web: vendor/bin/heroku-hhvm-nginx Nginx 服务器同样支持自定义配置,以下是一个 URL 重写的例子: ~~~ location / { # try to serve file directly, fallback to rewrite try_files $uri @rewriteapp; } location @rewriteapp { # rewrite all to app.php rewrite ^(.*)$ /app.php/$1 last; } location ~ ^/(app|app_dev|config)\.php(/|$) { fastcgi_pass heroku-fcgi; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; } ~~~ 将其保存为 nginx_app.conf 接着修改 Procfile 文件为以下内容即可: web: vendor/bin/heroku-php-nginx -C nginx_app.conf