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 发布这些资产时,它们将获得不同的路径,因为每个路径都基于dirname()函数generatePath()返回的哈希值。我知道 option hashByName,但将其设置为 true 将在不同扩展之间共享发布的路径。

因此,通往遗嘱的公共路径logo.png具有三种不同的可能性:

实例 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,因为该实例上的文件位于assets/ab4ed4f394/logo.png.

可以通过使用S3AssetsManager来处理,但它仍会将每个实例的资产上传到 S3,并且每次更新代码库时都会使网站变慢。它还导致 S3 上有很多资产路径。

问题:

因此,即使我确实有一个解决方法,我想知道是否有更好的方法来处理 Appfog 上的多个实例,而无需更改 Yii 源代码。

4

1 回答 1

1

你有几个选择。Aaron Francis 的解决方案非常漂亮,但需要相当多的活动部件: http ://aaronfrancis.com/blog/2013/6/19/yii-and-the-asset-pipeline-part-2

这也是我遇到的最完整的解决方案。

第二个选项是 Jadon Hancock 在此处可用。我最终调整了它以适应我正在从事的项目。没有那么详细或完整,但对于我需要开始的东西来说已经足够了。我将来可能会重新审视 Aaron 的解决方案。 https://gist.github.com/jasonhancock/5073938

于 2013-09-29T03:28:30.927 回答