如果你在 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 源代码。