0

複数のインスタンスを持つ 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 で複数のインスタンスを処理するためのより良い方法があるのではないかと考えています。

4

1 に答える 1

1

いくつかのオプションがあります。ここでのアーロン・フランシスのソリューションはかなり気の利いたものですが、かなりの数の可動部品が必要です: http://aaronfrancis.com/blog/2013/6/19/yii-and-the-asset-pipeline-part-2

これは、私が遭遇した中で最も完全なソリューションでもあります。

2 番目のオプションは、Jadon Hancock のものです。私が取り組んでいるプロジェクトに合うようにこれを適応させることになりました。それほど精巧でも完全でもありませんが、私が最初に必要としていたものには十分でした. 将来、アーロンのソリューションを再訪するかもしれません。 https://gist.github.com/jasonhancock/5073938

于 2013-09-29T03:28:30.927 に答える