plesk / yii2-static-assets
生成静态资源
Requires
- php: >=7.0
- yiisoft/yii2: ^2.0
Requires (Dev)
- codeception/codeception: ^2.3
- friendsofphp/php-cs-fixer: ^2.9
- yiisoft/yii2: ^2.0
This package is auto-updated.
Last update: 2024-08-24 19:02:21 UTC
README
防止在生产时间不更改应用程序的情况下发布资产。
这个分支移除了与docker相关的功能(类似于ItsReddi的工作:https://github.com/ItsReddi/yii2-static-assets,只是更新更近一些)并添加了CLI命令参数。SAM-IT的原始项目在这里可用:https://github.com/SAM-IT/yii2-static-assets。
以下为原始项目描述。
动机
如今,Docker越来越受到关注,PHP应用程序也面临着不同的部署场景。几年前,如果你只是分割节点,那么你只会分割数据库服务器和运行PHP作为模块的web服务器,或者更近一点,通过PHP-FPM,而现在你想要分割一切。
挑战
例如,如果你的web服务器(如nginx)运行在不同的服务器上,而不是PHP-FPM,这将带来一些挑战,优势和劣势。
- PHP不能写入文件并为它们创建公开可访问的URL
- 无法使用本地会话存储
- 需要公开访问的文件上传需要发布到web服务器。
- 需要保护的文件上传必须由所有PHP节点访问(因此需要某种类型的集中存储)。
解决方案
当涉及到Yii资源时,此扩展将为第1点提供一个解决方案。当直接将更改的资产推送到服务器时,资产管理器很棒,但在分布式环境中它并不真正有效,因此我们需要另一种方法。
此扩展提供
- 一个控制台命令,该命令将扫描您的源代码和vendor目录,并将所有资源提取出来。
- 一个用于生产的AssetManager,它将为资产生成URL而无需检查存储是否被触摸。
然后工作流程会有所不同。在开发期间,资产管理器将表现得像一个正常的资产管理器,将资产发布到资产目录。当使用docker-compose进行测试环境时,您会将相同的宿主目录挂载到PHP容器和web服务器容器的资产文件夹中。
在部署期间,资产管理器简单地将资产的URL返回,假设它们存在。在部署应用程序的新版本之前,您将重建您的web服务器容器。此扩展提供了一个控制台命令,可以将所有您的资产发布到您选择的目录,然后可以使用它作为docker构建上下文的一部分。
要发布您的资产,请运行以下命令
yii staticAssets/asset/publish build12345
这将在您的运行时目录内创建名为build12345
的目录,并将所有资产发布到那里。
资产发现/发布
通过递归迭代所有文件夹和文件来发现资产。然后处理每个以.php
结尾的文件
- 使用正则表达式匹配提取命名空间。
- 使用正则表达式匹配提取类名。
- 我们使用反射来检查类是否是
yii\web\AssetBundle
的实例,如果是,则将其发布。
容器构建
要构建用于托管应用程序的nginx容器,请使用以下内容
yii staticAssets/asset/build-container
您可以为模块设置一些默认值进行配置。
配置
对于简单配置,在生产和开发期间,请使用您的应用程序中的ReadOnlyAssetManager
。此资产管理器将使用一个更简单的“哈希”函数,它保持了目录结构可读性。它支持$assetDevelopmentMode
,允许在docker化的环境中进行本地资产开发。
资产开发
假设您使用docker-compose进行本地开发,在这种情况下,您需要定义一个存储资产的卷,以便它们在web服务器以及phpfpm容器中都可用。
volumes:
assets:
nginx:
image: [name of your nginx container, built by this module]
environment:
PHPFPM: "phpfpm:9000"
RESOLVER: "127.0.0.11"
ports:
- "12346:80" # Port where the application will be available
depends_on:
- phpfpm
volumes:
# Defines the named volume as read-only for the webserver.
# Note the dev-assets, which allows to easily identify development
# mode while using browsers' developer tools.
- type: volume
source: assets
target: /www/dev-assets
read_only: true
volume:
nocopy: true
phpfpm:
dns: 8.8.4.4
image: [ name of your PHPFPM docker image ]
environment:
DB_USER: root
DB_NAME: test
DB_PASS: secret
DB_HOST: mysql
depends_on:
- mysql
volumes:
# The source code is loaded into PHPFPM for local development,
# for production it should be baked into the image.
- .:/project:ro
# The asset volume, note the location which is where the ReadOnlyAssetManager
# will publish assets when in development mode.
- type: volume
source: assets
target: /tmp/assets