plesk / yii2-static-assets

生成静态资源

安装: 18

依赖项: 0

建议者: 0

安全性: 0

星标: 1

关注者: 2

分支: 4

开放问题: 0

类型:yii2-extension

v1.0.1-p1 2020-04-13 08:13 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,这将带来一些挑战,优势和劣势。

  1. PHP不能写入文件并为它们创建公开可访问的URL
  2. 无法使用本地会话存储
  3. 需要公开访问的文件上传需要发布到web服务器。
  4. 需要保护的文件上传必须由所有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