Laravelのプロジェクトを移動させると起動ができない
概要
XSERVERを契約しており、HOMEの直下にプロジェクトディレクトリを直接保存していたため、Projectというディレクトリを作成して、そこに各プロジェクトディレクトリを移動したところ、起動できなくなった。
HOME
├Project 👈新しいディレクトリ
│├chat-app 👈こんな感じに移動
│├bbs-app
├chat-app 👈元の場所
├bbs-app
プロジェクトディレクトリはいくつかあって、2つ程同じ状態となっている。
エラー内容
Fatal error: Failed opening required '/home/<server-username>/<domain>/public_html/chat-app/index.php' (include_path='.:/opt/php-8.1.22/data/pear') in Unknown on line 0
判断材料
- 複数プロジェクトの内2つだけで発生
- 発生しているプロジェクトと発生していないプロジェクトで移動元や移動先は同じ
- 発生しているプロジェクトと発生していないプロジェクトで同じバージョンの環境(PHP, Laravel, composer)も存在している
- XSERVERの
public_html
に設定されているシンボリックリンクを消し込むと、別のエラー(ページが見つかりません)となるため、Laravelによるエラーであることが分かる。 - 移動ではなくコピー(元のディレクトリが残っている状態に)すると発生しない
考察
エラー内容は「ファイルが読み込めない」ということは、翻訳や検索で何となく分かる。
またこれらの内容は「ファイルが存在しない」または「ファイルにアクセスできない」との意味と読み取れる。
まずは、*/chat-app/index.php
が存在するか確認するも問題ない。パーミッション(アクセス権)も特におかしな点はなし。フルアクセスにしても変わりなし。
また、判断材料の最後の点から察するに旧ディレクトリの位置がどこかに残っており、そこを読みにいこうとしてファイルが存在しないことになっていると思われる。
結果
執筆時点で自己解決ができず、いったん元に戻している状態。
このエラーについて検索するも、「ファイルが読み込めない」状態であること以外の情報が出てこないため、解決の糸口が見つからず、同じ状態に陥っている人もいるんじゃないかと思い投稿。
もし解決策をご存じの方がおりましたら、ご教示いただけますと幸いです。
新規プロジェクトを作成してみる
引き続き調査してみたことを追記
Project配下に新規chat-appプロジェクトを作成して、シンボリックも修正。
するとLaravelの初期画面ではなく画面が崩れた状態のchat-appが表示された。
新規に作成したchat-appを削除すると「ページが表示できませんでした。」となる。
やはりどこかに旧ディレクトリの位置を記憶してしまっている気がする。
新規Laravelを作成してもということは、サーバー側・・・?
シンボリックリンクのキャッシュが原因?
上記サイトで同じことが起きている様子。
上記サイトでは、結論としてサーバーのキャッシュをクリアしたことで解決したとあるが、私も同じことは感じており、キャッシュの削除も試しているが解決していない。
因みに、今回、私の環境で起きているのは、サブドメイン設定している「chat-app.dainaka.live」で起きている。
サブドメインにはキャッシュを削除する処理はないため、メインドメインで実施しているが直らない。
また、Laravelの問題と思っていたが、今回の件と👆の新規プロジェクトを作成しても新規Laravel画面ではなかったことから、Laravelの問題ではなくサーバーの問題と疑い始めている・・・。
結論
Laravelの問題ではなく、サーバーのキャッシュによる問題の可能性大。
これまでは原因が分からず、解決しないまま元の場所に戻していた。
昨日の投稿後は、症状が発生したまま時間を置くためそのままにしていたが、今見てみると症状は解消している。
恐らく、キャッシュがクリアされて、移動後の場所でちゃんと動き出したと思われる。
Laravelではなく、サーバーのキャッシュが悪さしていた?
ただし、サーバのキャッシュを削除した直後は症状が発生していたことから、根本原因が分からずモヤモヤ。
少なからずオペレーションに間違いはなく、Laravelの問題でもなかったので、サーバー次第では起きないと思われる。
ちょうど同じような問題がおきて辿り着きました。
VPSでないXSERVERだとサーバの再起動ができないからどうしたものかと思いましたが、
どうやらOPcacheが原因だったらしく、自分の環境では opcache_reset()
を実行したら解決できました。
kaminalyさん
貴重なコメントを有難うございます。
いただいた参考ページの記事を読んでみましたが、今の私ではopcache_reset()関数を実行することで解決することは分かりましたが、そのコマンドが何をしているものなのか、結果としてどういったところに効いて解決されているのかが分かりませんでした。
もう少し勉強して、機会があれば検証までしてみたいと思います🙂