Laravel5.6をHerokuにデプロイ

Laravel×MySQLで作ったシステムをデプロイしたときの話。
以下の記事を参考にしましたが、引っかかった箇所のメモです。

* [Laravel5.7: Herokuにデプロイする](https://qiita.com/sutara79/items/a173b969474d9f5afe1b)
* [【Heroku】LaravelとMySQLでデプロイする](https://qiita.com/33yuki/items/5c1910e259ff4e6498db)



## 現象1 : composerにintl追加でエラー
```bash
$ composer require ext-intl:*
  Problem 1
    - The requested PHP extension ext-intl * is missing from your system. Install or enable PHP's intl extension.
$ php -m |grep intl
＼(^o^)／
```
intlが入っていないことでエラーが発生します。

> [対応1 : phpenvにインストールオプションを渡す](https://qiita.com/oratta/items/fd03f5ec6ed8d4780db3#%E5%AF%BE%E5%BF%9C1--phpenv%E3%81%B8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%B8%A1%E3%81%99)

```
$ phpenv install 7.1.5
configure: WARNING: This bison version is not supported for ...
```


> [対応2 : bisonのバージョンを2.7にする](https://qiita.com/oratta/items/fd03f5ec6ed8d4780db3#%E5%AF%BE%E5%BF%9C2--bison%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E4%B8%8B%E3%81%92%E3%82%8B)

```
$ phpenv install 7.1.5
C++11限定機能に関するエラー
```

> [対応3 : C++のバージョン指定](https://qiita.com/oratta/items/fd03f5ec6ed8d4780db3#%E5%AF%BE%E5%BF%9C3-c11%E9%96%A2%E9%80%A3%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC)

```
$ YACC=/usr/local/bin/bison CXXFLAGS='-std=c++11' phpenv install 7.1.5
/var/tmp/php-build/source/7.1.5/ext/intl/intl_convertcpp.cpp:59:40: error: unknown type name 'UnicodeString'; did you mean 'icu_62::UnicodeString'?
zend_string* intl_charFromString(const UnicodeString &from, UErrorCode *status)
```
> [対応4 : icu4cのバージョンを下げる](https://qiita.com/oratta/items/fd03f5ec6ed8d4780db3#%E5%AF%BE%E5%BF%9C4--icu4c%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E4%B8%8B%E3%81%92%E3%82%8B)

```
$ YACC=/usr/local/bin/bison CXXFLAGS='-std=c++11' phpenv install 7.1.5
O.K
```

```
$php -m |grep intl
intl
O.K
```

### php.iniファイルを編集する

```
$ php -i | more
Loaded Configuration File => $PATH_TO_INI/php.ini

$ sudo vi $PATH_TO_INI/php.ini
#以下のコメントアウトを外す
extension=php_intl.dll 
~~
[intl]
intl.default_locale =
 This directive allows you to produce PHP errors when some error
 happens within intl functions. The value is the level of the error produced.
 Default is 0, which does not produce any errors.
intl.error_level = E_WARNING
intl.use_exceptions = 0
```
```
$ composer require ext-intl:*
O.K
```
## 現象2 Databaseのマイグレーションが通らない

```
$ heroku config:set .....
$ heroku config
$ heroku run php artisan migrate:refresh --seed
```

mysqlが5.7.7以下だと、下記の現象が発生するので対応が必要
https://akamist.com/blog/archives/982

## 対応

以下現象の解決に対応した内容です。

### 対応1 : phpenvへインストールオプションを渡す

phpenv経由のphpにintlを入れる

```bash
$ vi PATH_TO_ANYENVenvs/phpenv/plugins/php-build/share/php-build/definitions/7.1.5
configure_option "--enable-intl" #追記
```

```bash
$php -i |more
Configure Command =>  './configure'  '--with-config-file-path=/Users/kuesugi/.anyenv/envs/phpenv/versions/7.1.5/etc' '--with-config-file-scan-dir=/Users/kuesugi/.anyenv/envs/phpenv/versions/7.1.5/etc/conf.d' '--prefix=/Users/kuesugi/.anyenv/envs/phpenv/versions/7.1.5' '--libexecdir=/Users/kuesugi/.anyenv/envs/phpenv/versions/7.1.5/libexec' '--without-pear' '--with-gd' '--enable-sockets' '--with-jpeg-dir=/usr' '--enable-exif' '--enable-zip' '--with-zlib' '--with-zlib-dir=/usr' '--with-bz2' '--with-kerberos' '--with-mcrypt=/usr' '--enable-soap' '--enable-xmlreader' '--with-xsl' '--enable-ftp' '--enable-cgi' '--with-curl=/usr' '--with-tidy' '--with-xmlrpc' '--enable-sysvsem' '--enable-sysvshm' '--enable-shmop' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--with-pdo-sqlite' '--enable-pcntl' '--enable-mbstring' '--disable-debug' '--enable-fpm' '--enable-bcmath' '--enable-phpdbg' '--with-libedit' '--with-png-dir=/usr/X11' '--with-openssl=/usr/local/opt/openssl' '--with-libxml-dir=/usr/local/opt/libxml2'
```

--enable-intlが見当たらないので、definitionsファイルが反映されていないっぽい。
原因究明せず、別のやり方でアプローチしてうまくいきました。

デフォルトオプションの方に追加

```bash
$ vi .anyenv/envs/phpenv/plugins/php-build/share/php-build/default_configure_options
--enable-intl #追記
```

### 対応2 : bisonのバージョンを下げる

https://qiita.com/LowSE01/items/c518f61a8998ba6e4ea8
ここを参考にbisonのバージョンを2.7にする
※ brew linkしても効かず...
※ bash_profileでパス指定しててハマった

### 対応3 C++11関連のエラー

C++11の機能を使っているところで明示的に指定する必要がある。
https://tenkoma.hatenablog.com/entry/2017/08/14/222313

```bash
$ YACC=PATH_TO_BISON2.7 CXXFLAGS='-std=c++11' phpenv install 7.1.5
```

C++11の機能を使っている箇所で発生するエラーはこれで消えた


### 対応4 : icu4cのバージョンを下げる

icu4cのバージョン依存でうまく動かなくなった記事を見かけたのでバージョンを60.2で入れる
https://blog.tukae.lu/entry/2018/04/07/solve-unknown-type-name-UnicodeString

```bash
$ brew info icu4c
62.1

$ vi PATH_TO_FOMULA/icu4c.rb
#以下書き換え
url "https://ssl.icu-project.org/files/icu4c/60.2/icu4c-60_2-src.tgz"
mirror "https://fossies.org/linux/misc/icu4c-60_2-src.tgz"
mirror "https://downloads.sourceforge.net/project/icu/ICU4C/60.2/icu4c-60_2-src.tgz"
version "60.2"
sha256 "f073ea8f35b926d70bb33e6577508aa642a8b316a803f11be20af384811db418"

$ brew install icu4c
$ brew info icu4c
60.2

#brew install時に言われたパスを通す
$ echo 'export PATH="/usr/local/opt/icu4c/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/icu4c/sbin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
```


## その他前提、やったこと

### xcode-toolインストール

これがないと、gitが動かなくてphpenvがこける

```bash
$ xcode-select --install
```

### opensslの再インストール

https://qiita.com/2k0ri/items/362fd96e2bbb68242e33
→Homebrewのopensslを--universalオプション付きでインストールしていると引っかかるらしい

```bash
$ brew uninstall --ignore-dependencies openssl
$ brew install openssl
```

### phpenvのupdate

インストールでいろいろコケたので試行錯誤するまえに、phpenv自体をアップデートしておきます。

```bash
$ phpenv --version
phpenv v0.0.4-dev
```

まずanyenvのupdate

``bash
$ cd ~/.anyenv
$ git pull
```

anyenvの各envをアップデートするプラグインを導入

```bash
$ mkdir plugins
$ git clone https://github.com/znz/anyenv-update.git plugins/anyenv-update
```

phpenvのアップデート

```bash
$ anyenv update
Updating 'anyenv'...
Updating 'anyenv/anyenv-update'...
Updating 'ndenv'...
Updating 'ndenv/node-build'...
Updating 'phpenv'...
 |  From https://github.com/madumlao/phpenv
 |  0852611..2de911b  master      -> origin/master
 |  * [new branch]      init-script -> origin/init-script
Updating 'phpenv/php-build'...
 |  From https://github.com/php-build/php-build
 |  a510104..3c39466  master     -> origin/master
 |  error: Your local changes to the following files would be overwritten by merge:
 |  share/php-build/default_configure_options
 |  share/php-build/definitions/7.1.5
 |  Please commit your changes or stash them before you merge.
 |  Aborting
 |  Failed to update. Use 'verbose' option for detailed, or 'force' option.
Updating 'phpenv/phpenv-composer'...

$ phpenv --version
phpenv v0.0.4-dev
```

## 大量に出るbuil warning

phpenvのインストールログに大量にwarningが

```bash
warning: array parameter is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness-on-arrays]
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/stdlib.h:241:2: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
```

AppStoreを起動して、CommandLineToolsを更新して再インストール