2amigos / yii-cdn-asset-management-library
为Yii的CDN资产管理工具。
Requires
- aws/aws-sdk-php: ^3.0.0
- yiisoft/yii: >=1.1.15
This package is auto-updated.
Last update: 2023-08-16 02:35:00 UTC
README
这个库是一组工具,可以帮助您使用Amazon CloudFront服务管理您的资产,无论它们是指向托管应用资产的服务器,还是指向共享的S3服务器实例。
安装
安装此扩展的首选方式是通过 composer。
运行
php composer.phar require 2amigos/yii-cdn-asset-management-library "*"
或在您的应用程序的 composer.json
文件的require部分添加
"2amigos/yii-cdn-asset-management-library" : "*"
。
介绍
CloudFront是亚马逊网络服务(AWS)提供的内容分发服务。它使用全球网络中的许多边缘位置提供静态内容。使用这些位置,CloudFront通过从最近的位置提供内容对象的缓存副本来加速内容的交付。您可以设计CDN与Amazon S3或其他任何自定义源服务器一起使用。
这听起来很棒,但当您的架构需要多个服务器来处理您的网络流量,并且这些实例根据该流量自动创建时,这种神奇之处并非全部。您很快就会遇到404未找到异常的问题。
这是由于Yii的资产管道和分布式系统的性质。当发出请求时,CAssetManager将在当前实例的assets
文件夹下生成所有所需的资产文件,但那些资产下的静态文件的HTTP请求可能由另一个Web服务器实例处理。
我们检查了一些现有的解决方案,例如Yii-CloudFrontAssetManager和Mantis Manager,但第一个与CDN无效化和按名称(这意味着您在做出更改时必须强制使文件无效,否则CDN将使用其缓存中的文件,这当您有很多资产文件时代价很高),Mantis做得太多,不适合我们的项目,而且,对于像我们正在构建的这样拥有大量资产文件的系统,我们无法依赖其聪明的系统来找出文件是否已更改,并发布和/或提供正确的文件版本。
我们最终做了所有这些伟大扩展提出的事情,并找到了我们的研究
- 基于版本的资产模式:使用S3实例作为资产分发系统
- 基于真实路径哈希的模式:使用S3实例作为资产分发系统
- 指向自定义源的模式:使用CDN指向Web应用实例之一,并通过文件的
realpath
更新哈希
由于每次部署到生产都会根据其时间戳创建一个新的文件夹,所以我们使用了最后提到的模式,因为它很简单。
重要
一些扩展与Yii常量YII_DEBUG
配合工作,以便强制复制资产,这意味着对于S3AssetManager
始终将文件发布到S3 Bucket。所以请确保将该常量设置为false
。
此外,请确保您已在其应用程序中配置了适当的CCache
组件,这对于指示资产文件是否已处理(即已发布到S3)至关重要。我们已配置了CMemcache
,这对于我们正在开发的分布式系统来说非常完美。
基于版本资产模式
该技术需要一个文件,它保存有关指定文件夹下文件更改的缓存信息。当文件更改(基于其内容的哈希结果)时,它将更新缓存中文件的版本,并将文件发布到S3 Bucket。
请注意,如果您没有太多资产文件,这是一个好方法。但是,如果您有太多资产文件,且难以压缩和合并脚本(例如,有太多带有动态资产的扩展),则此模式不是解决方案,因为Manager
是负责提供正确文件版本的组件,并且为此会检查文件缓存。
此模式由以下三个组件的配置和使用组成
- S3Command:更新指定路径的新|修改后的文件到S3 Bucket
- Manager:检查它们是否是新的或新|修改过的文件,并将它们发布到指定的S3 Bucket
- S3AssetManager:将文件发布到S3。它处理
动态
和静态
资产发布。
配置和使用
在您的配置文件中
// In Components section // ... 'cdnManager' => array( // make sure you set this name to the one that you are going to use wit S3Command 'class' => 'dosamigos\cdn\Manager', 'remoteAssetManagerComponent' => 'assetManager', 'startVersion' => 1, // the starting version of assets when it has no records in file cache 'assetsPaths' => array( // the 'static' assets you wish to publish. They must be "aliases" 'webroot.assets', 'common.extensions.widgets.assets', 'vendor.yiisoft.yii.framework.zii.widgets.assets', // you can also manage vendor 'dynamic' assets 'vendor.yiisoft.yii.framework.web.js.source', ) ), 'assetManager' => array( 'class' => 'dosamigos\cdn\S3AssetManager', 'key' => '{YOUR_AWS_API_KEY}', 'secret' => '{YOUR_AWS_API_SECRET}', 'host' => '{YOUR_CLOUDFRONT_ID}.cloudfront.net', 'bucket' =>'{YOUR_BUCKET_NAME}', 'path' => 'assets', // The folder you publish your assets on S3 'region' => 'us-east-1', 'assetsVersion' => 1 // Your 'dynamic' assets version ),
一旦您已设置好组件,您可以使用该命令定期检查您的资产文件
./yiic S3 --manager=cdnManager publish --userVersionCache=1
然后,管理器将遍历其配置中指定的所有assetsPaths
别名,更新缓存文件,并根据需要将文件发布到S3。
为了获取资产URL,您必须使用Manager::getAsset
方法。例如,在基子CController组件中
class Controller extends CController { public function asset($asset) { return Yii::app()->cdnManager->getAsset($asset); } }
此额外步骤的原因是Manager
组件会从保存的文件缓存中读取,检查最新的文件版本URL,如果找到则提供服务。
真实路径哈希模式
此模式仅在您的应用程序的完整路径在每次部署到生产服务器时更改的情况下才有效。例如,在我们的案例中,最新的生产完整路径根据部署时间戳而更改
/var/full/path/to/application/20141223113901/
考虑到这一点,根据基于资产完整路径创建的哈希值发布资产很容易,因为该路径在每次部署时都会更改。唯一的问题是,您最终会在S3上拥有许多可能不使用的资产,但是编写一个命令来清理S3 Bucket上未使用的资产并不太难。
配置和使用
配置类似于使用基于版本资产模式的情况,但我们必须将assetsVersion
设置为false
'cdnManager' => array( // make sure you set this name to the one that you are going to use wit S3Command 'class' => 'dosamigos\cdn\Manager', 'remoteAssetManagerComponent' => 'assetManager', 'assetsPaths' => array( // the 'static' assets you wish to publish. They must be "aliases" 'webroot.assets', 'common.extensions.widgets.assets', 'vendor.yiisoft.yii.framework.zii.widgets.assets', // you can also manage vendor 'dynamic' assets 'vendor.yiisoft.yii.framework.web.js.source', ) ), 'assetManager' => array( 'class' => 'dosamigos\cdn\S3AssetManager', 'key' => '{YOUR_AWS_API_KEY}', 'secret' => '{YOUR_AWS_API_SECRET}', 'host' => '{YOUR_CLOUDFRONT_ID}.cloudfront.net', 'bucket' =>'{YOUR_BUCKET_NAME}', 'path' => 'assets', // The folder you publish your assets on S3 'region' => 'us-east-1', 'assetsVersion' => false ), // and for the command in section "commandMap" 'commandMap' => array( 'S3' => array( // you can alias your command the way you wish // if "vendor" alias is present! 'class' => 'dosamigos\cdn\S3Command', ), 'migrate' => array( 'class' => 'system.cli.commands.MigrateCommand', 'migrationPath' => 'application.migrations' ) )
当我们关闭assetsVersion
时,Manager
实例将根据资产路径名称的更改将资产发布到您的S3 Bucket。这意味着,在您的生产服务器部署后应使用以下命令
./yiic S3 --manager=cdnManager publish
指向自定义源模式
在这种情况下,您不是使用S3实例,而是将CDN指向您的Web实例之一,并确保您的资产文件夹的内容在每个部署时也发布,即如果您使用git,则将它们添加到存储库,以便您可以跟踪更改。
CdnAssetManager
的功能是告诉CDN从指定的Web实例中提供资产。现在,如果您确实有连续的全路径更改(如上所述),那就没问题,但如果不是这样,您将不得不使用无效化命令,这会带来一些代价。在分布式系统中,它可能不会按预期工作,因为它可能导致应用程序在CDN更新(5~10分钟)之前出现损坏。
配置和使用
为此,您只需要配置资产管理器,
'cdnManager' => array( // make sure you set this name to the one that you are going to use wit S3Command 'class' => 'dosamigos\cdn\Manager', 'remoteAssetManagerComponent' => 'assetManager', 'assetsPaths' => array( // the 'static' assets you wish to invalidate. They must be "aliases" 'webroot.assets', 'common.extensions.widgets.assets', 'vendor.yiisoft.yii.framework.zii.widgets.assets', // you can also manage vendor 'dynamic' assets 'vendor.yiisoft.yii.framework.web.js.source', ) ), 'assetManager' => array( 'class' => 'dosamigos\cdn\CdnAssetManager', 'key' => '{YOUR_AWS_API_KEY}', // if you wish to use invalidation 'secret' => '{YOUR_AWS_API_SECRET}', // if you wish to use invalidation 'host' => '{YOUR_CLOUDFRONT_ID}.cloudfront.net', ),
使您的资产无效化的命令是
./yiic S3 --manager=cdnManager invalidate
关于CDN无效化
在CloudFront中,缓存无效化是一项代价高昂的操作,并受到各种限制。首先,您一次只能运行3个无效化请求。其次,在每次验证请求中,您可以包括最多1000个文件。第三,无效化需要时间在所有边缘位置传播(5~10分钟)。CloudFront分布的变化最终会一致,但不会立即发生。在成本方面,在一个月内,1000个文件的无效化是免费的,之后您需要为无效化请求中列出的每个文件付费。
所以请注意如何使用它...
相关文章
网络开发从未如此有趣!
www.2amigos.us