Laravel 8.x 部署至 Heroku,基于 PostgreSQL 实现
1、在本地开发环境中,基于 Laravel Sail 已经部署完毕。打开网址:http://weibo.test/ ,响应 200。如图1
2、注册一个 Heroku 账号,使用 @163.com ,发现不被允许,最后使用 @gmail.com,才注册成功。如图2
3、在邮箱 @gmail.com 中点击链接以激活帐户。如图3
4、参考网址:https://devcenter.heroku.com/articles/heroku-cli 。Heroku 命令行界面 (CLI) 使直接从终端创建和管理 Heroku 应用程序变得容易。 这是使用 Heroku 的重要组成部分。
5、在 WSL2 中的 Ubuntu 系统中,从终端运行以下命令。报错:error: cannot communicate with server: Post http://localhost/v2/snaps/heroku: dial unix /run/snapd.socket: connect: no such file or directory。如图4
1 2 | wangqiang@DESKTOP-QLPK8QM:/mnt/e/wwwroot/weibo$ sudo snap install --classic heroku error: cannot communicate with server: Post http://localhost/v2/snaps/heroku: dial unix /run/snapd.socket: connect: no such file or directory |
6、最终决定使用 Windows 下的软件。为您的 Windows 安装下载合适的安装程序。如图5
7、安装过程中报错:Error opening file for writing。如图6
1 2 3 4 5 6 7 | Error opening file for writing: D:\Program Files\heroku\client\bin\node.exe Click Abort to stop the installation, Retry to try again, or Ignore to skip this file. |
8、重新安装,以管理员身份运行,不再报错。
9、验证您的安装,要验证您的 CLI 安装,请使用 heroku –version 命令。已经成功安装。如图7
1 2 3 4 | PS C:\Users\Lenovo> heroku --version » Warning: Our terms of service have changed: https://dashboard.heroku.com/terms-of-service heroku/7.53.0 win32-x64 node-v12.21.0 PS C:\Users\Lenovo> |
10、安装 CLI 后,运行 heroku login 命令。 系统会提示您输入任意键以转到 Web 浏览器以完成登录。 然后 CLI 会自动让您登录。如图8
1 2 3 4 5 6 | PS C:\Users\Lenovo> heroku login heroku: Press any key to open up the browser to login or q to exit: Logging in... done Logged in as shuijingwanwq@gmail.com PS C:\Users\Lenovo> |
11、参考网址:https://devcenter.heroku.com/articles/getting-started-with-php 。因为文档假设 PHP 与 Composer 安装在本地。由于本地环境的 PHP 版本与 Laravel Sail 环境中的版本不一致,决定先将本地环境的 PHP 版本升级至 PHP 8.1。如图9、图10
本地环境的版本号:
1 2 3 4 5 6 7 | PS C:\Users\Lenovo> php -v PHP 7.4.27 (cli) (built: Dec 14 2021 19:52:13) ( ZTS Visual C++ 2017 x64 ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies PS C:\Users\Lenovo> composer -V Composer version 2.1.14 2021-11-30 10:51:43 PS C:\Users\Lenovo> |
Laravel Sail 环境的版本号:
1 2 3 4 5 6 7 8 9 | # php -v PHP 8.1.0 (cli) (built: Nov 25 2021 20:22:22) (NTS) Copyright (c) The PHP Group Zend Engine v4.1.0, Copyright (c) Zend Technologies with Zend OPcache v8.1.0, Copyright (c), by Zend Technologies with Xdebug v3.1.1, Copyright (c) 2002-2021, by Derick Rethans # composer -V Composer version 2.1.14 2021-11-30 10:51:43 # |
12、升级后的本地环境的 PHP 版本,PHP 8.1.1。
1 2 3 4 5 | PS C:\Users\Lenovo> php -v PHP 8.1.1 (cli) (built: Dec 15 2021 10:31:43) (ZTS Visual C++ 2019 x64) Copyright (c) The PHP Group Zend Engine v4.1.1, Copyright (c) Zend Technologies PS C:\Users\Lenovo> |
13、进入程序根目录,使用 heroku create 命令在 Heroku 上创建一个新应用。secret-stream-72395 是 Heroku 随机为应用生成的默认名称,每个人生成的名称都不相同。而 https://secret-stream-72395.herokuapp.com/ 则是应用的线上地址。如图11
1 2 3 4 5 6 | PS E:\wwwroot> cd .\weibo\ PS E:\wwwroot\weibo> heroku create » Warning: heroku update available from 7.53.0 to 7.59.2. Creating app... done, ⬢ secret-stream-72395 PS E:\wwwroot\weibo> |
14、Heroku 平台支持多种语言,在进行应用部署时,Heroku 会自动检查应用的代码是用什么语言写的,然后再接着执行一系列针对该语言的操作来准备好程序运行环境。Laravel 应用默认会包含 package.json 文件,但当 Heroku 检查到该文件时,它会认为此应用是用 Node.js 写的,因此我们需要对应用的 buildpack 进行声明,告诉 Heroku 说我们的应用是用 PHP 写的。如图12
1 2 3 4 5 | PS E:\wwwroot\weibo> heroku buildpacks:set heroku/php » Warning: heroku update available from 7.53.0 to 7.59.2. Buildpack set. Next release on secret-stream-72395 will use heroku/php. Run git push heroku main to create a new release using this buildpack. PS E:\wwwroot\weibo> |
15、将代码推送和部署到 Heroku 上。如图13
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | PS E:\wwwroot\weibo> git status On branch main Your branch is up to date with 'origin/main'. Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: docker-compose.yml PS E:\wwwroot\weibo> git push heroku main Enumerating objects: 195, done. Counting objects: 100% (195/195), done. Delta compression using up to 4 threads Compressing objects: 100% (169/169), done. Writing objects: 100% (195/195), 651.34 KiB | 1.41 MiB/s, done. Total 195 (delta 47), reused 0 (delta 0), pack-reused 0 remote: Compressing source files... done. remote: Building source: remote: remote: -----> Building on the Heroku-20 stack remote: -----> Using buildpack: heroku/php remote: -----> PHP app detected remote: -----> Bootstrapping... remote: -----> Installing platform packages... remote: - php (8.1.1) remote: - ext-mbstring (bundled with php) remote: - composer (2.1.14) remote: - apache (2.4.51) remote: - nginx (1.20.2) remote: -----> Installing dependencies... remote: Composer version 2.1.14 2021-11-30 10:51:43 remote: Installing dependencies from lock file remote: Verifying lock file contents can be installed on current platform. remote: Package operations: 70 installs, 0 updates, 0 removals remote: - Downloading doctrine/inflector (2.0.4) remote: - Downloading doctrine/lexer (1.2.1) remote: - Downloading symfony/polyfill-ctype (v1.23.0) remote: - Downloading webmozart/assert (1.10.0) remote: - Downloading dragonmantank/cron-expression (v3.1.0) remote: - Downloading symfony/polyfill-php80 (v1.23.1) remote: - Downloading symfony/polyfill-php73 (v1.23.0) remote: - Downloading symfony/polyfill-mbstring (v1.23.1) remote: - Downloading symfony/deprecation-contracts (v3.0.0) remote: - Downloading symfony/http-foundation (v5.4.1) remote: - Downloading psr/event-dispatcher (1.0.0) remote: - Downloading symfony/event-dispatcher-contracts (v3.0.0) remote: - Downloading symfony/event-dispatcher (v6.0.1) remote: - Downloading symfony/var-dumper (v5.4.1) remote: - Downloading psr/log (2.0.0) remote: - Downloading symfony/error-handler (v5.4.1) remote: - Downloading symfony/http-kernel (v5.4.1) remote: - Downloading voku/portable-ascii (1.5.6) remote: - Downloading phpoption/phpoption (1.8.1) remote: - Downloading graham-campbell/result-type (v1.0.4) remote: - Downloading vlucas/phpdotenv (v5.4.1) remote: - Downloading symfony/css-selector (v6.0.1) remote: - Downloading tijsverkoyen/css-to-inline-styles (2.2.4) remote: - Downloading symfony/routing (v5.4.0) remote: - Downloading symfony/process (v5.4.0) remote: - Downloading symfony/polyfill-php72 (v1.23.0) remote: - Downloading symfony/polyfill-intl-normalizer (v1.23.0) remote: - Downloading symfony/polyfill-intl-idn (v1.23.0) remote: - Downloading symfony/mime (v5.4.0) remote: - Downloading symfony/finder (v5.4.0) remote: - Downloading symfony/polyfill-intl-grapheme (v1.23.1) remote: - Downloading symfony/string (v6.0.1) remote: - Downloading psr/container (1.1.2) remote: - Downloading symfony/service-contracts (v2.4.1) remote: - Downloading symfony/console (v5.4.1) remote: - Downloading symfony/polyfill-iconv (v1.23.0) remote: - Downloading egulias/email-validator (2.1.25) remote: - Downloading swiftmailer/swiftmailer (v6.3.0) remote: - Downloading symfony/polyfill-php81 (v1.23.0) remote: - Downloading ramsey/collection (1.2.2) remote: - Downloading brick/math (0.9.3) remote: - Downloading ramsey/uuid (4.2.3) remote: - Downloading psr/simple-cache (1.0.1) remote: - Downloading opis/closure (3.6.2) remote: - Downloading symfony/translation-contracts (v3.0.0) remote: - Downloading symfony/translation (v6.0.1) remote: - Downloading nesbot/carbon (2.55.2) remote: - Downloading monolog/monolog (2.3.5) remote: - Downloading league/mime-type-detection (1.9.0) remote: - Downloading league/flysystem (1.1.9) remote: - Downloading nette/utils (v3.2.6) remote: - Downloading nette/schema (v1.2.2) remote: - Downloading dflydev/dot-access-data (v3.0.1) remote: - Downloading league/config (v1.1.1) remote: - Downloading league/commonmark (2.1.0) remote: - Downloading laravel/serializable-closure (v1.0.5) remote: - Downloading laravel/framework (v8.76.2) remote: - Downloading asm89/stack-cors (v2.0.3) remote: - Downloading fruitcake/laravel-cors (v2.0.4) remote: - Downloading psr/http-message (1.0.1) remote: - Downloading psr/http-client (1.0.1) remote: - Downloading ralouphie/getallheaders (3.0.3) remote: - Downloading psr/http-factory (1.0.1) remote: - Downloading guzzlehttp/psr7 (2.1.0) remote: - Downloading guzzlehttp/promises (1.5.1) remote: - Downloading guzzlehttp/guzzle (7.4.1) remote: - Downloading laravel/sanctum (v2.13.0) remote: - Downloading nikic/php-parser (v4.13.2) remote: - Downloading psy/psysh (v0.10.12) remote: - Downloading laravel/tinker (v2.6.3) remote: - Installing doctrine/inflector (2.0.4): Extracting archive remote: - Installing doctrine/lexer (1.2.1): Extracting archive remote: - Installing symfony/polyfill-ctype (v1.23.0): Extracting archive remote: - Installing webmozart/assert (1.10.0): Extracting archive remote: - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive remote: - Installing symfony/polyfill-php80 (v1.23.1): Extracting archive remote: - Installing symfony/polyfill-php73 (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-mbstring (v1.23.1): Extracting archive remote: - Installing symfony/deprecation-contracts (v3.0.0): Extracting archive remote: - Installing symfony/http-foundation (v5.4.1): Extracting archive remote: - Installing psr/event-dispatcher (1.0.0): Extracting archive remote: - Installing symfony/event-dispatcher-contracts (v3.0.0): Extracting archive remote: - Installing symfony/event-dispatcher (v6.0.1): Extracting archive remote: - Installing symfony/var-dumper (v5.4.1): Extracting archive remote: - Installing psr/log (2.0.0): Extracting archive remote: - Installing symfony/error-handler (v5.4.1): Extracting archive remote: - Installing symfony/http-kernel (v5.4.1): Extracting archive remote: - Installing voku/portable-ascii (1.5.6): Extracting archive remote: - Installing phpoption/phpoption (1.8.1): Extracting archive remote: - Installing graham-campbell/result-type (v1.0.4): Extracting archive remote: - Installing vlucas/phpdotenv (v5.4.1): Extracting archive remote: - Installing symfony/css-selector (v6.0.1): Extracting archive remote: - Installing tijsverkoyen/css-to-inline-styles (2.2.4): Extracting archive remote: - Installing symfony/routing (v5.4.0): Extracting archive remote: - Installing symfony/process (v5.4.0): Extracting archive remote: - Installing symfony/polyfill-php72 (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-intl-normalizer (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-intl-idn (v1.23.0): Extracting archive remote: - Installing symfony/mime (v5.4.0): Extracting archive remote: - Installing symfony/finder (v5.4.0): Extracting archive remote: - Installing symfony/polyfill-intl-grapheme (v1.23.1): Extracting archive remote: - Installing symfony/string (v6.0.1): Extracting archive remote: - Installing psr/container (1.1.2): Extracting archive remote: - Installing symfony/service-contracts (v2.4.1): Extracting archive remote: - Installing symfony/console (v5.4.1): Extracting archive remote: - Installing symfony/polyfill-iconv (v1.23.0): Extracting archive remote: - Installing egulias/email-validator (2.1.25): Extracting archive remote: - Installing swiftmailer/swiftmailer (v6.3.0): Extracting archive remote: - Installing symfony/polyfill-php81 (v1.23.0): Extracting archive remote: - Installing ramsey/collection (1.2.2): Extracting archive remote: - Installing brick/math (0.9.3): Extracting archive remote: - Installing ramsey/uuid (4.2.3): Extracting archive remote: - Installing psr/simple-cache (1.0.1): Extracting archive remote: - Installing opis/closure (3.6.2): Extracting archive remote: - Installing symfony/translation-contracts (v3.0.0): Extracting archive remote: - Installing symfony/translation (v6.0.1): Extracting archive remote: - Installing nesbot/carbon (2.55.2): Extracting archive remote: - Installing monolog/monolog (2.3.5): Extracting archive remote: - Installing league/mime-type-detection (1.9.0): Extracting archive remote: - Installing league/flysystem (1.1.9): Extracting archive remote: - Installing nette/utils (v3.2.6): Extracting archive remote: - Installing nette/schema (v1.2.2): Extracting archive remote: - Installing dflydev/dot-access-data (v3.0.1): Extracting archive remote: - Installing league/config (v1.1.1): Extracting archive remote: - Installing league/commonmark (2.1.0): Extracting archive remote: - Installing laravel/serializable-closure (v1.0.5): Extracting archive remote: - Installing laravel/framework (v8.76.2): Extracting archive remote: - Installing asm89/stack-cors (v2.0.3): Extracting archive remote: - Installing fruitcake/laravel-cors (v2.0.4): Extracting archive remote: - Installing psr/http-message (1.0.1): Extracting archive remote: - Installing psr/http-client (1.0.1): Extracting archive remote: - Installing ralouphie/getallheaders (3.0.3): Extracting archive remote: - Installing psr/http-factory (1.0.1): Extracting archive remote: - Installing guzzlehttp/psr7 (2.1.0): Extracting archive remote: - Installing guzzlehttp/promises (1.5.1): Extracting archive remote: - Installing guzzlehttp/guzzle (7.4.1): Extracting archive remote: - Installing laravel/sanctum (v2.13.0): Extracting archive remote: - Installing nikic/php-parser (v4.13.2): Extracting archive remote: - Installing psy/psysh (v0.10.12): Extracting archive remote: - Installing laravel/tinker (v2.6.3): Extracting archive remote: Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead. remote: Generating optimized autoload files remote: > Illuminate\Foundation\ComposerScripts::postAutoloadDump remote: > @php artisan package:discover --ansi remote: Discovered Package: fruitcake/laravel-cors remote: Discovered Package: laravel/sanctum remote: Discovered Package: laravel/tinker remote: Discovered Package: nesbot/carbon remote: Package manifest generated successfully. remote: 49 packages you are using are looking for funding. remote: Use the `composer fund` command to find out more! remote: -----> Preparing runtime environment... remote: NOTICE: No Procfile, using 'web: heroku-php-apache2'. remote: -----> Checking for additional extensions to install... remote: -----> Discovering process types remote: Procfile declares types -> web remote: remote: -----> Compressing... remote: Done: 19.8M remote: -----> Launching... remote: Released v3 remote: https://secret-stream-72395.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done. * [new branch] main -> main PS E:\wwwroot\weibo> |
16、应用程序现已部署。 确保至少有一个应用实例正在运行,现在通过应用程序名称生成的 URL 访问该应用程序。 作为一个方便的快捷方式,您可以按如下方式打开网站。如图14
1 2 3 4 5 6 | PS E:\wwwroot\weibo> heroku ps:scale web=1 » Warning: heroku update available from 7.53.0 to 7.59.2. Scaling dynos... done, now running web at 1:Free PS E:\wwwroot\weibo> heroku open » Warning: heroku update available from 7.53.0 to 7.59.2. PS E:\wwwroot\weibo> |
17、但是,在浏览器中自动打开网站:https://secret-stream-72395.herokuapp.com/ ,响应 403。如图15
1 2 | Forbidden You don't have permission to access this resource. |
18、在步骤 15 中提示:No Procfile, using ‘web: heroku-php-apache2’。Laravel 项目下新建一个 Procfile 文件,通过配置该文件来告诉 Heroku 应当使用什么命令来启动 Web 服务器。接着还需要将该文件纳入到 Git 版本控制中。报错:Push failed: cannot parse Procfile.。如图16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | PS E:\wwwroot\weibo> echo web: vendor/bin/heroku-php-apache2 public/ > Procfile PS E:\wwwroot\weibo> git add -A PS E:\wwwroot\weibo> git commit -m "Procfile for Heroku" [main 64256ed] Procfile for Heroku 2 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 Procfile PS E:\wwwroot\weibo> git push heroku main Enumerating objects: 6, done. Counting objects: 100% (6/6), done. Delta compression using up to 4 threads Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 496 bytes | 496.00 KiB/s, done. Total 4 (delta 2), reused 0 (delta 0), pack-reused 0 remote: Compressing source files... done. remote: Building source: remote: remote: -----> Building on the Heroku-20 stack remote: -----> Using buildpack: heroku/php remote: -----> PHP app detected remote: -----> Bootstrapping... remote: -----> Installing platform packages... remote: - php (8.1.1) remote: - ext-mbstring (bundled with php) remote: - composer (2.1.14) remote: - apache (2.4.51) remote: - nginx (1.20.2) remote: -----> Installing dependencies... remote: Composer version 2.1.14 2021-11-30 10:51:43 remote: Installing dependencies from lock file remote: Verifying lock file contents can be installed on current platform. remote: Package operations: 70 installs, 0 updates, 0 removals remote: - Installing doctrine/inflector (2.0.4): Extracting archive remote: - Installing doctrine/lexer (1.2.1): Extracting archive remote: - Installing symfony/polyfill-ctype (v1.23.0): Extracting archive remote: - Installing webmozart/assert (1.10.0): Extracting archive remote: - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive remote: - Installing symfony/polyfill-php80 (v1.23.1): Extracting archive remote: - Installing symfony/polyfill-php73 (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-mbstring (v1.23.1): Extracting archive remote: - Installing symfony/deprecation-contracts (v3.0.0): Extracting archive remote: - Installing symfony/http-foundation (v5.4.1): Extracting archive remote: - Installing psr/event-dispatcher (1.0.0): Extracting archive remote: - Installing symfony/event-dispatcher-contracts (v3.0.0): Extracting archive remote: - Installing symfony/event-dispatcher (v6.0.1): Extracting archive remote: - Installing symfony/var-dumper (v5.4.1): Extracting archive remote: - Installing psr/log (2.0.0): Extracting archive remote: - Installing symfony/error-handler (v5.4.1): Extracting archive remote: - Installing symfony/http-kernel (v5.4.1): Extracting archive remote: - Installing voku/portable-ascii (1.5.6): Extracting archive remote: - Installing phpoption/phpoption (1.8.1): Extracting archive remote: - Installing graham-campbell/result-type (v1.0.4): Extracting archive remote: - Installing vlucas/phpdotenv (v5.4.1): Extracting archive remote: - Installing symfony/css-selector (v6.0.1): Extracting archive remote: - Installing tijsverkoyen/css-to-inline-styles (2.2.4): Extracting archive remote: - Installing symfony/routing (v5.4.0): Extracting archive remote: - Installing symfony/process (v5.4.0): Extracting archive remote: - Installing symfony/polyfill-php72 (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-intl-normalizer (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-intl-idn (v1.23.0): Extracting archive remote: - Installing symfony/mime (v5.4.0): Extracting archive remote: - Installing symfony/finder (v5.4.0): Extracting archive remote: - Installing symfony/polyfill-intl-grapheme (v1.23.1): Extracting archive remote: - Installing symfony/string (v6.0.1): Extracting archive remote: - Installing psr/container (1.1.2): Extracting archive remote: - Installing symfony/service-contracts (v2.4.1): Extracting archive remote: - Installing symfony/console (v5.4.1): Extracting archive remote: - Installing symfony/polyfill-iconv (v1.23.0): Extracting archive remote: - Installing egulias/email-validator (2.1.25): Extracting archive remote: - Installing swiftmailer/swiftmailer (v6.3.0): Extracting archive remote: - Installing symfony/polyfill-php81 (v1.23.0): Extracting archive remote: - Installing ramsey/collection (1.2.2): Extracting archive remote: - Installing brick/math (0.9.3): Extracting archive remote: - Installing ramsey/uuid (4.2.3): Extracting archive remote: - Installing psr/simple-cache (1.0.1): Extracting archive remote: - Installing opis/closure (3.6.2): Extracting archive remote: - Installing symfony/translation-contracts (v3.0.0): Extracting archive remote: - Installing symfony/translation (v6.0.1): Extracting archive remote: - Installing nesbot/carbon (2.55.2): Extracting archive remote: - Installing monolog/monolog (2.3.5): Extracting archive remote: - Installing league/mime-type-detection (1.9.0): Extracting archive remote: - Installing league/flysystem (1.1.9): Extracting archive remote: - Installing nette/utils (v3.2.6): Extracting archive remote: - Installing nette/schema (v1.2.2): Extracting archive remote: - Installing dflydev/dot-access-data (v3.0.1): Extracting archive remote: - Installing league/config (v1.1.1): Extracting archive remote: - Installing league/commonmark (2.1.0): Extracting archive remote: - Installing laravel/serializable-closure (v1.0.5): Extracting archive remote: - Installing laravel/framework (v8.76.2): Extracting archive remote: - Installing asm89/stack-cors (v2.0.3): Extracting archive remote: - Installing fruitcake/laravel-cors (v2.0.4): Extracting archive remote: - Installing psr/http-message (1.0.1): Extracting archive remote: - Installing psr/http-client (1.0.1): Extracting archive remote: - Installing ralouphie/getallheaders (3.0.3): Extracting archive remote: - Installing psr/http-factory (1.0.1): Extracting archive remote: - Installing guzzlehttp/psr7 (2.1.0): Extracting archive remote: - Installing guzzlehttp/promises (1.5.1): Extracting archive remote: - Installing guzzlehttp/guzzle (7.4.1): Extracting archive remote: - Installing laravel/sanctum (v2.13.0): Extracting archive remote: - Installing nikic/php-parser (v4.13.2): Extracting archive remote: - Installing psy/psysh (v0.10.12): Extracting archive remote: - Installing laravel/tinker (v2.6.3): Extracting archive remote: Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead. remote: Generating optimized autoload files remote: > Illuminate\Foundation\ComposerScripts::postAutoloadDump remote: > @php artisan package:discover --ansi remote: Discovered Package: fruitcake/laravel-cors remote: Discovered Package: laravel/sanctum remote: Discovered Package: laravel/tinker remote: Discovered Package: nesbot/carbon remote: Package manifest generated successfully. remote: 49 packages you are using are looking for funding. remote: Use the `composer fund` command to find out more! remote: -----> Preparing runtime environment... remote: -----> Checking for additional extensions to install... remote: -----> Discovering process types remote: remote: ! Push failed: cannot parse Procfile. remote: ! Please try pushing again. remote: ! If the problem persists, see https://help.heroku.com/ and provide Request ID f09b381f-8217-327d-d121-119f1e8d0c31. remote: remote: remote: Verifying deploy... remote: remote: ! Push rejected to secret-stream-72395. remote: ! [remote rejected] main -> main (pre-receive hook declined) error: failed to push some refs to 'https://git.heroku.com/secret-stream-72395.git' PS E:\wwwroot\weibo> |
19、查看文件 Procfile 的内容,如图17
1 2 3 | web: vendor/bin/heroku-php-apache2 public/ |
20、参考 Getting Started with Laravel on Heroku:https://devcenter.heroku.com/articles/getting-started-with-laravel 。查看文件 Procfile 的内容,如图18
1 2 3 4 5 | PS E:\wwwroot\weibo> echo "web: vendor/bin/heroku-php-apache2 public/" > Procfile PS E:\wwwroot\weibo> git add . PS E:\wwwroot\weibo> git commit -m "Procfile for Heroku" [main a30f3dd] Procfile for Heroku 1 file changed, 0 insertions(+), 0 deletions(-) |
21、设置 Laravel 加密密钥,使用 Laravel 自带的 artisan 命令来生成 App Key。如图19
1 2 3 | PS E:\wwwroot\weibo> php artisan key:generate --show base64:qtlcYLZF38gHDz/XhCE/cc0Q+BwByRygnVpfWwtRipA= PS E:\wwwroot\weibo> |
22、基于生成的 App Key ,运行该命令行来完成配置。如图20
1 2 3 4 5 | PS E:\wwwroot\weibo> heroku config:set APP_KEY=base64:qtlcYLZF38gHDz/XhCE/cc0Q+BwByRygnVpfWwtRipA= » Warning: heroku update available from 7.53.0 to 7.59.2. Setting APP_KEY and restarting ⬢ secret-stream-72395... done, v4 APP_KEY: base64:qtlcYLZF38gHDz/XhCE/cc0Q+BwByRygnVpfWwtRipA= PS E:\wwwroot\weibo> |
23、推送时,仍然报错:Push failed: cannot parse Procfile.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | PS E:\wwwroot\weibo> git push heroku main:main Enumerating objects: 19, done. Counting objects: 100% (19/19), done. Delta compression using up to 4 threads Compressing objects: 100% (17/17), done. Writing objects: 100% (17/17), 1.59 KiB | 542.00 KiB/s, done. Total 17 (delta 8), reused 0 (delta 0), pack-reused 0 remote: Compressing source files... done. remote: Building source: remote: remote: -----> Building on the Heroku-20 stack remote: -----> Using buildpack: heroku/php remote: -----> PHP app detected remote: -----> Bootstrapping... remote: -----> Installing platform packages... remote: - php (8.1.1) remote: - ext-mbstring (bundled with php) remote: - composer (2.1.14) remote: - apache (2.4.51) remote: - nginx (1.20.2) remote: -----> Installing dependencies... remote: Composer version 2.1.14 2021-11-30 10:51:43 remote: Installing dependencies from lock file remote: Verifying lock file contents can be installed on current platform. remote: Package operations: 70 installs, 0 updates, 0 removals remote: - Installing doctrine/inflector (2.0.4): Extracting archive remote: - Installing doctrine/lexer (1.2.1): Extracting archive remote: - Installing symfony/polyfill-ctype (v1.23.0): Extracting archive remote: - Installing webmozart/assert (1.10.0): Extracting archive remote: - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive remote: - Installing symfony/polyfill-php80 (v1.23.1): Extracting archive remote: - Installing symfony/polyfill-php73 (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-mbstring (v1.23.1): Extracting archive remote: - Installing symfony/deprecation-contracts (v3.0.0): Extracting archive remote: - Installing symfony/http-foundation (v5.4.1): Extracting archive remote: - Installing psr/event-dispatcher (1.0.0): Extracting archive remote: - Installing symfony/event-dispatcher-contracts (v3.0.0): Extracting archive remote: - Installing symfony/event-dispatcher (v6.0.1): Extracting archive remote: - Installing symfony/var-dumper (v5.4.1): Extracting archive remote: - Installing psr/log (2.0.0): Extracting archive remote: - Installing symfony/error-handler (v5.4.1): Extracting archive remote: - Installing symfony/http-kernel (v5.4.1): Extracting archive remote: - Installing voku/portable-ascii (1.5.6): Extracting archive remote: - Installing phpoption/phpoption (1.8.1): Extracting archive remote: - Installing graham-campbell/result-type (v1.0.4): Extracting archive remote: - Installing vlucas/phpdotenv (v5.4.1): Extracting archive remote: - Installing symfony/css-selector (v6.0.1): Extracting archive remote: - Installing tijsverkoyen/css-to-inline-styles (2.2.4): Extracting archive remote: - Installing symfony/routing (v5.4.0): Extracting archive remote: - Installing symfony/process (v5.4.0): Extracting archive remote: - Installing symfony/polyfill-php72 (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-intl-normalizer (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-intl-idn (v1.23.0): Extracting archive remote: - Installing symfony/mime (v5.4.0): Extracting archive remote: - Installing symfony/finder (v5.4.0): Extracting archive remote: - Installing symfony/polyfill-intl-grapheme (v1.23.1): Extracting archive remote: - Installing symfony/string (v6.0.1): Extracting archive remote: - Installing psr/container (1.1.2): Extracting archive remote: - Installing symfony/service-contracts (v2.4.1): Extracting archive remote: - Installing symfony/console (v5.4.1): Extracting archive remote: - Installing symfony/polyfill-iconv (v1.23.0): Extracting archive remote: - Installing egulias/email-validator (2.1.25): Extracting archive remote: - Installing swiftmailer/swiftmailer (v6.3.0): Extracting archive remote: - Installing symfony/polyfill-php81 (v1.23.0): Extracting archive remote: - Installing ramsey/collection (1.2.2): Extracting archive remote: - Installing brick/math (0.9.3): Extracting archive remote: - Installing ramsey/uuid (4.2.3): Extracting archive remote: - Installing psr/simple-cache (1.0.1): Extracting archive remote: - Installing opis/closure (3.6.2): Extracting archive remote: - Installing symfony/translation-contracts (v3.0.0): Extracting archive remote: - Installing symfony/translation (v6.0.1): Extracting archive remote: - Installing nesbot/carbon (2.55.2): Extracting archive remote: - Installing monolog/monolog (2.3.5): Extracting archive remote: - Installing league/mime-type-detection (1.9.0): Extracting archive remote: - Installing league/flysystem (1.1.9): Extracting archive remote: - Installing nette/utils (v3.2.6): Extracting archive remote: - Installing nette/schema (v1.2.2): Extracting archive remote: - Installing dflydev/dot-access-data (v3.0.1): Extracting archive remote: - Installing league/config (v1.1.1): Extracting archive remote: - Installing league/commonmark (2.1.0): Extracting archive remote: - Installing laravel/serializable-closure (v1.0.5): Extracting archive remote: - Installing laravel/framework (v8.76.2): Extracting archive remote: - Installing asm89/stack-cors (v2.0.3): Extracting archive remote: - Installing fruitcake/laravel-cors (v2.0.4): Extracting archive remote: - Installing psr/http-message (1.0.1): Extracting archive remote: - Installing psr/http-client (1.0.1): Extracting archive remote: - Installing ralouphie/getallheaders (3.0.3): Extracting archive remote: - Installing psr/http-factory (1.0.1): Extracting archive remote: - Installing guzzlehttp/psr7 (2.1.0): Extracting archive remote: - Installing guzzlehttp/promises (1.5.1): Extracting archive remote: - Installing guzzlehttp/guzzle (7.4.1): Extracting archive remote: - Installing laravel/sanctum (v2.13.0): Extracting archive remote: - Installing nikic/php-parser (v4.13.2): Extracting archive remote: - Installing psy/psysh (v0.10.12): Extracting archive remote: - Installing laravel/tinker (v2.6.3): Extracting archive remote: Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead. remote: Generating optimized autoload files remote: > Illuminate\Foundation\ComposerScripts::postAutoloadDump remote: > @php artisan package:discover --ansi remote: Discovered Package: fruitcake/laravel-cors remote: Discovered Package: laravel/sanctum remote: Discovered Package: laravel/tinker remote: Discovered Package: nesbot/carbon remote: Package manifest generated successfully. remote: 49 packages you are using are looking for funding. remote: Use the `composer fund` command to find out more! remote: -----> Preparing runtime environment... remote: -----> Checking for additional extensions to install... remote: -----> Discovering process types remote: remote: ! Push failed: cannot parse Procfile. remote: ! Please try pushing again. remote: ! If the problem persists, see https://help.heroku.com/ and provide Request ID 691561db-a116-53f5-a4e5-0100a3777ce9. remote: remote: remote: ! remote: ! ## Warning - The same version of this code has already been built: a30f3dde79d674408b2fb440cda5f9dbeb2204fe remote: ! remote: ! We have detected that you have triggered a build from source code with version a30f3dde79d674408b2fb440cda5f9dbeb2204fe remote: ! at least twice. One common cause of this behavior is attempting to deploy code from a different branch. remote: ! remote: ! If you are developing on a branch and deploying via git you must run: remote: ! remote: ! git push heroku <branchname>:main remote: ! remote: ! This article goes into details on the behavior: remote: remote: Verifying deploy... remote: remote: ! Push rejected to secret-stream-72395. remote: ! [remote rejected] main -> main (pre-receive hook declined) error: failed to push some refs to 'https://git.heroku.com/secret-stream-72395.git' PS E:\wwwroot\weibo> |
24、将文件编码另存为 UTF-8 。如图21
25、推送成功,且打开网址:https://secret-stream-72395.herokuapp.com/ ,响应 200。如图22
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | PS E:\wwwroot\weibo> git add . PS E:\wwwroot\weibo> git commit -m "Procfile for Heroku" [main 362c878] Procfile for Heroku 1 file changed, 0 insertions(+), 0 deletions(-) PS E:\wwwroot\weibo> git push heroku main Enumerating objects: 22, done. Counting objects: 100% (22/22), done. Delta compression using up to 4 threads Compressing objects: 100% (19/19), done. Writing objects: 100% (20/20), 1.84 KiB | 470.00 KiB/s, done. Total 20 (delta 9), reused 0 (delta 0), pack-reused 0 remote: Compressing source files... done. remote: Building source: remote: remote: -----> Building on the Heroku-20 stack remote: -----> Using buildpack: heroku/php remote: -----> PHP app detected remote: -----> Bootstrapping... remote: -----> Installing platform packages... remote: - php (8.1.1) remote: - ext-mbstring (bundled with php) remote: - composer (2.1.14) remote: - apache (2.4.51) remote: - nginx (1.20.2) remote: -----> Installing dependencies... remote: Composer version 2.1.14 2021-11-30 10:51:43 remote: Installing dependencies from lock file remote: Verifying lock file contents can be installed on current platform. remote: Package operations: 70 installs, 0 updates, 0 removals remote: - Installing doctrine/inflector (2.0.4): Extracting archive remote: - Installing doctrine/lexer (1.2.1): Extracting archive remote: - Installing symfony/polyfill-ctype (v1.23.0): Extracting archive remote: - Installing webmozart/assert (1.10.0): Extracting archive remote: - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive remote: - Installing symfony/polyfill-php80 (v1.23.1): Extracting archive remote: - Installing symfony/polyfill-php73 (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-mbstring (v1.23.1): Extracting archive remote: - Installing symfony/deprecation-contracts (v3.0.0): Extracting archive remote: - Installing symfony/http-foundation (v5.4.1): Extracting archive remote: - Installing psr/event-dispatcher (1.0.0): Extracting archive remote: - Installing symfony/event-dispatcher-contracts (v3.0.0): Extracting archive remote: - Installing symfony/event-dispatcher (v6.0.1): Extracting archive remote: - Installing symfony/var-dumper (v5.4.1): Extracting archive remote: - Installing psr/log (2.0.0): Extracting archive remote: - Installing symfony/error-handler (v5.4.1): Extracting archive remote: - Installing symfony/http-kernel (v5.4.1): Extracting archive remote: - Installing voku/portable-ascii (1.5.6): Extracting archive remote: - Installing phpoption/phpoption (1.8.1): Extracting archive remote: - Installing graham-campbell/result-type (v1.0.4): Extracting archive remote: - Installing vlucas/phpdotenv (v5.4.1): Extracting archive remote: - Installing symfony/css-selector (v6.0.1): Extracting archive remote: - Installing tijsverkoyen/css-to-inline-styles (2.2.4): Extracting archive remote: - Installing symfony/routing (v5.4.0): Extracting archive remote: - Installing symfony/process (v5.4.0): Extracting archive remote: - Installing symfony/polyfill-php72 (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-intl-normalizer (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-intl-idn (v1.23.0): Extracting archive remote: - Installing symfony/mime (v5.4.0): Extracting archive remote: - Installing symfony/finder (v5.4.0): Extracting archive remote: - Installing symfony/polyfill-intl-grapheme (v1.23.1): Extracting archive remote: - Installing symfony/string (v6.0.1): Extracting archive remote: - Installing psr/container (1.1.2): Extracting archive remote: - Installing symfony/service-contracts (v2.4.1): Extracting archive remote: - Installing symfony/console (v5.4.1): Extracting archive remote: - Installing symfony/polyfill-iconv (v1.23.0): Extracting archive remote: - Installing egulias/email-validator (2.1.25): Extracting archive remote: - Installing swiftmailer/swiftmailer (v6.3.0): Extracting archive remote: - Installing symfony/polyfill-php81 (v1.23.0): Extracting archive remote: - Installing ramsey/collection (1.2.2): Extracting archive remote: - Installing brick/math (0.9.3): Extracting archive remote: - Installing ramsey/uuid (4.2.3): Extracting archive remote: - Installing psr/simple-cache (1.0.1): Extracting archive remote: - Installing opis/closure (3.6.2): Extracting archive remote: - Installing symfony/translation-contracts (v3.0.0): Extracting archive remote: - Installing symfony/translation (v6.0.1): Extracting archive remote: - Installing nesbot/carbon (2.55.2): Extracting archive remote: - Installing monolog/monolog (2.3.5): Extracting archive remote: - Installing league/mime-type-detection (1.9.0): Extracting archive remote: - Installing league/flysystem (1.1.9): Extracting archive remote: - Installing nette/utils (v3.2.6): Extracting archive remote: - Installing nette/schema (v1.2.2): Extracting archive remote: - Installing dflydev/dot-access-data (v3.0.1): Extracting archive remote: - Installing league/config (v1.1.1): Extracting archive remote: - Installing league/commonmark (2.1.0): Extracting archive remote: - Installing laravel/serializable-closure (v1.0.5): Extracting archive remote: - Installing laravel/framework (v8.76.2): Extracting archive remote: - Installing asm89/stack-cors (v2.0.3): Extracting archive remote: - Installing fruitcake/laravel-cors (v2.0.4): Extracting archive remote: - Installing psr/http-message (1.0.1): Extracting archive remote: - Installing psr/http-client (1.0.1): Extracting archive remote: - Installing ralouphie/getallheaders (3.0.3): Extracting archive remote: - Installing psr/http-factory (1.0.1): Extracting archive remote: - Installing guzzlehttp/psr7 (2.1.0): Extracting archive remote: - Installing guzzlehttp/promises (1.5.1): Extracting archive remote: - Installing guzzlehttp/guzzle (7.4.1): Extracting archive remote: - Installing nikic/php-parser (v4.13.2): Extracting archive remote: - Installing psy/psysh (v0.10.12): Extracting archive remote: - Installing laravel/tinker (v2.6.3): Extracting archive remote: Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead. remote: Generating optimized autoload files remote: > Illuminate\Foundation\ComposerScripts::postAutoloadDump remote: > @php artisan package:discover --ansi remote: Discovered Package: fruitcake/laravel-cors remote: Discovered Package: laravel/sanctum remote: Discovered Package: laravel/tinker remote: Discovered Package: nesbot/carbon remote: Package manifest generated successfully. remote: 49 packages you are using are looking for funding. remote: Use the `composer fund` command to find out more! remote: -----> Preparing runtime environment... remote: -----> Checking for additional extensions to install... remote: -----> Discovering process types remote: Procfile declares types -> web remote: remote: -----> Compressing... remote: Done: 19.8M remote: -----> Launching... remote: Released v6 remote: https://secret-stream-72395.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done. e72b466..362c878 main -> main PS E:\wwwroot\weibo> heroku open » Warning: heroku update available from 7.53.0 to 7.59.2. PS E:\wwwroot\weibo> |
26、但是,在提交表单,写入数据至 MySQL 时,响应 500 服务器错误,原因在于数据库还不存在。如图23
27、在 Heroku 上使用 PostgreSQL 来作为我们应用的数据库。安装 PostgreSQL 扩展。Heroku 将为我们生成一个唯一的数据库 URL – DATABASE_URL,我们可以通过命令:heroku config 查看 Heroku 的所有配置信息。如图24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | PS E:\wwwroot\weibo> heroku addons:add heroku-postgresql:hobby-dev » Warning: heroku update available from 7.53.0 to 7.59.2. Creating heroku-postgresql:hobby-dev on ⬢ secret-stream-72395... free Database has been created and is available ! This database is empty. If upgrading, you can transfer ! data from another database with pg:copy Created postgresql-parallel-13694 as DATABASE_URL Use heroku addons:docs heroku-postgresql to view documentation PS E:\wwwroot\weibo> heroku config » Warning: heroku update available from 7.53.0 to 7.59.2. === secret-stream-72395 Config Vars APP_KEY: base64:TXoum9anbYcE/VGilCjxrSQQ5E4cR5UVb+55SjIsbg0= DATABASE_URL: postgres://eayusxxdstiniz:31d9e092c4c8d1740380641299d36711b04e72b98e2f92b9be4253153087bbea@ec2-52-200-28-255.compute-1.amazonaws.com:5432/d9nb3l2ot2cutp PS E:\wwwroot\weibo> |
28、在本地开发中,我们使用了 MySQL 来作为数据库储存,但在 Heroku 环境上我们要改为使用 PostgreSQL 来作为数据库储存。因此在进行数据库设置时,我们需要对当前环境进行判断。如果环境为本地环境,则使用 MySQL 数据库,若为 Heroku 环境,则使用 PostgreSQL 数据库。我们可以通过为 Heroku 新增一个 IS_IN_HEROKU 配置项来判断应用是否运行在 Heroku 上。一般来说,应用的数据库都在 config/database.php 中进行配置,因此我们需要针对该配置文件,来为不同环境的数据库连接方式定义一个帮助方法,以便根据应用不同的运行环境来指定数据库配置信息,我们需要新建一个 helpers.php 文件并写入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php function get_db_config() { if ( getenv ( 'IS_IN_HEROKU' )) { $url = parse_url ( getenv ( "DATABASE_URL" )); return $db_config = [ 'connection' => 'pgsql' , 'host' => $url [ "host" ], 'database' => substr ( $url [ "path" ], 1), 'username' => $url [ "user" ], 'password' => $url [ "pass" ], ]; } else { return $db_config = [ 'connection' => env( 'DB_CONNECTION' , 'mysql' ), 'host' => env( 'DB_HOST' , 'localhost' ), 'database' => env( 'DB_DATABASE' , 'forge' ), 'username' => env( 'DB_USERNAME' , 'forge' ), 'password' => env( 'DB_PASSWORD' , '' ), ]; } } |
29、新增 helpers.php 文件之后,还需要在项目根目录下 composer.json 文件中的 autoload 选项里 files 字段加入该文件。如图25
1 2 3 4 5 6 7 8 9 10 | "autoload": { "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" }, "files": [ "app/helpers.php" ] }, |
30、修改保存后运行以下命令进行重新加载文件即可,如果有可能影响到本地环境的程序运行,建议在 Sail 环境中执行相应命令。如图26
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | wangqiang@DESKTOP-QLPK8QM:/mnt/e/wwwroot/weibo$ sail composer dump-autoload Generating optimized autoload files > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover --ansi Discovered Package: facade/ignition Discovered Package: fruitcake/laravel-cors Discovered Package: laravel/sail Discovered Package: laravel/sanctum Discovered Package: laravel/tinker Discovered Package: laravel/ui Discovered Package: nesbot/carbon Discovered Package: nunomaduro/collision Discovered Package: overtrue/laravel-lang Package manifest generated successfully. Generated optimized autoload files containing 5027 classes wangqiang@DESKTOP-QLPK8QM:/mnt/e/wwwroot/weibo$ |
31、现在,让我们使用刚刚定义好的 get_db_config 方法对数据库进行配置。调整数据库配置文件,总计就 2 处改动。如图28
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php use Illuminate\Support\Str; $db_config = get_db_config(); return [ /* |-------------------------------------------------------------------------- | Default Database Connection Name |-------------------------------------------------------------------------- | | Here you may specify which of the database connections below you wish | to use as your default connection for all database work. Of course | you may use many connections at once using the Database library. | */ 'default' => $db_config [ 'connection' ], |
32、改动的代码进行提交,并推送到 GitHub 和 Heroku 上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | wangqiang@DESKTOP-QLPK8QM:/mnt/e/wwwroot/weibo$ git push Enumerating objects: 12, done. Counting objects: 100% (12/12), done. Delta compression using up to 4 threads Compressing objects: 100% (7/7), done. Writing objects: 100% (7/7), 936 bytes | 58.00 KiB/s, done. Total 7 (delta 5), reused 0 (delta 0) remote: Resolving deltas: 100% (5/5), completed with 5 local objects. 876eb29..173fc8d sign-up -> sign-up wangqiang@DESKTOP-QLPK8QM:/mnt/e/wwwroot/weibo$ git checkout main Switched to branch 'main' Your branch is up to date with 'origin/main'. wangqiang@DESKTOP-QLPK8QM:/mnt/e/wwwroot/weibo$ git merge sign-up Merge made by the 'recursive' strategy. app/helpers.php | 24 ++++++++++++++++++++++++ composer.json | 5 ++++- config/database.php | 4 +++- 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 app/helpers.php wangqiang@DESKTOP-QLPK8QM:/mnt/e/wwwroot/weibo$ git push Enumerating objects: 4, done. Counting objects: 100% (4/4), done. Delta compression using up to 4 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 300 bytes | 33.00 KiB/s, done. Total 2 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), completed with 1 local object. cd4e270..1e23962 main -> main wangqiang@DESKTOP-QLPK8QM:/mnt/e/wwwroot/weibo$ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | PS E:\wwwroot\weibo> git status On branch main Your branch is up to date with 'origin/main'. nothing to commit, working tree clean PS E:\wwwroot\weibo> git push heroku main Enumerating objects: 19, done. Counting objects: 100% (15/15), done. Delta compression using up to 4 threads Compressing objects: 100% (9/9), done. Writing objects: 100% (9/9), 1.13 KiB | 576.00 KiB/s, done. Total 9 (delta 6), reused 0 (delta 0), pack-reused 0 remote: Compressing source files... done. remote: Building source: remote: remote: -----> Building on the Heroku-20 stack remote: -----> Using buildpack: heroku/php remote: -----> PHP app detected remote: -----> Bootstrapping... remote: -----> Installing platform packages... remote: - php (8.1.1) remote: - ext-mbstring (bundled with php) remote: - composer (2.1.14) remote: - apache (2.4.51) remote: - nginx (1.20.2) remote: -----> Installing dependencies... remote: Composer version 2.1.14 2021-11-30 10:51:43 remote: Installing dependencies from lock file remote: Verifying lock file contents can be installed on current platform. remote: Package operations: 72 installs, 0 updates, 0 removals remote: - Installing doctrine/inflector (2.0.4): Extracting archive remote: - Installing doctrine/lexer (1.2.1): Extracting archive remote: - Installing symfony/polyfill-ctype (v1.23.0): Extracting archive remote: - Installing webmozart/assert (1.10.0): Extracting archive remote: - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive remote: - Installing symfony/polyfill-php80 (v1.23.1): Extracting archive remote: - Installing symfony/polyfill-php73 (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-mbstring (v1.23.1): Extracting archive remote: - Installing symfony/deprecation-contracts (v3.0.0): Extracting archive remote: - Installing symfony/http-foundation (v5.4.1): Extracting archive remote: - Installing psr/event-dispatcher (1.0.0): Extracting archive remote: - Installing symfony/event-dispatcher-contracts (v3.0.0): Extracting archive remote: - Installing symfony/event-dispatcher (v6.0.1): Extracting archive remote: - Installing symfony/var-dumper (v5.4.1): Extracting archive remote: - Installing psr/log (2.0.0): Extracting archive remote: - Installing symfony/error-handler (v5.4.1): Extracting archive remote: - Installing symfony/http-kernel (v5.4.1): Extracting archive remote: - Installing voku/portable-ascii (1.5.6): Extracting archive remote: - Installing phpoption/phpoption (1.8.1): Extracting archive remote: - Installing graham-campbell/result-type (v1.0.4): Extracting archive remote: - Installing vlucas/phpdotenv (v5.4.1): Extracting archive remote: - Installing symfony/css-selector (v6.0.1): Extracting archive remote: - Installing tijsverkoyen/css-to-inline-styles (2.2.4): Extracting archive remote: - Installing symfony/routing (v5.4.0): Extracting archive remote: - Installing symfony/process (v5.4.0): Extracting archive remote: - Installing symfony/polyfill-php72 (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-intl-normalizer (v1.23.0): Extracting archive remote: - Installing symfony/polyfill-intl-idn (v1.23.0): Extracting archive remote: - Installing symfony/mime (v5.4.0): Extracting archive remote: - Installing symfony/finder (v5.4.0): Extracting archive remote: - Installing symfony/polyfill-intl-grapheme (v1.23.1): Extracting archive remote: - Installing symfony/string (v6.0.1): Extracting archive remote: - Installing psr/container (1.1.2): Extracting archive remote: - Installing symfony/service-contracts (v2.4.1): Extracting archive remote: - Installing symfony/console (v5.4.1): Extracting archive remote: - Installing symfony/polyfill-iconv (v1.23.0): Extracting archive remote: - Installing egulias/email-validator (2.1.25): Extracting archive remote: - Installing swiftmailer/swiftmailer (v6.3.0): Extracting archive remote: - Installing symfony/polyfill-php81 (v1.23.0): Extracting archive remote: - Installing ramsey/collection (1.2.2): Extracting archive remote: - Installing brick/math (0.9.3): Extracting archive remote: - Installing ramsey/uuid (4.2.3): Extracting archive remote: - Installing psr/simple-cache (1.0.1): Extracting archive remote: - Installing opis/closure (3.6.2): Extracting archive remote: - Installing symfony/translation-contracts (v3.0.0): Extracting archive remote: - Installing symfony/translation (v6.0.1): Extracting archive remote: - Installing nesbot/carbon (2.55.2): Extracting archive remote: - Installing monolog/monolog (2.3.5): Extracting archive remote: - Installing league/mime-type-detection (1.9.0): Extracting archive remote: - Installing league/flysystem (1.1.9): Extracting archive remote: - Installing nette/utils (v3.2.6): Extracting archive remote: - Installing nette/schema (v1.2.2): Extracting archive remote: - Installing dflydev/dot-access-data (v3.0.1): Extracting archive remote: - Installing league/config (v1.1.1): Extracting archive remote: - Installing league/commonmark (2.1.0): Extracting archive remote: - Installing laravel/serializable-closure (v1.0.5): Extracting archive remote: - Installing laravel/framework (v8.76.2): Extracting archive remote: - Installing asm89/stack-cors (v2.0.3): Extracting archive remote: - Installing fruitcake/laravel-cors (v2.0.4): Extracting archive remote: - Installing psr/http-message (1.0.1): Extracting archive remote: - Installing psr/http-client (1.0.1): Extracting archive remote: - Installing ralouphie/getallheaders (3.0.3): Extracting archive remote: - Installing psr/http-factory (1.0.1): Extracting archive remote: - Installing guzzlehttp/psr7 (2.1.0): Extracting archive remote: - Installing guzzlehttp/promises (1.5.1): Extracting archive remote: - Installing guzzlehttp/guzzle (7.4.1): Extracting archive remote: - Installing laravel/sanctum (v2.13.0): Extracting archive remote: - Installing nikic/php-parser (v4.13.2): Extracting archive remote: - Installing psy/psysh (v0.10.12): Extracting archive remote: - Installing laravel/tinker (v2.6.3): Extracting archive remote: - Installing laravel-lang/lang (5.0.0): Extracting archive remote: - Installing overtrue/laravel-lang (4.2.2): Extracting archive remote: Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead. remote: Generating optimized autoload files remote: > Illuminate\Foundation\ComposerScripts::postAutoloadDump remote: > @php artisan package:discover --ansi remote: Discovered Package: fruitcake/laravel-cors remote: Discovered Package: laravel/sanctum remote: Discovered Package: laravel/tinker remote: Discovered Package: nesbot/carbon remote: Discovered Package: overtrue/laravel-lang remote: Package manifest generated successfully. remote: 50 packages you are using are looking for funding. remote: Use the `composer fund` command to find out more! remote: -----> Preparing runtime environment... remote: -----> Checking for additional extensions to install... remote: -----> Discovering process types remote: Procfile declares types -> web remote: remote: -----> Compressing... remote: Done: 19.9M remote: -----> Launching... remote: Released v10 remote: https://secret-stream-72395.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done. cd4e270..1e23962 main -> main PS E:\wwwroot\weibo> |
33、我们可以使用 heroku run 在 Heroku 运行 Laravel 的指定命令。现在我们需要在 Heroku 上执行迁移,生成用户表,可通过下面命令来完成,报错:SQLSTATE[22023]: Invalid parameter value: 7 ERROR: invalid value for parameter “client_encoding”: “utf8mb4” 。如图28
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | PS E:\wwwroot\weibo> heroku run php artisan migrate » Warning: heroku update available from 7.53.0 to 7.59.2. Running php artisan migrate on ⬢ secret-stream-72395... up, run.1841 (Free) ************************************** * Application In Production! * ************************************** Do you really wish to run this command? (yes/no) [no]: > yes In Connection.php line 703: SQLSTATE[22023]: Invalid parameter value: 7 ERROR: invalid value for parameter "client_encoding": "utf8mb4" (SQL: select * from information_schema.tables where table_schema = public and table_name = migrations and table_type = 'B ASE TABLE') In PostgresConnector.php line 68: SQLSTATE[22023]: Invalid parameter value: 7 ERROR: invalid value for parameter "client_encoding": "utf8mb4" PS E:\wwwroot\weibo> |
34、再次调整数据库配置文件,之前 pgsql 相关的配置未修改到。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 'pgsql' => [ 'driver' => 'pgsql' , 'host' => $db_config [ 'host' ], 'port' => env( 'DB_PORT' , '5432' ), 'database' => $db_config [ 'database' ], 'username' => $db_config [ 'username' ], 'password' => $db_config [ 'password' ], 'charset' => 'utf8' , 'prefix' => '' , 'prefix_indexes' => true, 'schema' => 'public' , 'sslmode' => 'prefer' , ], |
35、执行命令:heroku config:add DB_CONNECTION=pgsql 。再次执行迁移时报错已经不一样了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | » Warning: heroku update available from 7.53.0 to 7.59.2. DB_CONNECTION: pgsql PS E:\wwwroot\weibo> heroku run php artisan migrate » Warning: heroku update available from 7.53.0 to 7.59.2. Running php artisan migrate on ⬢ secret-stream-72395... up, run.7170 (Free) ************************************** * Application In Production! * ************************************** Do you really wish to run this command? (yes/no) [no]: > yes In Connection.php line 703: SQLSTATE[08006] [7] connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused Is the server running on that host and accepting TCP/IP connections? (SQL: select * from information_schema.tables where table_schema = public and table_name = migrations and table_type = 'BASE TABLE') In Connector.php line 70: SQLSTATE[08006] [7] connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused Is the server running on that host and accepting TCP/IP connections? PS E:\wwwroot\weibo> git push heroku main Everything up-to-date PS E:\wwwroot\weibo> heroku run php artisan migrate » Warning: heroku update available from 7.53.0 to 7.59.2. Running php artisan migrate on ⬢ secret-stream-72395... up, run.6564 (Free) ************************************** * Application In Production! * ************************************** Do you really wish to run this command? (yes/no) [no]: > yes In Connection.php line 703: SQLSTATE[08006] [7] connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused Is the server running on that host and accepting TCP/IP connections? (SQL: select * from information_schema.tables where table_schema = public and table_name = migrations and table_type = 'BASE TABLE') In Connector.php line 70: SQLSTATE[08006] [7] connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused Is the server running on that host and accepting TCP/IP connections? PS E:\wwwroot\weibo> |
36、最后找到根源在于漏掉了在 Heroku 新增一个 IS_IN_HEROKU 配置项来判断应用是否运行在 Heroku 上。迁移成功。如图29
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | PS E:\wwwroot\weibo> heroku config:set IS_IN_HEROKU=true » Warning: heroku update available from 7.53.0 to 7.59.2. Setting IS_IN_HEROKU and restarting ⬢ secret-stream-72395... done, v16 IS_IN_HEROKU: true PS E:\wwwroot\weibo> heroku run php artisan migrate » Warning: heroku update available from 7.53.0 to 7.59.2. Running php artisan migrate on ⬢ secret-stream-72395... up, run.3491 (Free) ************************************** * Application In Production! * ************************************** Do you really wish to run this command? (yes/no) [no]: > yes Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (850.26ms) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (466.16ms) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (902.11ms) Migrating: 2019_12_14_000001_create_personal_access_tokens_table Migrated: 2019_12_14_000001_create_personal_access_tokens_table (1,079.00ms) PS E:\wwwroot\weibo> |
37、再次提交表单数据,提交成功。如图30
38、使用 heroku rename 来对应用名称进行更改,但要保证更改的名称未被其它人占用。如图31
1 2 3 4 5 6 7 | PS E:\wwwroot\weibo> heroku rename app-wangqiang-weibo » Warning: heroku update available from 7.53.0 to 7.59.2. Renaming secret-stream-72395 to app-wangqiang-weibo... done ! Don't forget to update git remotes for all other local checkouts of the app. Git remote heroku updated PS E:\wwwroot\weibo> |
39、打开:https://app-wangqiang-weibo.herokuapp.com/ ,响应 200。符合预期。如图32
40、打开:https://secret-stream-72395.herokuapp.com/ ,响应 404。There’s nothing here, yet。符合预期。如图33
近期评论