こんにちは、フルスタックエンジニアのryuです。
今回の記事では、cakephpでWarning (512): SplFileInfo::openFile()というエラーが出たときの対処方法を解説します。エラーの原因は”Permission denied”。つまり、ファイルのパーミッションでした。ファイルの権限変更の方法を詳しく解説します。
目次
【cakephp】Warning (512): SplFileInfo::openFile()というエラーの対処方法
cakephpでエラーが出て対処できません・・・
今回の記事では、下記のエラーが発生した場合の対処方法を解説したいと思います。
今回発生したエラーはこちら。
Warning (512): SplFileInfo::openFile(/var/www/html/tmp/cache/models/myapp_cake_model_default_administrators): failed to open stream: Permission denied [CORE/src/Cache/Engine/FileEngine.php, line 395]
Warning (512): SplFileInfo::openFile(/var/www/html/tmp/cache/models/myapp_cake_model_default_administrators) [splfileinfo.openfile]: failed to open stream: Permission denied [CORE/src/Cache/Engine/FileEngine.php, line 395]
Warning (512): _cake_model_ cache was unable to write 'default_administrators' to DebugKit\Cache\Engine\DebugEngine cache [CORE/src/Cache/Cache.php, line 244]
では、エラーの対処方法を解説します。
【対処方法】ファイルのパーミッションを変更する
今回のエラーは、キャッシュファイルへの書き込み権限がないために発生したエラーでした。
そのため、下記のコマンドでキャッシュファイルへの書き込み権限を与えれば問題ありません。
chmod 777 /var/www/html/tmp/cache/models/myapp_cake_model_default_administrators
chmod [権限] [ファイル]
もしく、はファイルの所有者をWebサーバーのプロセスを動かしているユーザー(apache)に変更します。
chown apache /var/www/html/tmp/cache/models/myapp_cake_model_default_administrators
chown [ユーザ名] [ファイル]
これで、エラーは無くなりました。
cakephpのcoreファイルにmaskを設定してキャッシュファイルの権限を変更する方法もあります。今回は簡単に対処するために、直接権限を変更しました。
キャッシュの設定については、こちらの公式ドキュメントを参考にしてください。
なぜWarning (512): SplFileInfo::openFile()というエラーが発生したのか?
なぜWarning (512): SplFileInfo::openFile()というエラーが発生したのかというと、私の環境の場合、ファイルの作成者がrootユーザーになっていました。
今回は、Linuxのapache上にcakephpが動作しています。cakephpはrootユーザーで作成し、apacheはapacheユーザーで動作しているため、権限の整合性が取れておりませんでした。キャッシュファイルの権限はrootが所有者で644でした。
このようなエラーを無くすために、cakephpのcore.phpファイルに下記の設定を行いました。これは、キャッシュファイルの権限をしていする設定です。
'Cache' => [
'default' => [
'className' => 'Cake\Cache\Engine\FileEngine',
'path' => CACHE,
'url' => env('CACHE_DEFAULT_URL', null),
"mask" => 0666, //←これを追加
],
'_cake_core_' => [
'className' => 'Cake\Cache\Engine\FileEngine',
'prefix' => 'myapp_cake_core_',
'path' => CACHE . 'persistent/',
'serialize' => true,
'duration' => '+1 years',
'url' => env('CACHE_CAKECORE_URL', null),
"mask" => 0666, //←これを追加
],
'_cake_model_' => [
'className' => 'Cake\Cache\Engine\FileEngine',
'prefix' => 'myapp_cake_model_',
'path' => CACHE . 'models/',
'serialize' => true,
'duration' => '+1 years',
'url' => env('CACHE_CAKEMODEL_URL', null),
"mask" => 0666, //←これを追加
],
maskで権限の設定を加えました。
キャッシュの設定については、詳しくはこちらのドキュメントを参考にしてください。
cakephpエラーのまとめ
今回は、キャッシュファイルのパーミッションのエラーでした。
Permission deniedというエラーを見つけたら、chmodコマンドやchownコマンドを使用して、パーミッションの変更をしましょう。
また、パーミッションを確認するときは、「ls -la」コマンドを使うとみることができます。
linuxファイルの権限変更については、こちらの記事で詳しく解説しております。ぜひ参考にしてください。
以上で解説を終わります。
下記は私が使用している参考書です。