Heroku(PHP+MySQL)でWebサービス公開手順



#はじめに

localhostでPHP+MySQLで開発したものを、Herokuで公開するためのもの
OS： mac
PHP: フレームワーク無し
DB: MySQL

#1.Herokuに登録
[https://www.heroku.com/](https://www.heroku.com/)
クレジットカードを登録しておきます。
#2.Heroku CLIをインストール
[https://devcenter.heroku.com/articles/heroku-cli](https://devcenter.heroku.com/articles/heroku-cli)

```
$ heroku login
```
#3.アプリ作成
ここではデスクトップにheroku-appというディレクトリを作ります。

```
$ cd Desktop
$ mkdir heroku-app
$ cd heroku-app
```
アプリを作成します。アプリ名を指定しない場合は自動で割り振られます。

```
$ heroku create アプリ名
```
#4.composer
composer.jsonというファイルを作成します。

```
touch composer.json
```
phpのバージョン7を指定します。これが正しいのか分かりませんがこれで動きました。
`"ext-mbstring": "*"` とすることでmb_xxxの関数(mb_strlenとか)が使えるようになります。指定しないでmb_xxxの関数を使うと`Call to undefined function`エラーになります。

```json:composer.json
{
    "require": {
      "php": "~7.0",
      "ext-mbstring": "*"
    }
 }
```
デフォルトのPHPが入っていることが前提です。

```
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer
```
ターミナルを再起動して確認します。大丈夫ならインストールします。

```
$ cd Desktop/heroku-app
$ composer -v
$ composer install
```
#5.Gitリポジトリ作成
```
$ git init
$ git remote add heroku https://git.heroku.com/アプリ名.git
$ git remote -v
```

#6.ClearDBアドオンをインストール
herokuでmysqlを使うための設定です。

```
$ heroku addons:add cleardb:ignite
```

#7.Workbenchをインストール、設定
Workbenchを使うことで、phpMyAdminのようにGUIでデータベースを管理できます。
インストールが完了したら赤枠で囲った`MySQL Connections`の横の`+`をクリックして設定画面を開きます。
![スクリーンショット 2019-04-05 18.18.34.png](https://qiita-image-store.s3.amazonaws.com/0/338972/2b2b28c7-9da0-892e-a297-4bad9754855a.png)

`heroku config`コマンドで`CLEARDB_DATABASE_URL`を確認します。

```
$ heroku config
```
これを元に入力していきます。`CLEARDB_DATABASE_URL: mysql://ユーザ名:パスワード@サーバ名/データベース?reconnect=true`
Connection Name: 適当な名前
Hostname:        サーバ名
Username:        ユーザ名
Password:        パスワード
Default Schema:  データベース

入力を終えたら、`Test Connection`をクリック→上で入力したパスワードを入力→`Connection Warning`画面が出る→`Continue Anyway`→`Successfully made the MySQL connection`→`OK`→`OK`

#8.phpMyAdminからDBエクスポート→WorkbenchにDBインポート
###phpMyAdminからエクスポート
phpMyAdminからエクスポートしたいDBを選択→`詳細`にチェック→`出力をファイルに保存する`→`実行`

###Workbenchにインポート
7.で設定したものに接続して`Administraion`タブから`Data Import/Restore`→`Import from Self-Contained File`にチェックを入れてphpMyAdminからエクスポートしたsqlファイルを選択します。
`Default Target Schema`を指定します。newの方ではなくてセレクトメニューでデフォルトのものを指定します。
なぜかフリーズしたように?選択できないときがありますが、謎です。
最後に`Start Import`をクリックします。

#9.PHPのDB接続設定を変更する
local用から本番用に書き換える必要があります。

```php:function.php
function dbConnect(){
  $db = parse_url($_SERVER['CLEARDB_DATABASE_URL']);
  $db['dbname'] = ltrim($db['path'], '/');
  $dsn = "mysql:host={$db['host']};dbname={$db['dbname']};charset=utf8";
  $user = $db['user'];
  $password = $db['pass'];
  $options = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY =>true,
  );
  $dbh = new PDO($dsn,$user,$password,$options);
  return $dbh;
}
```

#10.herokuへデプロイ

```
$ git add -A
$ git commit -m "commit"
$ git push heroku master
```
heroku openでブラウザを開いて表示してくれます。localと同じようにDBのデータ等ちゃんと表示できていれば完了です。

```
$ heroku open
```

#11.WorkbenchでDBの中身を確認する
赤枠で囲った`Schemas`→`Tables`
<img width="784" alt="スクリーンショット 2019-04-06 7.52.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/338972/0e206ba1-269e-150c-af44-0806fba3125e.png">
各テーブルにマウスホバーすると、右にアイコンが出る(赤枠で囲った所)ので一番右のカレンダーみたいなアイコンをクリックするとデータが確認できます。または、SQL文を打ち込んで雷アイコンを押してもデータ確認ができます。
<img width="784" alt="スクリーンショット 2019-04-06 8.15.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/338972/aaaeb96d-ba46-36cb-1a4a-d882895a7a8e.png">



#その他エラーなど
・herokuはphpログファイルとかエラーが見れないようなので、見るには`ini_set('display_errors',1)`を一時的に使います。

・`Error Code: 2013. Lost connection to MySQL server〜`というエラーが出る場合
→[https://stackoverflow.com/questions/10563619/error-code-2013-lost-connection-to-mysql-server-during-query](https://stackoverflow.com/questions/10563619/error-code-2013-lost-connection-to-mysql-server-during-query)

・composer.jsonを編集したら作業ディレクトリで `composer update` を行う

```
$ composer update
```

#参考:
herokuでPHPからMySQL（ClearDB）を使う[http://blog.a-way-out.net/blog/2014/12/11/heroku-php-mysql/](http://blog.a-way-out.net/blog/2014/12/11/heroku-php-mysql/)
herokuがcomposer.lock必須になったのでcomposerの入れ方をメモしておく[http://kayakuguri.github.io/blog/2015/08/25/composer-lock-require/](http://kayakuguri.github.io/blog/2015/08/25/composer-lock-require/)
Heroku データベースの管理（ClearDB アドオンによる MySQL の利用）[http://www.ownway.info/Ruby/heroku/how/management/database/cleardb](http://www.ownway.info/Ruby/heroku/how/management/database/cleardb)
MySQL WorkbenchをMacにインストールする方法[https://programmingnavi.com/77/](https://programmingnavi.com/77/)
heroku環境でmb_xxx関数を使うと、Fatal error: Call to undefined function …のエラーが表示される[https://qiita.com/taro-hida/items/f677abe2bc3b689002b3](https://qiita.com/taro-hida/items/f677abe2bc3b689002b3)