PHP语言识别策略

平台默认会根据源码根目录是否有index.php 文件或者 composer.json来识别为PHP项目.

平台编译运行机制

  1. 预编译处理会探测是否定义了启动命令配置文件 Procfile ,如果未定义会生成默认War包启动配置文件;
  2. 预编译处理完成后,会根据语言类型选择PHP的buildpack去编译项目.在编译过程中会安装定义的PHP版本,安装相关依赖包;
  3. 编译完成后会检查是否在平台设置了Procfile参数,若配置了会重写启动命令配置文件Procfile.
  1. # 安装依赖包,解决依赖关系
  2. composer install --no-dev --prefer-dist --optimize-autoloader --no-interaction

shell hook 支持

通过配置 composer.json 进行 shell hook 对调用

  1. {
  2. "scripts": {
  3. "pre-install-cmd": [
  4. "bash ./pre-install-cmd.sh"
  5. ],
  6. "post-install-cmd": [
  7. "bash ./post-install-cmd.sh"
  8. ]
  9. },
  10. "require": {
  11. "php": "7.1.21",
  12. "ext-memcached": "*"
  13. }
  14. }

其中 pre-install-cmd 定义内容会在 install 前执行,post-install-cmd 定义内容会在 install 后执行,定义脚本必须提前创建并赋予执行权限

PHP项目源码规范

在此步骤中,你需要提供一个可用的PHP源码程序用来部署在Rainbond平台上,此应用程序至少需要满足如下条件:

  1. 本地可以正常运行的PHP程序
  2. 源码程序必须托管在gitlab等相关git或者svn服务上
  3. 源码程序根目录下必须需要存在php文件
  4. 源码程序根目录下必须存在 composer.json,用来管理PHP项目的依赖,也是Rainbond识别为PHP语言的必要条件,同时文件中必须定义项目需要的php版本,定义方式见下文。
  5. 源码程序项目根目录下必须存在 composer.lock 文件

  6. 源码程序项目根目录下需要定义 Procfile ,用来定义程序启动方式

Procfile规范

如果项目未定义Procfile文件,平台默认会生成默认Procfile来运行PHP。

  1. # apache (默认)
  2. web: vendor/bin/heroku-php-apache2
  3. # nginx
  4. web: vendor/bin/heroku-php-nginx

上述是默认Procfile,如果需要扩展,可以自定义Procfile。

Composer文件

默认源码根目录需要存在 composer.jsoncomposer.lock 文件, 即使应用程序没有Composer依赖项,它也必须至少包含一个空({})。composer.lock 其中可以通过如下命令生成

  1. composer update --ignore-platform-reqs

PHP应用程序可以使用Composer安装的依赖项,通常会将依赖项安装到 vendor/ 目录,但是部分项目会重新定义这个目录,执行 composer config vendor-dir 配置正确的路径。大多数情况下避免本地安装影响,通常需要将Composer vendor 目录添加到你的 .gitignore 当在composer.json中定义了verndor-dir时需注意,需要自行定义Procfile否则会导致应用无法正常运行,Procfile格式类似 web: <vendor-dir>/heroku/heroku-buildpack-php/bin/heroku-php-apache2

  1. "config" : {
  2. "vendor-dir": "lib/composer",
  3. "optimize-autoloader": true
  4. },

编译运行环境设置

平台提供了不同的PHP版本,您可以使用PHP,HHVM(PHP代码编译器),或者同时使用二者,通过HHVM提高PHP性能。

PHP版本支持
  • PHP 5.5.38 (5.5.38)
  • PHP 5.6.35 (5.6.35)
  • PHP 7.0.29 (7.0.29)
  • PHP 7.1.16 (7.1.16)

可以通过composer.json文件来指定上述支持的PHP或HHVM版本

  1. {
  2. "require": {"php": "5.6.35"}
  3. }

PHP 的版本支持 ~5.5.35 这种 Semantic Versioning 的形式,如果用户指定~5.5.35系统会从平台中选择5.5分支版本最高的版本,因此会选择5.5.35版本。

扩展支持

PHP 5.6

在Rainbond上自动启用以下内置扩展(此列表不包括默认情况下PHP启用的扩展,例如 DOMJSONPCREPDO):

以下内置扩展已经构建为“共享”,可以通过composer.json(括号中给出的内部标识符名称)启用:

可以通过composer.json启用以下第三方扩展(括号中给出的内部标识符名称):

PHP 7.0

在Rainbond上自动启用以下内置扩展(此列表不包括默认情况下PHP启用的扩展,例如 DOMJSONPCREPDO):

以下内置扩展已经构建为“共享”,可以通过composer.json(括号中给出的内部标识符名称)启用:

可以通过composer.json启用以下第三方扩展(括号中给出的内部标识符名称):

PHP 7.1

在Rainbond上自动启用以下内置扩展(此列表不包括默认情况下PHP启用的扩展,例如 DOMJSONPCREPDO):

以下内置扩展已经构建为“共享”,可以通过composer.json(括号中给出的内部标识符名称)启用:

可以通过composer.json启用以下第三方扩展(括号中给出的内部标识符名称):

<!–

默认扩展

以下为Rainbond创建PHP应用时默认开启的扩展:

2.4.2 可选扩展

您可以在应用创建的向导中选择添加除默认扩展外的其他扩展(扩展名对应包名在下列括号中给出): - BCMath(bcmath) - Calendar(calendar) - Exif(exif) - FTP(ftp) - GD(gd) - gettext(gettext) - intl(intl) - mbstring(mbstring) - MySQL(mysql,注意,该扩展已经在php 5.5中废弃,推荐使用 MySQLi 或 PDO) - PCNTL(pcntl) - Shmop(shmop) - SOAP(soap) - SQLite3(sqlite3) - SQLite(PDO)(pdo_sqlite) - XMLRPC(xmlrpc) - XSL(xsl)

自定义扩展

您可以在composer.json中添加自定义扩展,这里需要以 **ext-(前缀) ** + 扩展包名 这样的格式命名扩展包名称,使用 ***** 标识扩展包的版本号。以下是使用bcmath, Memcached, MongoDB和 XSL 的例子:

  1. {
  2. "require": {
  3. "ext-bcmath": "*",
  4. "ext-memcached": "*",
  5. "ext-mongo": "*",
  6. "ext-xsl": "*"
  7. }
  8. }

Composer是PHP的依赖管理器,composer.json则是Composer的配置文件,强烈建议使用 “*” 来标识扩展包的版本号。

第三方扩展

以下第三方扩展可以通过 composer.json 开启(包名已在括号内给出):

扩展特例

官方出品过2个mongodb的扩展,一个叫mongo,一个是mongodb。前者已经被官方废弃,不再提供稳定的更新,官方推荐使用后者,并且后者是支持php7的。所以在使用mongodb扩展时,需要在composer.json中指定扩展为mongodb。

  1. {
  2. "require": {
  3. "php": "~7.1.16",
  4. "ext-memcached": "*",
  5. "ext-mongodb": "*",
  6. "ext-mbstring": "*"
  7. }
  8. }

更多细节扩展支持说明请参考:不同版本PHP扩展支持说明

–>

示例demo程序

示例https://github.com/goodrain/php-demo

推荐阅读

<!–

五、源码编译构建

在部署期间系统会运行以下命令来安装依赖包,解决依赖关系:

  1. composer install --no-dev --prefer-dist --optimize-autoloader --no-interaction

系统会在每次运行的时候使用composer self-update 将Composer自动更新到最新版本。

六、配置启动命令

云帮支持 Apache,如果您在Profile文件中没有设置加载其中任一服务器,或代码根目录没有 Procfile 文件,应用创建向导会提示用户选择Apache作为Web服务器。

Apache服务器

Apache接口与PHP-FPM或HHVM通过FastCGI使用 mod_proxy_fcgi

名词释义:

FastCGI:快速网关接口,是一种让交互程序与Web服务器通信的协议,早期通用网关接口(CGI)的增强版本

PHP-FPM:是一个FastCGI管理器,旨在将FastCGI进程管理整合进PHP包中

HHVM:PHP代码编译器

在您代码的根目录下创建 Procfile 文件,填写以下内容来开启 PHP-FPM:

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

如果要运行 HHVM 的话,Procfile 内容如下:

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

您可以通过 .htaccess 文件来自定义 Apache 的行为,也可以使用自定义 Apache 配置文件的方式。例如;

将以下内容保存在根目录下命名为 apache_app.conf:

  1. RewriteEngine On
  2. RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
  3. RewriteRule ^(.*) - [E=BASE:%1]
  4. RewriteCond %{ENV:REDIRECT_STATUS} ^$
  5. RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]
  6. RewriteCond %{REQUEST_FILENAME} -f
  7. RewriteRule .? - [L]
  8. RewriteRule .? %{ENV:BASE}/app.php [L]

然后修改 Procfile 文件加载此配置:

  1. web: vendor/bin/heroku-php-apache2 -C apache_app.conf

5.2 Nginx

Nginx 使用 FastCGI 连接 PHP-FPM,使用下面的 Procfile 开启 Nginx:

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

如果要运行 HHVM 的话,Procfile 内容如下:

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

Nginx 服务器同样支持自定义配置,以下是一个 URL 重写的例子:

  1. location / {
  2. # try to serve file directly, fallback to rewrite
  3. try_files $uri @rewriteapp;
  4. }
  5. location @rewriteapp {
  6. # rewrite all to app.php
  7. rewrite ^(.*)$ /app.php/$1 last;
  8. }
  9. location ~ ^/(app|app_dev|config)\.php(/|$) {
  10. fastcgi_pass heroku-fcgi;
  11. fastcgi_split_path_info ^(.+\.php)(/.*)$;
  12. include fastcgi_params;
  13. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  14. fastcgi_param HTTPS off;
  15. }

将其保存在根目录下命名为为 nginx_app.conf ,修改 Procfile 文件为以下内容即可:

  1. web: vendor/bin/heroku-php-nginx -C nginx_app.conf

–>