存储和传送静态文件

除了处理动态请求之外,应用通常还需要传送静态文件(如 JavaScript、图片和 CSS)。标准环境中的应用可以通过 Google Cloud 产品(如 Cloud Storage)传送静态文件,也可以直接或使用第三方内容分发网络 (CDN) 传送这些文件。

Google Cloud 提供免费层级,因此在 Google Cloud 上托管静态网站的费用可能低于使用传统托管服务提供商的费用。

从 Cloud Storage 传送文件

Cloud Storage 可为动态 Web 应用托管静态资源。与直接从应用传送内容相比,使用 Cloud Storage 进行传送可为您带来以下好处:

  • Cloud Storage 实际起到内容分发网络的作用。这不需要任何特殊配置,因为默认情况下,任何可公开读取的对象都会在全球 Cloud Storage 网络中进行缓存。
  • 将传送静态资源的工作转交给 Cloud Storage 处理,应用本身的负载将降低。根据您拥有的静态资源数量以及访问频率,这有可能大幅度降低应用的运行费用。
  • 访问 Cloud Storage 内容的带宽费用通常较低。

您可以使用 gsutil 命令行工具Cloud Storage API 将资源上传到 Cloud Storage。

Google Cloud 客户端库为 Cloud Storage 提供了惯用的 PHP 7+ 客户端,支持在 App Engine 应用中使用 Cloud Storage 存储和检索数据。

PHP 7+ 客户端还提供 API 支持的流封装容器,该流封装容器可作为专用文件系统与 Cloud Storage 交互。

从 Cloud Storage 存储分区传送文件的示例

这个简单的示例创建了一个 Cloud Storage 存储分区,并使用 Google Cloud CLI 上传静态资源:

  1. 创建存储分区。通常以项目 ID 命名存储分区(并非必需)。存储分区名称必须保持全局唯一。

    gsutil mb gs://<your-bucket-name>
    
  2. 设置 ACL,授予对存储分区中内容的读取访问权限。

    gsutil defacl set public-read gs://<your-bucket-name>
    
  3. 将内容上传到存储分区。rsync 命令通常是上传和更新资源最快速、最便捷的方法。此外,您也可以使用 cp

    gsutil -m rsync -r ./static gs://<your-bucket-name>/static
    

现在,您可以通过 https://storage.googleapis.com/<your-bucket-name>/static/... 访问静态资源了。

如需详细了解如何使用 Cloud Storage 传送静态资源(包括如何从自定义域名进行传送),请参阅如何托管静态网站

从其他 Google Cloud 服务传送文件

您还可以选择使用 Cloud CDN 或其他 Google Cloud 存储服务。

直接从您的应用传送文件

如需在标准环境中为 PHP 7+ 传送静态文件,您可以使用 static_dirstatic_files 元素在 app.yaml 文件中定义处理程序。

静态文件或静态目录中的内容不受 app.yaml 文件中的扩缩设置的影响。对静态文件或静态目录的请求由 App Engine 基础架构直接处理,不会到达应用的语言运行时。

配置静态文件处理程序

如需将应用配置为从 /static 网址传送 ./public 目录,请在 app.yaml 文件中定义处理程序。

下面演示了如何传送示例应用 ./public 目录中的静态文件。此应用 index.html 页面的模板会指示浏览器加载 main.css 文件,例如:

<link type="text/css" rel="stylesheet" href="/static/css/main.css">

项目的 app.yaml 文件的 static_dir 元素中定义了 ./public 目录:

handlers:
  - url: /favicon\.ico
    static_files: favicon.ico
    upload: favicon\.ico

  - url: /static
    static_dir: public

  - url: /.*
    secure: always
    redirect_http_response_code: 301
    script: auto

上述示例中的 handlers 部分处理了三种网址格式:

  • /favicon.ico 处理程序将专门针对 /favicon.ico 的请求映射到应用根目录中名为 favicon.ico 的文件。

  • /static 处理程序映射针对以 /static 开头的网址的请求。当 App Engine 收到针对以 /static 开头的网址的请求时,它会将路径的其余部分映射到 ./public 目录中的文件。如果在该目录中找到了相应的文件,则该文件的内容会返回给客户端。

  • /.* 处理程序匹配所有其他网址,并将它们定向到您的应用。

网址路径格式会按照其在 app.yaml 中出现的顺序进行测试,因此,您应在 /.* 格式前面定义静态文件的格式。如需了解详情,请参阅 app.yaml 参考文档

为本地开发传送文件

使用 PHP 的内置 Web 服务器在本地传送静态文件:

  1. 导航到您的项目目录。
  2. 使用以下命令启动您的本地 Web 服务器:

    php -S localhost:8080
    
  3. 通过使用 curl HTTP 请求实用程序来请求静态文件,以定位在本地运行的 PHP 应用:

    curl -O http://localhost:8080/static/file/path/image.png
    

    上述请求会检索 ./static/file/path/image.png 文件。

许多 Web 框架均支持传送静态文件,您可以利用此功能在开发过程中执行文件的本地传送,而不通过本地 Web 服务器传送。如需查看示例,请参阅 Symfony 的传送文件Laravel 的文件响应的框架文档。

从第三方内容分发网络进行传送

您可以使用任何外部第三方 CDN 传送静态文件并缓存动态请求,但您的应用可能会遇到延迟和费用增加的情况。

为了提升性能,您应该使用支持 CDN Interconnect 的第三方 CDN。