4

N がリリース番号 ( ) でwebsiteある現在のリリース ( など) のフォルダーにリンクする別のフォルダーへのシンボリック リンクであるフォルダー (たとえば ) 用に Apache vhost をセットアップしています。新しいリリースがデプロイされると、 という名前の別のフォルダーが作成され、そのコンテンツの準備が整うと、その新しいフォルダーにリンクするためのシンボリック リンクが再作成されます ( )。website_Nwebsite -> website_123website_N+1websitewebsite -> website124

このセットアップは、APC のインクルードのキャッシュを混乱させるようです。場合によっては (常にではありませんが、煩わしくなります)、新しいデプロイの後、次のシンボリック リンク スイッチincluderequireアプリケーションの指示が開始され、再宣言エラーが発生することがあります。

致命的なエラー: /absolute/path/to/deployment/physical/folder/website_N/include_foobar.php でクラス Foobar を再宣言できません

website_Nそのメッセージのフォルダーは通常、古いビルド フォルダーの 1 つであり、存在しない場合もあります。ただし、最新のリリース フォルダーの正しい物理的な場所を示すエラーが生成されることがあります。同じままなのは、初めてロードされたクラスの「再宣言できません」というエラーです。

apc_clear_cache()アプリケーションのブートストラップに追加するたびに問題が解決するため、これは APC の問題であると確信しています。

同じ「未解決」パスを共有する同じシンボリックリンクフォルダーの下に異なるリリースが存在するために発生すると思います。その結果、プリコンパイル済みイメージに対して古いインクルード接続が読み込まれ、その「解決された」パスに対して依存関係をインクルードする別の試行が実行されるため、新しいパスとして表示され、二重インクルードとそれに続く再宣言エラーが発生する可能性があります。この理論はあまり意味がないかもしれませんが、私は APC の内部をよく理解していません。

これには多くの方法があります (展開プロセスの一部としてキャッシュをクリアすることは明らかです) が、誰かがそのエラーの背後にあるメカニズムを説明できる場合、つまり、このセットアップの何が APC の動作をどの時点で中断するのか (そしてその理由)物理的に削除されたフォルダー パスがエラー メッセージに表示されることがあります)。

4

1 に答える 1

1

私はTYPO3を使用していますが、同じ問題がありました。TYPO3 はかなり多くをキャッシュします。シンボリック リンクを別のソースに変更する場合、シェルを使用して TYPO3 インストール フォルダに移動し、キャッシュされたファイルを手動で削除する必要があります。

その後、すべてが良いです。理解するのに1日かかりました。

于 2014-01-15T12:02:40.290 に答える