web-dev-qa-db-ja.com

SplFileInfo :: openFile(/ app / tmp / cache / persistent / cake_core_cake_console_):ストリームを開くことができませんでした:/ lib /.../ FileEngine.php行293でアクセスが拒否されました

私は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が常に存在することを確認する方法はありますか?

21
penguin egg

そこにバグレポートがありました http://cakephp.lighthouseapp.com/projects/42648/tickets/2172 しかし、それはバグではないと見なされました。

私が個人的に気付いたのは、コンソールでcakeスクリプトを使用すると、ファイルの所有者が変更される可能性があることです(たとえば、bakeを作成するため)。変更されたファイルは、コンソールで使用するユーザーに属します。

これは、ルートでcakeを呼び出すことを意味しますか?または、Cake Shellスクリプトを呼び出すルートcronジョブはありますか?

個人的に私はchmodスクリプトを使用した後、Apacheユーザーにtmpフォルダーのコンテンツ全体をcake戻す癖があり、警告が表示されないようです。

15
nIcO

これを解決するには、core.phpの設定にマスクを追加します

Cache::config('default', array(
    'engine' => 'File',
    'mask' => 0666,
));
27
rtconner

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ビットを設定すると、そのディレクトリに作成されたファイルが、シェルスクリプトを実行するユーザーに関係なく、適切なグループ権限を確実に取得できるようになります。これにより、「他の」ユーザーに対する読み取り/書き込み権限を除外することもできます。

7
Code Commander

Cronはrootユーザーで実行され、tmpに作成されたファイルにはWebユーザーがアクセスできないため、問題の理由はすでに説明されていると思います。他の解決策は私にはうまくいきませんでした、そして私はtmpパーミッションを777に設定したくありませんでした、私は結局ウェブユーザーのためにcronジョブを設定しました、特にdebianではそうなるでしょう

crontab -u www-data -e

この回答からの抜粋 どのユーザーがスクリプトを実行するかをcrontabで指定する方法は?

2
dav

CakePHP2でSplFileInfoエラーが発生し、ファイル/ディレクトリのアクセス許可が適切に設定されていることが確実な場合は、もう1つ確認する必要があるのはPHPバージョンです。Cake2には=が必要です。 PHP 5.2.8以上。通常、間違ったバージョンを使用している場合はデフォルトのページでアラートが表示されますが、1つのサーバーでアプリを開発した場合はアラートが表示されません。その後、別の場所に移動しました。

PHP5.3サーバーでCake2アプリを開発し、それをPHP 5.1サーバーに移動した後にこのエラーが発生しました。5.2.17(5.2.8より上)にアップグレードすると問題が解決しました。

0
Joseph

これを使って ..

cd cakephp/app/tmp/cache/persistent 

Sudo chmod 666 myapp*

cd ..

cd models

Sudo chmod 666 myapp*
0
Ashish

App/tmpディレクトリをWebサーバーで書き込み可能にする必要があります。ウェブサーバーが実行しているユーザー(私の場合は_www)を確認し、app/tmpディレクトリの所有権をそのユーザーに変更します:$ chown -R _www app/tmp

0
andres_v

別のソリューション。複数のユーザーが同じファイルを共有しているため、権限の競合が発生しました。したがって、キャッシュディレクトリを複数のサブディレクトリに分割しても、競合は発生せず、ディレクトリとファイルのデフォルトのアクセス許可を変更する必要もありません。

以下のように、各サブキャッシュディレクトリは、php apiハンドラーのタイプによって定義されます。

define('CACHE', TMP . 'cache' . DS . php_sapi_name() . DS);
  • Webサイトを閲覧する場合、アクティブユーザーはApacheです。そして、サブディレクトリはcache/Apache2handlerです。
  • バッチを実行する場合、アクティブユーザーはrootまたはログインユーザーです。そして、サブディレクトリはcache/cliです。

反対に、現在のユーザーアカウントを使用してサブディレクトリに名前を付けることができます。確認してください どのユーザーphpが実行されているかを確認する方法は?

0
Nguyen Van Vinh