Laravel×MySQLで作ったシステムをデプロイしたときの話。
以下の記事を参考にしましたが、引っかかった箇所のメモです。
現象1 : composerにintl追加でエラー
$ 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が入っていないことでエラーが発生します。
$ phpenv install 7.1.5
configure: WARNING: This bison version is not supported for ...
$ phpenv install 7.1.5
C++11限定機能に関するエラー
$ 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)
$ 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を入れる
$ vi PATH_TO_ANYENVenvs/phpenv/plugins/php-build/share/php-build/definitions/7.1.5
configure_option "--enable-intl" #追記
$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ファイルが反映されていないっぽい。
原因究明せず、別のやり方でアプローチしてうまくいきました。
デフォルトオプションの方に追加
$ 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
$ 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
$ 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がこける
$ xcode-select --install
opensslの再インストール
https://qiita.com/2k0ri/items/362fd96e2bbb68242e33
→Homebrewのopensslを--universalオプション付きでインストールしていると引っかかるらしい
$ brew uninstall --ignore-dependencies openssl
$ brew install openssl
phpenvのupdate
インストールでいろいろコケたので試行錯誤するまえに、phpenv自体をアップデートしておきます。
$ 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のアップデート
$ 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が
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を更新して再インストール