- 更新日: 2015年12月2日
- PHP & CakePHP
CakePHPデプロイでPHP extension intlエラー
Capistrano による CapkePHP アプリケーションのデプロイで発生したエラーへの対策。詳しくはデプロイ時の composer install 実行で、PHP に intl extension が入っていないためにエラーが発生しました。
— 環境 —
CakePHP 3.1.1
PHP 5.5.19
Composer 1.0
capistrano 3.4.0
cakephp 3.1.1 requires ext-intl エラー
capistrano でデプロイ実行したところ、以下のエラーログが表示されデプロイが失敗となった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ bundle exec cap production deploy --trace ... DEBUG [482f8d60] Command: cd /path/to/cakephp/releases/2015***** && ( PATH=/usr/local/bin:$PATH /usr/local/bin/composer install --no-dev --prefer-dist --no-interaction --optimize-autoloader ) DEBUG [482f8d60] Loading composer repositories with package information DEBUG [482f8d60] Installing dependencies from lock file DEBUG [482f8d60] Your requirements could not be resolved to an installable set of packages. DEBUG [482f8d60] DEBUG [482f8d60] Problem 1 DEBUG [482f8d60] - Installation request for cakephp/cakephp 3.1.1 -> satisfiable by cakephp/cakephp[3.1.1]. DEBUG [482f8d60] - cakephp/cakephp 3.1.1 requires ext-intl * -> the requested PHP extension intl is missing from your system. DEBUG [482f8d60] Problem 2 DEBUG [482f8d60] - cakephp/cakephp 3.1.1 requires ext-intl * -> the requested PHP extension intl is missing from your system. DEBUG [482f8d60] - cakephp/migrations 1.3.1 requires cakephp/cakephp ~3.0 -> satisfiable by cakephp/cakephp[3.1.1]. DEBUG [482f8d60] - Installation request for cakephp/migrations 1.3.1 -> satisfiable by cakephp/migrations[1.3.1]. DEBUG [482f8d60] |
ヒントの箇所を抜粋しますと…
1 2 3 |
cakephp/cakephp 3.1.1 requires ext-intl * -> the requested PHP extension intl is missing from your system. |
このエラーメッセージなので、PHP の extension である intl がシステム上で見つからないのが原因。ということで、以下解決策3つです。
1. PHP のコンパイル時に –enable-intl を指定
PHP のコンパイルが可能な環境であれば、intl の extension を有効にして PHP のコンパイルをやり直すと良いです。configure_option に –enable-intl を指定して、PHP のコンパイルをやり直します。詳細は以下、phpenv と php-build を使っている例です。
phpenvとphp-buildで新しいバージョンのPHP(5.5, 5.6)をインストール | EasyRamble
–enable-intl を付加して PHP をコンパイルすれば、intl extension が有効になるので解決。
公式ページのマニュアル。
2. pecl で intl をインストールして php.ini で extension を指定
PHP の再コンパイルができない環境の場合は、intl をインストールした後に、php.ini に extension の場所を指定する方法でもOKです。root 権限があり sudo yum コマンド等が使える環境であれば、以下の手順で intl をインストールできる。
intl インストール。
1 2 3 4 |
$ sudo yum install icu libicu-devel $ sudo pecl install intl |
php.ini の設定。
php.ini
1 2 3 |
extension=/path/to/intl.so |
以下ページ等が参考になります。
[PHP]Intlをソースからインストールする | 本日も乙
composer install で the requested PHP extension intl is missing from your system と言われる解決方法 – Qiita
3. intl をソースからインストールして php.ini で extension を指定
root 権限がなかったりレンタルサーバー環境などの場合は、intl をソースからインストールする必要がある。以下ページが参考になります。
さくらのレンタルサーバでCakePHP3を使うためにintl extensionを導入する方法 | ごろつきめも
さくらのレンタルサーバに Symfony2 を入れようとして嵌った件 – Qiita
上記 Qiita 記事を参考にして、まずは ~/local/ 以下等に intl をソースからインストールします。その後、php.ini に intl.so の場所を extension として指定。
php.ini
1 2 3 |
extension=/path/to/intl.so |
これで PHP の intl extension が有効になる。
表題のエラーを解決した方法
intl をインストールした後、php.ini で intl extension を指定しました。そのため composer install コマンド実行でエラーが発生していたので、composer コマンド自体の php(php-cli)コマンドの実行で、php.ini を読み込むオプションを付加して php(実際には php-cli コマンド)を実行するように修正した。具体的には以下のとおり -c /path/to/php.ini のオプションを付加。
/usr/local/bin/composer
1 2 3 4 |
#!/usr/bin/env bash /usr/bin/env php-cli -c /path/to/php.ini -d allow_url_fopen=On -d detect_unicode=Off /usr/local/composer.phar $* |
これでエラーが解決して、composer install が正しく動作して、Capistrano によるデプロイを上手く実行できるようになった。ここで作成した composer コマンドについての詳細は以下を参照。
Composer should be invoked via the CLI version of PHP, not the cgi-fcgi SAPI | EasyRamble
SSHKit::Runner::ExecuteError/composer stdout: Nothing written | EasyRamble
最後におまけ、PHP で intl extension(intl 拡張)が有効になっているか確認する方法です。
1 2 3 4 |
$ php -m | grep intl intl |
これで上記のように intl が表示されれば有効になっています。
特定の php.ini を読み込んで確認する場合。
1 2 3 4 |
$ php -c /path/to/php.ini -m | grep intl intl |
または、phpinfo() で intl が出力されるかどうかでも確認可能です。
- PHP & CakePHP の関連記事
- PHP+MySQLでNo such file or directoryエラー
- bin/cakeコマンドでintlエラーが出る場合の対処(CakePHP)
- CakePHPアプリケーションをCapistranoでデプロイ
- Integrity constraint violation:Column ‘created’ in order clause is ambiguousエラー/CakePHP
- CakePHPでDB関連テーブルのレコード・データを取得
- CakePHPでカラム属性に別名/エイリアスを付ける仮想フィールド
- CakePHPで日付選択フォームのカスタマイズ
- CakePHP3で現在のコントローラー名・アクション名を取得
- PHPインストールでconfigure: error: freetype.h not foundエラー
- CakePHPでログイン後に元のページにリダイレクトさせる
Leave Your Message!