Tech Racho エンジニアの「?」を「!」に。
  • IT Tips

VSCode: PHP IntelliSenseを使っていてPHP Language Serverのキャッシュで困った話

gengenです。入社して1年ちょっと経ちました。
個人的な開発でvscodeのPHP IntelliSenseのキャッシュに悩まされたのでトラブルシューティング的なものを書かせていただきます。

TL;DR

キャッシュが原因でPHP IntelliSenseの挙動がおかしいときは
PHP Language Serverのキャッシュディレクトリを消そう。

環境

  • PHPのバージョン: 7.3.11
  • Visual Studio Codeのバージョン: 1.41.1
  • PHP IntelliSenseのバージョン: 2.3.13

ディレクトリ構成

  • sample(projectRoot)
    • src
      • app
      • vendor
      • ...

急にコードジャンプが出来なくなった

何もしてないのにvscodeが壊れた
いつの間にかvendor配下にコードジャンプが出来なくなっており、
ジャンプしようとすると以下のようなエラーが表示されます。

'AuthorizesRequests.php' を開くことができません: ファイル (Error: ファイルが見つかりません (/Users/gen/dev/sample_app/server/src/vendor/laravel/framework/src/Illuminate/Foundation/Auth/Access/AuthorizesRequests.php)) を読み取ることができません。

projectRoot/server/src/vendor配下を見に行ってますが、現在のvendorディレクトリはprojectRoot/src/vendorにあるのでジャンプ先のファイルはそこにはありません。

確かに以前、以下のようにserverディレクトリを挟む構成にしていたことがありました。
意味が無いので今の構成に変えたのですが、どうやら昔のパスを見に行っているようです 🤔

  • sample(projectRoot)
    • server
      • src
        • app
        • vendor
        • ...

原因

PHP IntelliSenseはPHP Language Serverを使ってハイライトや補完をしています。
PHP Language Server の出力を見てみると、どうやらvendor配下のライブラリはキャッシュする仕組みになっていて更新されていないようです

Parsing file:///Users/gen/dev/sample_app/src/server.php
Parsing file:///Users/gen/dev/sample_app/src/bootstrap/app.php
Parsing file:///Users/gen/dev/sample_app/src/bootstrap/cache/services.php
# 中略
[Info  - 13:57:45] Restored laravel/tinker:1.0.10 from cache
[Info  - 13:57:45] Restored laravel/framework:6.6.2 from cache

解決方法

PHP Language Serverのキャッシュディレクトリを消すしか無いようです(参考)。

私の環境では$HOME/.phplsでした。
ファイル名を見た感じライブラリごとにキャッシュファイルがあるみたいなので頑張れば狂った部分だけ削除できそうですが頑張れないのでまるっと削除しました。

終わりに

同じトラブルに遭遇した方のお役に立てれば幸いです。

完全に蛇足ですが、
ちょうど今回のことで困っていたところ、知り合いからPHP Intelephenseを紹介されました。
IntelliSenseより軽いような気がしますし、今回のトラブルの原因になったディレクトリ構成の変更をしても狂わなかったので乗り換えました。今の所不便はないです。
現場からは以上です👷良いお年を🙇


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。