sam-it/yii2-static-assets

生成静态资源并构建docker nginx容器

安装次数: 53,110

依赖: 0

建议者: 0

安全: 0

星星: 10

观察者: 2

分支: 4

开放问题: 0

类型:yii2-extension

v7.1.0 2024-07-22 14:37 UTC

README

防止在发布时间不更改应用程序的情况下发布资源。

动机

如今,Docker越来越受到关注,PHP应用程序也面临着不同的部署场景。几年前,如果你只是分割节点,那么你只会分割数据库服务器和运行PHP作为模块或最近通过PHP-FPM运行的web服务器,如今你希望分割一切。

挑战

例如,如果你的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