1、参考网址:https://www.shuijingwanwq.com/2021/12/29/5622/ ,Laravel 8.x 部署至 Heroku,基于 PostgreSQL 实现。因此,一些步骤可省略。

2、在本地开发环境中,基于 Laravel 本机环境已经部署完毕。打开网址:http://larabbs.local/ ,响应 200。如图1

图1

3、验证您的安装,要验证您的 CLI 安装,请使用 heroku –version 命令。当前版本:7.53.0,最新版本:7.59.2。如图2

图2

PS E:\wwwroot\larabbs> heroku --version
 »   Warning: heroku update available from 7.53.0 to 7.59.2.
heroku/7.53.0 win32-x64 node-v12.21.0
PS E:\wwwroot\larabbs>

4、执行命令:heroku update,以更新至最新版本。如图3

图3

PS E:\wwwroot\larabbs> heroku update
heroku: Updating CLI from 7.53.0 to 7.59.2... done
heroku: Updating CLI... done
PS E:\wwwroot\larabbs> heroku --version
heroku/7.59.2 win32-x64 node-v12.21.0
PS E:\wwwroot\larabbs>

5、要将应用部署到 Heroku 上,我们还需要在 Laravel 项目下新建一个 Procfile 文件,通过配置该文件来告诉 Heroku 应当使用什么命令来启动 Web 服务器。接着还需要将该文件纳入到 Git 版本控制中。如图4

图4

web: vendor/bin/heroku-php-apache2 public/

6、使用 heroku create 命令在 Heroku 上创建一个新应用。使用 heroku rename 来对应用名称进行更改。如图5

图5

PS E:\wwwroot\larabbs> heroku create
Creating app... done, ⬢ damp-savannah-00068
https://damp-savannah-00068.herokuapp.com/ | https://git.heroku.com/damp-savannah-00068.git
PS E:\wwwroot\larabbs> heroku rename app-wangqiang-larabbs
Renaming damp-savannah-00068 to app-wangqiang-larabbs... done
https://app-wangqiang-larabbs.herokuapp.com/ | https://git.heroku.com/app-wangqiang-larabbs.git
 !    Don't forget to update git remotes for all other local checkouts of the app.
Git remote heroku updated
PS E:\wwwroot\larabbs>

7、对应用的 buildpack 进行声明,告诉 Heroku 说我们的应用是用 PHP 写的。如图6

图6

PS E:\wwwroot\larabbs> heroku buildpacks:set heroku/php
Buildpack set. Next release on app-wangqiang-larabbs will use heroku/php.
Run git push heroku main to create a new release using this buildpack.
PS E:\wwwroot\larabbs>

8、使用 Laravel 自带的 artisan 命令来生成 App Key。基于生成的 App Key 来完成配置。如图7

图7

PS E:\wwwroot\larabbs> php artisan key:generate --show
base64:t/Y/pkrV3vFkTmKgx1ZYnKGioiwZh+vfx/ZhoL+SPdE=
PS E:\wwwroot\larabbs> heroku config:set APP_KEY=base64:t/Y/pkrV3vFkTmKgx1ZYnKGioiwZh+vfx/ZhoL+SPdE=
Setting APP_KEY and restarting ⬢ app-wangqiang-larabbs... done, v3
APP_KEY: base64:t/Y/pkrV3vFkTmKgx1ZYnKGioiwZh+vfx/ZhoL+SPdE=
PS E:\wwwroot\larabbs>

9、将代码推送和部署到 Heroku 上。代码推送成功之后,可以使用命令:heroku open 来快速打开线上应用。响应 500,原因在于 MySQL 还未配置。如图8

图8

PS E:\wwwroot\larabbs> git push heroku main
Enumerating objects: 4436, done.
Counting objects: 100% (4436/4436), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4268/4268), done.
Writing objects: 100% (4436/4436), 6.06 MiB | 182.00 KiB/s, done.
Total 4436 (delta 721), 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-gd (bundled with php)
remote:        - ext-mbstring (bundled with php)
remote:        - ext-pcntl (bundled with php)
remote:        - composer (2.2.3)
remote:        - apache (2.4.51)
remote:        - nginx (1.20.2)
remote: -----> Installing dependencies...
remote:        Composer version 2.2.3 2021-12-31 12:18:53
remote:        Installing dependencies from lock file
remote:        Verifying lock file contents can be installed on current platform.
remote:        Package operations: 84 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 (v2.5.0)
remote:          - Downloading symfony/http-foundation (v5.4.2)
remote:          - Downloading psr/event-dispatcher (1.0.0)
remote:          - Downloading symfony/event-dispatcher-contracts (v2.5.0)
remote:          - Downloading symfony/event-dispatcher (v5.4.0)
remote:          - Downloading symfony/var-dumper (v5.4.2)
remote:          - Downloading psr/log (1.1.4)
remote:          - Downloading symfony/error-handler (v5.4.2)
remote:          - Downloading symfony/http-kernel (v5.4.2)
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 (v5.4.2)
remote:          - Downloading tijsverkoyen/css-to-inline-styles (2.2.4)
remote:          - Downloading symfony/routing (v5.4.0)
remote:          - Downloading symfony/process (v5.4.2)
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.2)
remote:          - Downloading symfony/finder (v5.4.2)
remote:          - Downloading symfony/polyfill-intl-grapheme (v1.23.1)
remote:          - Downloading symfony/string (v5.4.2)
remote:          - Downloading psr/container (1.1.2)
remote:          - Downloading symfony/service-contracts (v2.5.0)
remote:          - Downloading symfony/console (v5.4.2)
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 (v2.5.0)
remote:          - Downloading symfony/translation (v5.4.2)
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.77.1)
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/horizon (v5.7.17)
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:          - Downloading intervention/image (2.7.1)
remote:          - Downloading mews/captcha (3.2.6)
remote:          - Downloading ezyang/htmlpurifier (v4.13.0)
remote:          - Downloading mews/purifier (3.3.6)
remote:          - Downloading laravel-lang/lang (5.0.0)
remote:          - Downloading overtrue/laravel-lang (4.2.2)
remote:          - Downloading overtrue/pinyin (4.0.8)
remote:          - Downloading predis/predis (v1.1.9)
remote:          - Downloading spatie/laravel-permission (3.18.0)
remote:          - Downloading ckeditor/ckeditor (4.17.1)
remote:          - Downloading summerblue/administrator (8.0.0)
remote:          - Downloading summerblue/laravel-active (8.0.0)
remote:          - Downloading viacreative/sudo-su (1.1.0)
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 (v2.5.0): Extracting archive
remote:          - Installing symfony/http-foundation (v5.4.2): Extracting archive
remote:          - Installing psr/event-dispatcher (1.0.0): Extracting archive
remote:          - Installing symfony/event-dispatcher-contracts (v2.5.0): Extracting archive
remote:          - Installing symfony/event-dispatcher (v5.4.0): Extracting archive
remote:          - Installing symfony/var-dumper (v5.4.2): Extracting archive
remote:          - Installing psr/log (1.1.4): Extracting archive
remote:          - Installing symfony/error-handler (v5.4.2): Extracting archive
remote:          - Installing symfony/http-kernel (v5.4.2): 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 (v5.4.2): 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.2): 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.2): Extracting archive
remote:          - Installing symfony/finder (v5.4.2): Extracting archive
remote:          - Installing symfony/polyfill-intl-grapheme (v1.23.1): Extracting archive
remote:          - Installing symfony/string (v5.4.2): Extracting archive
remote:          - Installing psr/container (1.1.2): Extracting archive
remote:          - Installing symfony/service-contracts (v2.5.0): Extracting archive
remote:          - Installing symfony/console (v5.4.2): 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 (v2.5.0): Extracting archive
remote:          - Installing symfony/translation (v5.4.2): 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.77.1): 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/horizon (v5.7.17): 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 intervention/image (2.7.1): Extracting archive
remote:          - Installing mews/captcha (3.2.6): Extracting archive
remote:          - Installing ezyang/htmlpurifier (v4.13.0): Extracting archive
remote:          - Installing mews/purifier (3.3.6): Extracting archive
remote:          - Installing laravel-lang/lang (5.0.0): Extracting archive
remote:          - Installing overtrue/laravel-lang (4.2.2): Extracting archive
remote:          - Installing overtrue/pinyin (4.0.8): Extracting archive
remote:          - Installing predis/predis (v1.1.9): Extracting archive
remote:          - Installing spatie/laravel-permission (3.18.0): Extracting archive
remote:          - Installing ckeditor/ckeditor (4.17.1): Extracting archive
remote:          - Installing summerblue/administrator (8.0.0): Extracting archive
remote:          - Installing summerblue/laravel-active (8.0.0): Extracting archive
remote:          - Installing viacreative/sudo-su (1.1.0): 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:        Discovered Package: fruitcake/laravel-cors
remote:        Discovered Package: intervention/image
remote:        Discovered Package: laravel/horizon
remote:        Discovered Package: laravel/sanctum
remote:        Discovered Package: laravel/tinker
remote:        Discovered Package: mews/captcha
remote:        Discovered Package: mews/purifier
remote:        Discovered Package: nesbot/carbon
remote:        Discovered Package: overtrue/laravel-lang
remote:        Discovered Package: spatie/laravel-permission
remote:        Discovered Package: summerblue/administrator
remote:        Discovered Package: summerblue/laravel-active
remote:        Package manifest generated successfully.
remote:        54 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: 34.2M
remote: -----> Launching...
remote:        Released v4
remote:        https://app-wangqiang-larabbs.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/app-wangqiang-larabbs.git
 * [new branch]      main -> main
PS E:\wwwroot\larabbs> heroku open
PS E:\wwwroot\larabbs>

10、参考网址:https://devcenter.heroku.com/articles/cleardb ,ClearDB 是一种强大、高速的云端数据库即服务,适用于 MySQL 驱动的应用程序。提示:请验证您的帐户。如图9

图9

PS E:\wwwroot\larabbs> heroku addons:create cleardb:ignite
Creating cleardb:ignite on ⬢ app-wangqiang-larabbs... !
 !    Please verify your account to install this add-on plan (please enter a credit card) For more information, see
 !    https://devcenter.heroku.com/categories/billing Verify now at https://heroku.com/verify
PS E:\wwwroot\larabbs>

11、打开网址:https://heroku.com/verify ,验证信用卡相关信息。如图10

图10

12、将 ClearDB 添加到您的应用程序,检索您的数据库 URL。安装成功。如图11

图11

PS E:\wwwroot\larabbs> heroku addons:create cleardb:ignite
Creating cleardb:ignite on ⬢ app-wangqiang-larabbs... free
Created cleardb-curly-36388 as CLEARDB_DATABASE_URL
Use heroku addons:docs cleardb to view documentation
PS E:\wwwroot\larabbs> heroku config | grep CLEARDB_DATABASE_URL
grep : 无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确
,然后再试一次。
所在位置 行:1 字符: 17
+ heroku config | grep CLEARDB_DATABASE_URL
+                 ~~~~
    + CategoryInfo          : ObjectNotFound: (grep:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS E:\wwwroot\larabbs> heroku config
=== app-wangqiang-larabbs Config Vars
APP_KEY:              base64:t/Y/pkrV3vFkTmKgx1ZYnKGioiwZh+vfx/ZhoL+SPdE=
CLEARDB_DATABASE_URL: mysql://b034f6d0920fbc:1901ec77@us-cdbr-east-05.cleardb.net/heroku_60d897c4592e150?reconnect=true
PS E:\wwwroot\larabbs>

13、为 Heroku 新增一个 IS_IN_HEROKU 配置项来判断应用是否运行在 Heroku 上。

PS E:\wwwroot\larabbs> heroku config:set IS_IN_HEROKU=true
Setting IS_IN_HEROKU and restarting ⬢ app-wangqiang-larabbs... done, v7
IS_IN_HEROKU: true
PS E:\wwwroot\larabbs> heroku config
=== app-wangqiang-larabbs Config Vars
APP_KEY:              base64:t/Y/pkrV3vFkTmKgx1ZYnKGioiwZh+vfx/ZhoL+SPdE=
CLEARDB_DATABASE_URL: mysql://b034f6d0920fbc:1901ec77@us-cdbr-east-05.cleardb.net/heroku_60d897c4592e150?reconnect=true
IS_IN_HEROKU:         true
PS E:\wwwroot\larabbs>

14、一般来说,应用的数据库都在 config/database.php 中进行配置,因此我们需要针对该配置文件,来为不同环境的数据库连接方式定义一个帮助方法,以便根据应用不同的运行环境来指定数据库配置信息,我们需要编辑 helpers.php 文件并写入以下内容。

function get_db_config()
{
    if (getenv('IS_IN_HEROKU')) {
        $url = parse_url(getenv("CLEARDB_DATABASE_URL"));

        return $db_config = [
            'connection' => 'mysql',
            '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', ''),
        ];
    }
}

打印 $url:


Array
(
    [scheme] => mysql
    [host] => us-cdbr-east-05.cleardb.net
    [user] => b034f6d0920fbc
    [pass] => 1901ec77
    [path] => /heroku_60d897c4592e150
    [query] => reconnect=true
)

15、使用刚刚定义好的 get_db_config 方法对数据库进行配置。将数据库配置文件替换为以下内容,config/database.php

<?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'],

    /*
    |--------------------------------------------------------------------------
    | Database Connections
    |--------------------------------------------------------------------------
    |
    | Here are each of the database connections setup for your application.
    | Of course, examples of configuring each database platform that is
    | supported by Laravel is shown below to make development simple.
    |
    |
    | All database work in Laravel is done through the PHP PDO facilities
    | so make sure you have the driver for your particular database of
    | choice installed on your machine before you begin development.
    |
    */
    'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'url' => env('DATABASE_URL'),
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ],

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => $db_config['host'],
            'port' => env('DB_PORT', '3306'),
            'database' => $db_config['database'],
            'username' => $db_config['username'],
            'password' => $db_config['password'],
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

        'pgsql' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],

        'sqlsrv' => [
            'driver' => 'sqlsrv',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '1433'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
        ],

    ],

    /*
    |--------------------------------------------------------------------------
    | Migration Repository Table
    |--------------------------------------------------------------------------
    |
    | This table keeps track of all the migrations that have already run for
    | your application. Using this information, we can determine which of
    | the migrations on disk haven't actually been run in the database.
    |
    */
    'migrations' => 'migrations',

    /*
    |--------------------------------------------------------------------------
    | Redis Databases
    |--------------------------------------------------------------------------
    |
    | Redis is an open source, fast, and advanced key-value store that also
    | provides a richer body of commands than a typical key-value system
    | such as APC or Memcached. Laravel makes it easy to dig right in.
    |
    */
    'redis' => [

        'client' => env('REDIS_CLIENT', 'phpredis'),

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
        ],

        'default' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_DB', '0'),
        ],

        'cache' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_CACHE_DB', '1'),
        ],

    ],

];

16、再次推送,然后执行数据库迁移。报错:SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes。如图12

图12

PS E:\wwwroot\larabbs> git add -A
warning: LF will be replaced by CRLF in config/database.php.
The file will have its original line endings in your working directory
PS E:\wwwroot\larabbs> git commit -m "Updated database configuration"
[main 5513bdb] Updated database configuration
 1 file changed, 1 insertion(+)
PS E:\wwwroot\larabbs> git push heroku main
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 374 bytes | 374.00 KiB/s, done.
Total 4 (delta 3), 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-gd (bundled with php)
remote:        - ext-mbstring (bundled with php)
remote:        - ext-pcntl (bundled with php)
remote:        - composer (2.2.3)
remote:        - apache (2.4.51)
remote:        - nginx (1.20.2)
remote: -----> Installing dependencies...
remote:        Composer version 2.2.3 2021-12-31 12:18:53
remote:        Installing dependencies from lock file
remote:        Verifying lock file contents can be installed on current platform.
remote:        Package operations: 84 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 (v2.5.0): Extracting archive
remote:          - Installing symfony/http-foundation (v5.4.2): Extracting archive
remote:          - Installing psr/event-dispatcher (1.0.0): Extracting archive
remote:          - Installing symfony/event-dispatcher-contracts (v2.5.0): Extracting archive
remote:          - Installing symfony/event-dispatcher (v5.4.0): Extracting archive
remote:          - Installing symfony/var-dumper (v5.4.2): Extracting archive
remote:          - Installing psr/log (1.1.4): Extracting archive
remote:          - Installing symfony/error-handler (v5.4.2): Extracting archive
remote:          - Installing symfony/http-kernel (v5.4.2): 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 (v5.4.2): 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.2): 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.2): Extracting archive
remote:          - Installing symfony/finder (v5.4.2): Extracting archive
remote:          - Installing symfony/polyfill-intl-grapheme (v1.23.1): Extracting archive
remote:          - Installing symfony/string (v5.4.2): Extracting archive
remote:          - Installing psr/container (1.1.2): Extracting archive
remote:          - Installing symfony/service-contracts (v2.5.0): Extracting archive
remote:          - Installing symfony/console (v5.4.2): 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 (v2.5.0): Extracting archive
remote:          - Installing symfony/translation (v5.4.2): 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.77.1): 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/horizon (v5.7.17): 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 intervention/image (2.7.1): Extracting archive
remote:          - Installing mews/captcha (3.2.6): Extracting archive
remote:          - Installing ezyang/htmlpurifier (v4.13.0): Extracting archive
remote:          - Installing mews/purifier (3.3.6): Extracting archive
remote:          - Installing laravel-lang/lang (5.0.0): Extracting archive
remote:          - Installing overtrue/laravel-lang (4.2.2): Extracting archive
remote:          - Installing overtrue/pinyin (4.0.8): Extracting archive
remote:          - Installing predis/predis (v1.1.9): Extracting archive
remote:          - Installing spatie/laravel-permission (3.18.0): Extracting archive
remote:          - Installing ckeditor/ckeditor (4.17.1): Extracting archive
remote:          - Installing summerblue/administrator (8.0.0): Extracting archive
remote:          - Installing summerblue/laravel-active (8.0.0): Extracting archive
remote:          - Installing viacreative/sudo-su (1.1.0): 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:        Discovered Package: fruitcake/laravel-cors
remote:        Discovered Package: intervention/image
remote:        Discovered Package: laravel/horizon
remote:        Discovered Package: laravel/sanctum
remote:        Discovered Package: laravel/tinker
remote:        Discovered Package: mews/captcha
remote:        Discovered Package: mews/purifier
remote:        Discovered Package: nesbot/carbon
remote:        Discovered Package: overtrue/laravel-lang
remote:        Discovered Package: spatie/laravel-permission
remote:        Discovered Package: summerblue/administrator
remote:        Discovered Package: summerblue/laravel-active
remote:        Package manifest generated successfully.
remote:        54 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: 34.2M
remote: -----> Launching...
remote:        Released v10
remote:        https://app-wangqiang-larabbs.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/app-wangqiang-larabbs.git
   0e4cf6e..5513bdb  main -> main
PS E:\wwwroot\larabbs> heroku run php artisan migrate
Running php artisan migrate on ⬢ app-wangqiang-larabbs... up, run.3041 (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

In Connection.php line 703:

  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQ
  L: alter table `users` add unique `users_email_unique`(`email`))


In Connection.php line 492:

  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes


PS E:\wwwroot\larabbs>

17、编辑 config/database.php,修改 ‘engine’ => null, 为 ‘engine’ => ‘InnoDB’,。

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => $db_config['host'],
            'port' => env('DB_PORT', '3306'),
            'database' => $db_config['database'],
            'username' => $db_config['username'],
            'password' => $db_config['password'],
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => 'InnoDB',
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

18、再次执行数据库迁移,报错。SQLSTATE[42S01]: Base table or view already exists: 1050 Table ‘users’ already exists。如图13

图13

PS E:\wwwroot\larabbs> heroku run php artisan migrate
Running php artisan migrate on ⬢ app-wangqiang-larabbs... up, run.7215 (Free)
**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > yes

Migrating: 2014_10_12_000000_create_users_table

In Connection.php line 703:

  SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' already exists (SQL: create table `users` (`
  id` bigint unsigned not null auto_increment primary key, `name` varchar(255) not null, `email` varchar(255) not nul
  l, `email_verified_at` timestamp null, `password` varchar(255) not null, `remember_token` varchar(100) null, `creat
  ed_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci' engi
  ne = InnoDB)


In Connection.php line 492:

  SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' already exists


PS E:\wwwroot\larabbs>

19、在 Navicat for MySQL 中连接 Heroku ClearDB MySQL。确定数据库中已经存在表:migrations、users。手动删除掉。如图14

图14

20、再次执行数据库迁移,仍然报错:SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes。说明 编辑 config/database.php,修改 ‘engine’ => null, 为 ‘engine’ => ‘InnoDB’, 。没有作用。

21、参考网址:https://stackoverflow.com/questions/42244541/laravel-migration-error-syntax-error-or-access-violation-1071-specified-key-wa 。编辑 app/Providers/AppServiceProvider.php 。添加 Schema::defaultStringLength(191);。如图15

图15

<?php

namespace App\Providers;

use App\Observers\TopicObserver;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */    public function register()
    {
        if (app()->isLocal()) {
            $this->app->register(\VIACreative\SudoSu\ServiceProvider::class);
        }
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */    public function boot()
 {
        Schema::defaultStringLength(191);
        \App\Models\User::observe(\App\Observers\UserObserver::class);
        \App\Models\Reply::observe(\App\Observers\ReplyObserver::class);
        \App\Models\Topic::observe(\App\Observers\TopicObserver::class);
        \App\Models\Link::observe(\App\Observers\LinkObserver::class);

        \Illuminate\Pagination\Paginator::useBootstrap();
    }
}

22、再次执行数据库迁移与填充,报错:Class “Faker\Factory” not found。说明 报错:SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes。的问题已经得到解决。如图16

图16

PS E:\wwwroot\larabbs> heroku run php artisan migrate:refresh --seed
Running php artisan migrate:refresh --seed on ⬢ app-wangqiang-larabbs... up, run.8649 (Free)
**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > yes

Migration table not found.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (75.93ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (68.13ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (66.91ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (177.58ms)
Migrating: 2021_12_31_134920_add_avatar_and_introduction_to_users_table
Migrated:  2021_12_31_134920_add_avatar_and_introduction_to_users_table (57.13ms)
Migrating: 2021_12_31_155234_create_categories_table
Migrated:  2021_12_31_155234_create_categories_table (207.72ms)
Migrating: 2021_12_31_155935_seed_categories_data
Migrated:  2021_12_31_155935_seed_categories_data (16.28ms)
Migrating: 2021_12_31_161159_create_topics_table
Migrated:  2021_12_31_161159_create_topics_table (134.87ms)
Migrating: 2022_01_04_175444_create_replies_table
Migrated:  2022_01_04_175444_create_replies_table (254.93ms)
Migrating: 2022_01_05_101230_create_notifications_table
Migrated:  2022_01_05_101230_create_notifications_table (151.45ms)
Migrating: 2022_01_05_101456_add_notification_count_to_users_table
Migrated:  2022_01_05_101456_add_notification_count_to_users_table (53.74ms)
Migrating: 2022_01_05_114704_create_permission_tables
Migrated:  2022_01_05_114704_create_permission_tables (916.03ms)
Migrating: 2022_01_05_115758_seed_roles_and_permissions_data
Migrated:  2022_01_05_115758_seed_roles_and_permissions_data (1,113.49ms)
Migrating: 2022_01_05_164147_create_links_table
Migrated:  2022_01_05_164147_create_links_table (99.36ms)
Migrating: 2022_01_05_170327_add_references
Migrated:  2022_01_05_170327_add_references (456.77ms)
Migrating: 2022_01_06_094656_add_last_actived_at_to_users_table
Migrated:  2022_01_06_094656_add_last_actived_at_to_users_table (50.76ms)
Seeding: Database\Seeders\UsersTableSeeder

In DatabaseServiceProvider.php line 91:

  Class "Faker\Factory" not found


PS E:\wwwroot\larabbs>

23、参考网址:https://www.shuijingwanwq.com/2021/12/31/5665/ ,解决 报错:Class “Faker\Factory” not found

24、推送至 Heroku,报错:ERROR: Failed to install system packages! Your requirements could not be resolved to an installable set of packages.。如图17

图17

PS E:\wwwroot\larabbs> git push heroku main
Enumerating objects: 21, done.
Counting objects: 100% (21/21), done.
Delta compression using up to 4 threads
Compressing objects: 100% (13/13), done.
Writing objects: 100% (13/13), 5.50 KiB | 468.00 KiB/s, done.
Total 13 (delta 11), 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:
remote:  !     ERROR: Failed to install system packages!
remote:  !
remote:  !     Your platform requirements (for runtimes and extensions) could
remote:  !     not be resolved to an installable set of dependencies, or a
remote:  !     platform package repository was unreachable.
remote:  !
remote:  !     This usually means that you (or packages you are using) depend
remote:  !     on a combination of PHP versions and/or extensions that are
remote:  !     currently not available on Heroku.
remote:  !
remote:  !     The following is the full output from the installation attempt:
remote:  !
remote:  !     > You are using Composer 1 which is deprecated. You should upgrade to Composer 2, see https://blog.packagist.com/deprecating-composer-1-support/
remote:  !     > Loading repositories with available runtimes and extensions
remote:  !     > Updating dependencies
remote:  !     > Your requirements could not be resolved to an installable set of packages.
remote:  !     >
remote:  !     >   Problem 1
remote:  !     >     - symfony/polyfill-ctype v1.24.0 requires php >=7.1 -> satisfiable by php[7.3.24, 7.3.25, 7.3.26, 7.3.27, 7.3.28, 7.3.29, 7.3.30, 7.3.31, 7.3.32, 7.3.33, 7.4.12, 7.4.13, 7.4.14, 7.4.15, 7.4.16, 7.4.19, 7.4.20, 7.4.21, 7.4.22, 7.4.23, 7.4.24, 7.4.25, 7.4.26, 7.4.27, 8.0.0, 8.0.0RC4, 8.0.1, 8.0.10, 8.0.11, 8.0.12, 8.0.13, 8.0.14, 8.0.2, 8.0.3, 8.0.6, 8.0.7, 8.0.8, 8.0.9, 8.1.0, 8.1.1].
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.3.24
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.3.25
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.3.26
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.3.27
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.3.28
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.3.29
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.3.30
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.3.31
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.3.32
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.3.33
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.12
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.13
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.14
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.15
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.16
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.19
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.20
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.21
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.22
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.23
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.24
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.25
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.26
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 7.4.27
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.0
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.0RC4
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.1
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.10
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.11
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.12
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.13
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.14
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.2
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.3
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.6
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.7
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.8
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.0.9
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.1.0
remote:  !     >     - don't install symfony/polyfill-ctype v1.24.0|don't install php 8.1.1
remote:  !     >     - Installation request for symfony/polyfill-ctype v1.24.0 -> satisfiable by symfony/polyfill-ctype[v1.24.0].
remote:  !     >
be installed. If dev requirements are blocking the update you have to resolve those problems.
remote:  !
remote:  !     For reference, the following runtimes are currently available:
remote:  !
remote:  !     PHP:  8.1.1, 8.1.0, 8.0.14, 8.0.13, 8.0.12, 8.0.11, 8.0.10,
remote:  !     8.0.9, 8.0.8, 8.0.7, 8.0.6, 8.0.3, 8.0.2, 8.0.1, 8.0.0,
remote:  !     8.0.0RC4, 7.4.27, 7.4.26, 7.4.25, 7.4.24, 7.4.23, 7.4.22,
remote:  !     7.4.21, 7.4.20, 7.4.19, 7.4.16, 7.4.15, 7.4.14, 7.4.13,
remote:  !     7.4.12, 7.3.33, 7.3.32, 7.3.31, 7.3.30, 7.3.29, 7.3.28,
remote:  !     7.3.27, 7.3.26, 7.3.25, 7.3.24
remote:  !
remote:  !     Please verify that all requirements for runtime versions in
remote:  !     'composer.lock' are compatible with the list above, and ensure
remote:  !     all required extensions are available for the desired runtimes.
remote:  !
remote:  !     When choosing a PHP runtimes and extensions, please also ensure
remote:  !     they are available on your app's stack (heroku-20), and select
remote:  !     a different stack if needed after consulting the article below.
remote:  !
remote:  !     For a list of supported runtimes & extensions on Heroku, please
remote:  !     refer to: https://devcenter.heroku.com/articles/php-support
remote:
remote:  !     Push rejected, failed to compile PHP app.
remote:
remote:  !     Push failed
remote: Verifying deploy...
remote:
remote: !       Push rejected to app-wangqiang-larabbs.
remote:
To https://git.heroku.com/app-wangqiang-larabbs.git
 ! [remote rejected] main -> main (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/app-wangqiang-larabbs.git'

25、更新 composer ,从 2.1.14 更新至 2.2.3。推送时仍然报同样的错误。

PS E:\wwwroot\larabbs> composer self-update
Upgrading to version 2.2.3 (stable channel).

Use composer self-update --rollback to return to version 2.1.14
PS E:\wwwroot\larabbs> composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.2.3 2021-12-31 12:18:53

Usage:
  command [options] [arguments]

26、参考网址: https://github.com/heroku/heroku-buildpack-php/issues/526,Platform package install fails with Composer 2.2 lock file。这应该是 Heroku 平台本身的 Bug。后续间隔10余天后重试成功。

27、在 Navicat 中删除掉所有表,然后将本地环境的数据库复制过来。选择本地环境的数据库中的所有表,然后 ctrl + c,然后进入线上的数据库中,ctrl + v。如图18

图18

28、打开网址:https://app-wangqiang-larabbs.herokuapp.com/ 。部署成功。如图19

图19

永夜