EC-CUBE 4でFailed opening required ‘/var/cache/prod/doctrine/orm/Proxies/…エラー

木曜日 , 25, 10月 2018 Leave a comment

 タイトルの通り。

 もう少し正確に書くと以下のようなエラーが出た。

 

Failed opening required ‘/var/cache/prod/doctrine/orm/Proxies/__CG__{なにかエンティティクラス名.php’ 

 

 キャッシュが作られていない(または期限切れ)状態でのページ表示がタイムアウトなどで失敗し、doctrine(DB周り)のキャッシュが作られなかったが、ほかのキャッシュはある程度作られている状態で発生するっぽい。

 

 仮想マシン+Win10+XAMPPという激重環境で発生したけど、アクセスが多いサイトなら発生する可能性はある。

 

 再現させるのは簡単で、一度ページを開きキャッシュが生成された状態にして、/var/cache/prod/doctrine/orm/Proxies/以下のファイルを全部削除してしまえばいい。

 このエラーでやっかいなのは一度発生すると作られなかったキャッシュに該当するエンティティクラスを利用するページで必ずエラーになること。キャッシュなので時間がたてば期限切れで再度生成されるんじゃないかと思うけど、それまでの間はエラーになり続けるっぽい。

 

 寿司も作れるEC-CUBE界隈のハイスペックエンジニアの方に相談すると、どうやらSymphony 3の挙動っぽい。

 

 というわけで、ネットで調べてみると対応方法は以下の通り、

 (参考)stackoverflow : Symfony Cache doctrine/orm/Proxies failed to open stream /Proxy/AbstractProxyFactory.php on line 209

 

app/config/eccube/packages/doctrine.yaml を以下のように修正

 

    orm:
        auto_generate_proxy_classes: '%kernel.debug%'

 

 を、

 

    orm:
        auto_generate_proxy_classes: true

 

 変更したらキャッシュをいったんクリア(/var/cache/prod/以下のファイルを削除)しておく。たぶん、設定もキャッシュしているからそれをクリアするため。

 

 初期状態では、一度サイトにアクセスした際に、すべてのエンティティクラスへのキャッシュを生成して、以降はキャッシュが作られている前提で処理を進めるのでファイルが無いとエラーになる。

 設定を変更するとそのページに必要なエンティティクラスへのキャッシュを作成し、無ければ生成するという挙動に代わるので、ファイルが無くてもエラーにならない。

 

 最初に全部キャッシュを作った方が、次回以降の表示が早くなりそうだけど、doctrine部分だけだし、そこまでパフォーマンスに影響は出ないんじゃないかなぁと思うけど、EC-CUBE 4をまだ深く理解していないので、検証は各自で行ってください。


Please give us your valuable comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です