ウェブからアプリケーションにアクセスしてAPCを使うと普通に使えるのに、
コマンドラインから cake すると何故か使えなくて困っていました。
解決したので方法をメモしておきます。
環境
- MAMP 2.1.3
- PHP 5.4.10
- CakePHP 2.4.0
事象
PHPUnitでテストしようと思ったらこんなエラーが出ていました。
$ ./lib/Cake/Console/cake test core AllTests
PHP Warning: _cake_core_ cache was unable to write 'cake_dev_eng' to Apc cache in /var/www/line_street/lib/Cake/Cache/Cache.php on line 325
PHP Warning: _cake_core_ cache was unable to write 'cake_console_eng' to Apc cache in /var/www/line_street/lib/Cake/Cache/Cache.php on line 325
Warning Error: include(PHPUnit/Autoload.php): failed to open stream: No such file or directory in [/var/www/line_street/lib/Cake/TestSuite/CakeTestSuiteDispatcher.php, line 150]
2013-11-24 15:36:39 Warning: include(PHPUnit/Autoload.php): failed to open stream: No such file or directory in [/var/www/line_street/lib/Cake/TestSuite/CakeTestSuiteDispatcher.php, line 150]
Warning Error: include(): Failed opening 'PHPUnit/Autoload.php' for inclusion (include_path='.:/usr/local/lib/php') in [/var/www/line_street/lib/Cake/TestSuite/CakeTestSuiteDispatcher.php, line 150]
2013-11-24 15:36:39 Warning: include(): Failed opening 'PHPUnit/Autoload.php' for inclusion (include_path='.:/usr/local/lib/php') in [/var/www/line_street/lib/Cake/TestSuite/CakeTestSuiteDispatcher.php, line 150]
Error: Please install PHPUnit framework (http://www.phpunit.de)
#0 /var/www/line_street/lib/Cake/Console/ShellDispatcher.php(208): TestShell->initialize()
#1 /var/www/line_street/lib/Cake/Console/ShellDispatcher.php(68): ShellDispatcher->dispatch()
#2 /var/www/line_street/lib/Cake/Console/cake.php(51): ShellDispatcher::run(Array)
#3 {main}
Warning Error: _cake_core_ cache was unable to write 'file_map' to Apc cache in [/var/www/line_street/lib/Cake/Cache/Cache.php, line 325]
2013-11-24 15:36:39 Warning: _cake_core_ cache was unable to write 'file_map' to Apc cache in [/var/www/line_street/lib/Cake/Cache/Cache.php, line 325]
ここで言われていることは二つ。
APC の書き込みが出来ないということと、PHPUnit をインストールしてくださいということです。
コマンドラインからの APC 有効化
app/Config/core.php のキャッシュエンジン設定はこうなってます。
$engine = 'Apc';
一応 php のパスを確認。
$ which php
/Applications/MAMP/bin/php/php5.4.10/bin/php
ちゃんと MAMP の PHP を読み込んでいるので大丈夫そうです。
次に apc_sma_info を実行してみて APC の動作確認。
今回は直接 php コマンドの -r オプションで実行して確認してみます。
$ /Applications/MAMP/bin/php/php5.4.10/bin/php -r 'var_dump(apc_sma_info());'
Warning: apc_sma_info(): No APC SMA info available. Perhaps APC is disabled via apc.enabled? in Command line code on line 1
Call Stack:
0.0005 226808 1. {main}() Command line code:0
0.0005 227416 2. apc_sma_info() Command line code:1
bool(false)
false が返ってきていて、APC が無効だと言われています。
「php.ini の apc.enabled が有効になっていますか」という旨のことを言われているので確認します。
$ php -r 'phpinfo();' | grep apc.enable
apc.enable_cli => Off => Off
apc.enabled => On => On
apc.enabled はちゃんと有効でしたが、apc.enable_cliが無効になっています。
apc.enable_cli が無効だと、コマンドラインから APC を利用することが出来ません。
php.ini を編集します。
$ vi /Applications/MAMP/bin/php/php5.4.10/conf/php.ini
一番下に以下の設定を追記しました。
apc.enable_cli = 1
Apache を再起動して再度確認します。
$ php -r 'phpinfo();' | grep apc.enable
apc.enable_cli => On => On
apc.enabled => On => On
有効になりました!
PHPUnit のインストール
ついでにさっき怒られていた PHPUnit がインストールされていない件も対応します。
pear コマンドで PHPUnit のインストール先を確認しておきます。
$ /Applications/MAMP/bin/php/php5.4.10/bin/pear config-get php_dir
/Applications/MAMP/bin/php/php5.4.10/lib/php
インストールします。
$ /Applications/MAMP/bin/php/php5.4.10/lib/php upgrade-all
$ /Applications/MAMP/bin/php/php5.4.10/lib/php config-set auto_discover 1
$ /Applications/MAMP/bin/php/php5.4.10/lib/php install pear.phpunit.de/PHPUnit
エラーが出なければ OK です。
これで無事に CakePHP で PHPUnit が使えるようになりました。
今回は MAMP 環境でしたが、XAMPP でも似たような感じだと思います。
参考ドキュメント