CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
2024/09/08
CakePHP4の cake cache clear_allで Permission deniedのエラーの時は cakeにパーミッションが不足している可能性大
パーミッション不足はキャッシュファイルではなくcakeコマンドの方
CakePHP4でキャッシュをクリアする「cake cache clear_all」コマンドを実行したとき、「-bash: bin/cake: Permission denied」のエラーが出るときは、「cake」にパーミッションが与えられていないために発生します。
このエラーが出たとき、コマンドを実行して削除するキャッシュファイルの方にパーミッションが正しく設定されていないのかと思っていましたが、そうではなく、「/bin/cake」のコマンドプログラムの方にパーミッションが足りていない状況でした。
「/bin/cake」に実行権限を付与する
というわけで、原因が分かれば対応は簡単です。
下記コマンドを実行して、「/bin/cake」に実行権限を付与します。
1 |
sudo chmod 744 ./bin/cake |
「cake」ファイルまでのパスや、「744」で指定しているパーミッションは、環境に応じて変更してください。
「744」のパーミッションは、ユーザのグループ設定の影響もありますので、「754」にする必要がある場合もあるかもしれません。
ちなみに、「cake cache clear_all」コマンドについては下記に記事を書いていますので、併せて参照してください。
「CakePHP3、CakePHP4のキャッシュをクリアする方法「bin/cake cache clear_all」を使う」
「/bin/cake」に実行権限が付与されない理由の一つ
何で「/bin/cake」に実行権限が付与されないのだろうか、と悩んでいました。
これまでそんな不具合なかったのになぁ、と。
この記事を読んでいる方、XAMPP環境で開発を行っていませんか?
そして、Linux系の本番環境にプログラムを移動させてからこの不具合が発生していませんか?
私は XAMPP環境で構築したプログラムを、そのまま Linux環境にアップロードしました。
そしたら、そこで発生するようになりました。
最初に、Linux環境で構築した CakePHPの「/bin/cake」には実行権限が付与されていたのではないか、と思います。
そこに、Windows上に構築した XAMPP環境で構築した CakePHPを Gitを経由して上書きしたのですが、Windows環境の「/bin/cake」には実行権限という概念がなく、一般的なファイルとしてそのまま上書きされたのだろうと思います。
そのため、「cakeコマンド」を実行しようとしたところ権限がないですよ、というエラーになったのだと考えています。
キャッシュファイルのパーミッションを設定する
前項で「/bin/cake」コマンドのキャッシュ設定について説明しましたが、それだけでは記事が短いので、キャッシュファイルのパーミッションを設定する方法も解説します。
CakePHP4のキャッシュファイルの設定は「/config/app.php」ファイルに記述されています。
バージョンなどによって多少違うと思いますが、97行目辺りに「'Cache' => [
」という記述があるかと思います。
この辺りからキャッシュについての設定が記述されています。
これに対して、8行目の「'mask' => 0664,
」を追記します。
1 2 3 4 5 6 7 8 9 |
'_cake_core_' => [ 'className' => FileEngine::class, 'prefix' => 'myapp_cake_core_', 'path' => CACHE . 'persistent' . DS, 'serialize' => true, 'duration' => '+1 years', 'url' => env('CACHE_CAKECORE_URL', null), 'mask' => 0664, ], |
上記は「_cake_core_」のキャッシュについての設定になりますが、同様の対応を「_cake_model_」「_cake_routes_」の設定情報にも追記します。
場合によっては 7行目の最後に「,
(カンマ)」がない場合もあるかもしれませんので、ない場合はカンマも追記してください。
また、上記の設定では、キャッシュファイルのパーミッションを「664」にする設定にしていますが、環境によっては「666」の方がいい場合もあると思います。
今回の解説は、キャッシュについてでしたが、ログの出力方法、および、ログファイルのパーミッションなどの設定方法もキャッシュとよく似ています。
ログについては下記にまとめていますので、併せて参考にしてください。
「CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説」
CakePHP4の関連記事
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
その他の「CakePHP4」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。CakePHP4で使う場合のUsersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。
-
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。
-
CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説
CakePHP4で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定しそれを読み込み判別する。
-
CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方
CakePHPで確認画面付きのお問い合わせフォーム、メールフォームの作り方をサンプルを提示しながら解説。
-
CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()
CakePHP4でデフォルトのレイアウトファイル「default.php」は管理側に使用し、これとは別のデザインを公開側のページに設定したい、を実装する方法を解説。
-
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でテーブルの数値項目に対してlike句を使用した部分一致検索を実行するとエラーが発生する。クリエービルダーの不具合だと思われ対処方法が分からない。
-
CakePHPで favicon.icoやapple-touch-icon-144-precomposed.pngが could not be foundのエラーが出るときの対処方法
CakePHPで「CakeDC/Users」などルーティングを行うプラグインを利用するときに、favicon.icoやapple-touch-icon-144-precomposed.pngがNotFoundエラーになることがある。その対処方法の解説。
-
CakePHP 2.3 主キー(ID)以外のキーで更新方法 updateAll
主キー(ID)以外のカラムをキーとして更新する方法、updateAllの使い方をサンプルを用いて解説します。
-
CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説
CakePHP3からメールを送信する方法解説。基本的な記述方法を基にして、テンプレートを使う方法、ファイルを添付する方法へと拡張しながら解説。
-
CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。Usersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。