N がリリース番号 ( ) でwebsite
ある現在のリリース ( など) のフォルダーにリンクする別のフォルダーへのシンボリック リンクであるフォルダー (たとえば ) 用に Apache vhost をセットアップしています。新しいリリースがデプロイされると、 という名前の別のフォルダーが作成され、そのコンテンツの準備が整うと、その新しいフォルダーにリンクするためのシンボリック リンクが再作成されます ( )。website_N
website -> website_123
website_N+1
website
website -> website124
このセットアップは、APC のインクルードのキャッシュを混乱させるようです。場合によっては (常にではありませんが、煩わしくなります)、新しいデプロイの後、次のシンボリック リンク スイッチinclude
とrequire
アプリケーションの指示が開始され、再宣言エラーが発生することがあります。
致命的なエラー: /absolute/path/to/deployment/physical/folder/website_N/include_foobar.php でクラス Foobar を再宣言できません
website_N
そのメッセージのフォルダーは通常、古いビルド フォルダーの 1 つであり、存在しない場合もあります。ただし、最新のリリース フォルダーの正しい物理的な場所を示すエラーが生成されることがあります。同じままなのは、初めてロードされたクラスの「再宣言できません」というエラーです。
apc_clear_cache()
アプリケーションのブートストラップに追加するたびに問題が解決するため、これは APC の問題であると確信しています。
同じ「未解決」パスを共有する同じシンボリックリンクフォルダーの下に異なるリリースが存在するために発生すると思います。その結果、プリコンパイル済みイメージに対して古いインクルード接続が読み込まれ、その「解決された」パスに対して依存関係をインクルードする別の試行が実行されるため、新しいパスとして表示され、二重インクルードとそれに続く再宣言エラーが発生する可能性があります。この理論はあまり意味がないかもしれませんが、私は APC の内部をよく理解していません。
これには多くの方法があります (展開プロセスの一部としてキャッシュをクリアすることは明らかです) が、誰かがそのエラーの背後にあるメカニズムを説明できる場合、つまり、このセットアップの何が APC の動作をどの時点で中断するのか (そしてその理由)物理的に削除されたフォルダー パスがエラー メッセージに表示されることがあります)。