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の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説
CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
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」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
CakePHPのデバッグ用のツールであるDebugKitは適切な設定をしないとエラーログにワーニングメッセージが出力される。それを解消する方法を解説。
-
-
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHPのログ出力方法の解説。app.phpにログ設定をし、スコープやレベルを指定してログ出力を振り分ける方法、CakePHP4で配列出力にはvar_exportが必要なことなどを解説。
-
-
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
CakePHP3で検索を担うプラグイン「friendsofcake/search」の紹介。基本的な設置方法の紹介のほか、処理の記述方法のバリエーション、エラーの解説など。CakeDC/searchより導入は簡単!
-
-
CakePHP 2.3 デバッグキット(DebugKit)超初心者向けフォロー講座
CakePHP初心者に向けてデバッグキット(DebugKit)のインストール方法、はまりポイントを解説。
-
-
CakePHP3でデータを保存する save()で発生するエラーを確認する方法を解説
CakePHP3でデータ保存処理のログを取得する方法。save()では true、falseの戻り値しか取得できないが、saveOrFail()と try…catch文を使いエラーログ、エンティティを取得し、不具合の解析を行う。
-
-
CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法
CakePHP4で.env、app_local.phpに定数を定義してそれを呼び出す方法の解説。Gitでは管理せず本番環境と開発環境とで異なる定数を定義するためそれを利用する方法。
-
-
CakePHP3でWarning Error: SplFileInfo::openFile()エラーが発生した場合の対処方法
CakePHP3のキャッシュファイルのパーミッションエラー Error: SplFileInfo::openFile()が発生した場合の対応方法解説。app.phpにキャッシュファイルのパーミッション設定を行い、既存のファイルは削除。
-
-
cakephp3 カスタムバリデーションを簡易的に実装する方法
CakePHP3の独自のバリデーションをテーブルクラス内に簡単に記述する方法を解説。他のテーブルクラスでは使えないが、記述する量は少なく実装できるため、他で使わない処理を書くのには便利。
-
-
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
CakePHP4でコマンドを実行する際に引数(パラメータ)をコマンド内で受け取る処理について解説。複数個の引数にも対応する記述方法も解説。
-
-
getParam('action')で取得するアクション名は別関数に移動しても不変CakePHP4系、5系では「getParam()」で処理中のアクション名を取得できる。そのアクションから別関数を呼び出してた関数でアクション名を調べたが同一の名称だった。