複数のインスタンスを持つ Appfog で Yii アプリを実行していて、静的ファイルに CAssetsManager を使用している場合、(少なくとも私はそうでした) 静的ファイルへのリンクが壊れるという問題が発生します。
その理由は、AppFog の各インスタンスが各アセットへのパスが異なるためであると結論付けました。これが例です。
インスタンス 1: /mnt/var/vcap.local/dea/apps/54dc7546ac14/app/protected/assets/logo.png
インスタンス 2: /mnt/var/vcap.local/dea/apps/54dc7546ac14/app/protected/assets/logo.png
インスタンス 3: /mnt/var/vcap.local/dea/apps/54dc7546ac14/app/protected/assets/logo.png
Yii がこれらのアセットを公開すると、それぞれのパスは関数generatePath()dirname()
によって返されるハッシュに基づいているため、異なるパスを取得します。オプションについては知っていますが、それを true に設定すると、公開されたパスがさまざまな拡張機能間で共有されます。hashByName
したがって、logo.png
遺言書へのパブリック パスには、次の 3 つの異なる可能性があります。
インスタンス 1: https://www.example.com/assets/fb4gf4ac45/logo.png
インスタンス 2: https://www.example.com/assets/ab4ed4f394/logo.png
インスタンス 3: https://www.example.com/assets/fde07233bc/logo.png
つまり、www.example.com をリクエストすると、任意のインスタンスがリクエストを処理します。インスタンス 1であるとしましょう。これは、 を参照するリンクを含む応答を返しhttps://www.example.com/assets/fb4gf4ac45/logo.png
ます。リンクは 2 番目のリクエストをトリガーし、今度は別の任意のインスタンスがリクエストを処理します (インスタンス 2 )。
assets/fb4gf4ac45/logo.png
問題は、このインスタンスのファイルが にあるため、インスタンス 2 が を見つけられないことassets/ab4ed4f394/logo.png
です。
これはS3AssetsManagerを使用して処理できますが、それでも各インスタンスのアセットを S3 にアップロードするため、コードベースが更新されるたびにサイトが遅くなります。また、S3 に大量のアセット パスが作成されます。
質問:
そのため、回避策はありますが、Yii ソース コードを変更せずに Appfog で複数のインスタンスを処理するためのより良い方法があるのではないかと考えています。