私はCakePHP2プロジェクトに取り組んでいます。当初は2.0.xで始まり、最近2.1.0に移行しました。開発プロセス全体を通して、以下のエラーメッセージが表示されます。
予期せずページの上部にポップアップします。別のページを表示しているとき、またはデータベースにレコードを追加した後でも発生する可能性があります(ただし、レコードは適切に保存されます)。
Warning:
SplFileInfo::openFile(/var/www/cake_prj/app/tmp/cache/persistent/cake_core_cake_console_):
failed to open stream:
Permission denied in
/var/www/cake_prj/lib/Cake/Cache/Engine/FileEngine.php on line 293
Tmpフォルダーの所有者とグループをApacheに再帰的に設定しましたが、それでもメッセージを受信しました。さらに、すべてのユーザーに対して読み取り、書き込み、および実行するためのアクセス許可を再帰的に設定します(chmod777)。エラーメッセージは引き続き表示されます。
所有者、グループ、およびアクセス許可の両方を変更した後でも、問題のファイルは次のとおりです。
cake_prj/app/tmp/cache/persistent/cake_core_cake_console_
所有者とグループがルートに設定され、権限がデフォルトに設定されます。
この問題の原因は何ですか?このファイルが生成されるたびに、読み取り/書き込み/実行権限を持つApache:apacheが常に存在することを確認する方法はありますか?
そこにバグレポートがありました http://cakephp.lighthouseapp.com/projects/42648/tickets/2172 しかし、それはバグではないと見なされました。
私が個人的に気付いたのは、コンソールでcake
スクリプトを使用すると、ファイルの所有者が変更される可能性があることです(たとえば、bake
を作成するため)。変更されたファイルは、コンソールで使用するユーザーに属します。
これは、ルートでcake
を呼び出すことを意味しますか?または、Cake Shellスクリプトを呼び出すルートcronジョブはありますか?
個人的に私はchmod
スクリプトを使用した後、Apacheユーザーにtmpフォルダーのコンテンツ全体をcake
戻す癖があり、警告が表示されないようです。
これを解決するには、core.phpの設定にマスクを追加します
Cache::config('default', array(
'engine' => 'File',
'mask' => 0666,
));
Tmp/cacheディレクトリの全員に読み取り/書き込みアクセスを許可するように設定する代わりに、次のようにしました。
chgrp -R www-data app/tmp
chmod -R g+rw app/tmp
find app/tmp -type d -exec chmod g+s {} \;
ディレクトリのグループをApacheユーザーに設定してから、setgidビットを設定すると、そのディレクトリに作成されたファイルが、シェルスクリプトを実行するユーザーに関係なく、適切なグループ権限を確実に取得できるようになります。これにより、「他の」ユーザーに対する読み取り/書き込み権限を除外することもできます。
Cronはrootユーザーで実行され、tmpに作成されたファイルにはWebユーザーがアクセスできないため、問題の理由はすでに説明されていると思います。他の解決策は私にはうまくいきませんでした、そして私はtmpパーミッションを777
に設定したくありませんでした、私は結局ウェブユーザーのためにcronジョブを設定しました、特にdebianではそうなるでしょう
crontab -u www-data -e
この回答からの抜粋 どのユーザーがスクリプトを実行するかをcrontabで指定する方法は?
CakePHP2でSplFileInfoエラーが発生し、ファイル/ディレクトリのアクセス許可が適切に設定されていることが確実な場合は、もう1つ確認する必要があるのはPHPバージョンです。Cake2には=が必要です。 PHP 5.2.8以上。通常、間違ったバージョンを使用している場合はデフォルトのページでアラートが表示されますが、1つのサーバーでアプリを開発した場合はアラートが表示されません。その後、別の場所に移動しました。
PHP5.3サーバーでCake2アプリを開発し、それをPHP 5.1サーバーに移動した後にこのエラーが発生しました。5.2.17(5.2.8より上)にアップグレードすると問題が解決しました。
これを使って ..
cd cakephp/app/tmp/cache/persistent
Sudo chmod 666 myapp*
cd ..
cd models
Sudo chmod 666 myapp*
App/tmpディレクトリをWebサーバーで書き込み可能にする必要があります。ウェブサーバーが実行しているユーザー(私の場合は_www)を確認し、app/tmpディレクトリの所有権をそのユーザーに変更します:$ chown -R _www app/tmp
別のソリューション。複数のユーザーが同じファイルを共有しているため、権限の競合が発生しました。したがって、キャッシュディレクトリを複数のサブディレクトリに分割しても、競合は発生せず、ディレクトリとファイルのデフォルトのアクセス許可を変更する必要もありません。
以下のように、各サブキャッシュディレクトリは、php apiハンドラーのタイプによって定義されます。
define('CACHE', TMP . 'cache' . DS . php_sapi_name() . DS);
反対に、現在のユーザーアカウントを使用してサブディレクトリに名前を付けることができます。確認してください どのユーザーphpが実行されているかを確認する方法は?