【Laravel】エラーの原因と対処法:file_put_contents : failed to open stream: No such file or directory

laravel-prograshi(プロぐらし) Laravel
記事内に広告が含まれていることがあります。

エラーの内容

Laravelでphp artisan serveを実行してプロジェクトを起動した時に以下のようなエラーが発生したときの原因と対処法についてまとめています。

ErrorException
file_put_contents(/Users/user-name/projects/laravel/project-name/storage/framework/sessions/rm5ErjSuDCNFIMMm3j7kV7iMMrqHeo9fXBOQ3rdi): failed to open stream: No such file or directory


発生原因

ファイル名を変更したり、ディレクトリを移動したり、クラスを削除するなど、元々指定していたパスに必要な情報がなくなった時に発生するエラーです。

(私の場合はプロジェクトのディレクトリを丸ごと移動させたために発生しました。)


対処法

以下3つのコマンドを実行します。

$ php artisan config:cache
$ php artisan config:clear
$ composer dump-autoload -o

キャッシュファイルの更新・削除とautoloadの再読み込みを行います。


php artisan config:cache

php artisan config:cacheは、キャッシュクリア後にキャッシュファイルを作成するコマンドです。

これを実行するとキャッシュファイルが作成され、Laravelがキャッシュファイルを参照するようになってしまうので、開発環境で実行した場合はキャッシュの再削除が必要です。(変更のたびにキャッシュファイルを更新しなければいけなくなるため)

本番環境の場合は頻繁な更新がなく、高速化のためキャッシュファイルを参照するようにします。


実例

$ php artisan config:cache
Configuration cache cleared!
Configuration cached successfully!


php artisan config:clear

php artisan config:clearは、作成したキャッシュファイルを削除するコマンドです。

実例

$ php artisan config:clear 
Configuration cache cleared!


composer dump-autoload -o

composer dump-autoload -oは、名前空間として読み込むクラスを最適化して再ロードするコマンドです。

composer
指定したディレクトリ配下のクラスを名前空間として呼び出せるようにする。(都度requireで呼び出す必要がなくなる)

dump-autoload
クラスの再読み込みをするコマンド。dumpは既存の読み込みを一度廃棄する意味。

-o
optimiseオプション。指定したルール(ここではPSR4)に則ってオートロードしたファイルを最適化する。

これをすることで、webページを表示する速度が改善します。デフォルトでないのはコンパイルに時間がかかるためです。

-o, –optimize Optimizes PSR0 and PSR4 packages to be loaded with classmaps too, good for production.


autoloadの設定場所|PSR4とは何か?

autloadの設定はcomposer.jsonに記述してあります。

psr-4はautloadの仕様です。"名前空間\\": "ディレクトリパス/"で記述します。

例えば"App\\": "app/"の場合、appディレクトリ配下のクラスをApp\\という名前空間で呼び出すことができます。

    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        },
        "files": [
            "app/helpers.php"
        ]
    },

autloadしたファイルを呼び出すには、public/index.phpの中で、autloadしたファイルを呼び出す必要があります。

require __DIR__.'/../vendor/autoload.php';


コマンド実行の実例

$ php artisan config:cache
Configuration cache cleared!
Configuration cached successfully!

$ php artisan config:clear 
Configuration cache cleared!

$ composer dump-autoload -o
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/breeze
Discovered Package: laravel/sail
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
Generated optimized autoload files containing 4628 classes

以上で、エラーが解消します。

タイトルとURLをコピーしました