通过模块、最佳编码实践和正确的服务器配置提高 Drupal 9 性能
已发表: 2020-08-11您可以拥有拥有大量内存的最强大的服务器,但这足以确保网站的高性能吗? 使用 Drupal,可以轻松地根据您的业务增长扩展网站。 事实上,这正是 Drupal 所擅长的。 但是,网页、功能和内容的突然增加可能会影响其性能。 Drupal 9 现在就在这里,并且已经准备好像专业人士一样迎接这一挑战! 它带有 Drupal 8 的优点,去掉了旧代码,使其更精简、更简洁、更强大。 探索更多关于绝对有效的 Drupal 9 性能改进技术。
网站的性能是企业成功的关键。 缓慢加载网站可能对企业有害。 性能更好的网站有助于更好的搜索引擎优化,提高访问者的转化率,并为访问者提供更好的用户体验,从而共同促进业务增长。 而缓慢加载的网站则恰恰相反,并成为业务失败的原因。

影响网站性能的因素有很多。 他们之中有一些是:
• 您的服务提供商(托管、DNS 等)
• 对服务器的请求数
• 技术问题或糟糕的编程实践
• 缓存技术
• 不正确的服务器配置
• 重图像和视频文件
Drupal 9 核心和自定义模块以提高性能
Drupal 9 中有许多可用的贡献和核心模块,它们可以帮助提高您网站的性能。 通过遵循某些编码实践并使用适当的服务器配置,您可以显着提高站点性能。
核心模块
• 大管道
Drupal Big Pipe 模块无需额外配置即可使事情变得更快。 它与 Drupal 核心打包在一起。 它通过使用可缓存元数据来提高前端感知性能,从而改进渲染管道。
• 内部动态页面缓存
这个 Drupal 9 模块有助于缓存动态内容。 它对匿名和经过身份验证的用户都有帮助。 该模块在 Drupal 7 中不可用。用户请求的页面在第一次请求时被存储,然后可以在进一步请求同一页面时重复使用。
• 内部页面缓存
内部页面缓存模块有助于为匿名用户缓存数据。 此模块在核心中可用,默认情况下处于启用状态。
配置路径:admin/config/development/performance
在这里您可以清除缓存、设置浏览器和代理缓存最大年龄以及启用/禁用聚合设置。

贡献的模块
- 高级 CSS/JS 聚合
Advagg 模块包含许多其他子模块,例如 - - AdvAgg Cdn:帮助从公共 CDN 加载资产 (CSS/JS)
- AdvAgg CSS/JS Validator:验证 CSS 和 JS 文件
- AdvAgg 外部缩小器:使用命令行缩小器缩小 Javascript 和/或 CSS。
- AdvAgg Minify CSS:帮助使用第 3 方缩小器缩小 css 文件
- AdvAgg Minify JS:帮助使用 3rd 方 mi 缩小 js 文件
- AdvAgg 修饰符:允许修改 CSS 和 JS 数组。 (可能有兼容性问题)
- AdvAgg 旧版 Internet Explorer 兼容性增强器
配置路径: /admin/config/development/performance/advagg
该模块还支持文件压缩技术,如gzip和brotli 。 该模块有助于减少 http 请求的数量,从而显着提高站点性能。
炽热的
Drupal 9 Blazy 模块提供延迟加载图像以节省带宽并避免更高的跳出率。 延迟加载是一种仅在用户可见区域加载图像的技术。 这种多服务技术可节省时间和数据。
配置路径: /admin/config/media/blazy
在这里,您可以启用/禁用 Blazy,配置占位符效果,还可以设置偏移量,该偏移量决定了图像对用户可见的时间。

炽热模块
CDN
Drupal 9 CDN 模块有助于在 Drupal 网站中轻松集成 CDN。 它有助于从 CDN 服务器提供静态内容,以提高内容交付速度。 除此之外,这个模块也很容易配置。
配置路径: /admin/config/services/cdn

在这里您可以启用/禁用 CDN、提供映射 URL 和选中/取消选中永久文件缓存。
通过最佳编码实践提高性能
在 array_key_exist() 上使用 isset()
isset()方法明显快于array_key_exist() 。 isset和array_key_exist之间的主要区别在于array_key_exists肯定会告诉你一个键是否存在于数组中。 而isset只会在键/变量存在且不为空时返回 true。 有关此检查的更多信息,请单击此处进行基准比较。

使用 entityQuery()
entityQuery()依赖于存储控制器来处理构建和执行对适当实体存储的查询。 这样做的优点是任何通过entityQuery()运行的查询都是独立于存储的。 因此,如果您正在编写一个贡献的模块或在网站上工作,并且将来可能需要移动到替代实体存储,那么您的所有查询都将透明地使用新的存储后端,无需任何更改。 entityQuery()是否可以使用你的手在写查询中的自定义代码或通过entityQuery()的意见后端。
使用 loadMultiple() 方法而不是循环
如果您有 10 个 nid(节点 id)并且您正在循环加载每个节点,那么您将对数据库进行 10 次查询。 在使用loadMultiple() 时,它被简化为一个数据库查询。
缓存
使用 Drupal 9 中的缓存 API,您可以缓存渲染器、响应数组或对象。 Drupal 9 中提供了三种可渲染性缓存元数据。
- 缓存标签
当数据依赖于 Drupal 实体或配置时,Cache 标签用于缓存数据。 其语法是cache-item:identifier 例如节点:5,用户:3。 - 缓存上下文
句法:
• 将父母与孩子分开的时期
• 多个命名的缓存上下文表示可以指定一个参数; 使用:附加一个冒号
示例: user.roles、user.roles:anonymous 等。 - 缓存最大年龄
Cache max-age 用于缓存时间敏感的数据。
队列工作者/批次
处理大量数据且没有 php 超时,可以使用批处理或队列工作者。 queue worker 中的项目仅在 cron 运行时运行,并且它运行了一小段时间。 有两种类型的队列工作者:可靠的和不可靠的。 可靠队列工作者确保队列中的项目至少运行一次,而不可靠队列可能会因内存故障或其他中断而跳过项目。 批处理处理项目,直到所有项目在批处理条件下完成,以便在处理过程中不会发生错误,而无需等待 cron 运行。
通过更好的服务器配置提高性能
使用 Nginx 而不是 Apache
Nginx 和 Apache 都是广泛使用的 Web 服务器。 Nginx 在性能基准上优于 Apache。 它也比 apache 更快、更高效。 根据运行多达 1,000 个同时连接的基准测试,Nginx 的执行速度是 Apache 的 2.5 倍。
HTTP/2.0 优于 HTTP/1.1
HTTP/2.0 支持多路复用,这与阻塞其他资源的 HTTP/1.1 不同。 如果一个资源无法加载,HTTP/2.0 使用 TCP 连接一次发送多个流数据。 HTTP/2.0 使用了比 HTTP/1.1 先进的头压缩技术
HTTP/2.0 的 Nginx 配置
服务器 {
听 443 ssl http2; //http2设置
ssl_certificate server.crt;
ssl_certificate_key server.key;
}提供压缩内容
压缩响应通常会显着减少传输数据的大小。 然而,由于压缩发生在运行时,它也会增加大量的处理开销,这会对性能产生负面影响。
用于提供压缩内容的 Nginx 配置:
服务器 {
gzip 上;
gzip_static 开启;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_proxyed 任何;
gzip_vary on;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
...
}MariaDB 代替 MySQL
与 MySQL 相比,mariaDB 的速度有所提高。 它提供比 MySQL 更快的缓存和索引。 在这种情况下,它比 MySql 快近 24%。 mariaDB 在其他一些关键指标上也优于 MySQL。 因此,就性能而言,MariaDb 优于 MySQL。
CDN
CDN 代表内容交付网络。 它是遍布全球的服务器集群(又名,存在点或 PoP),它们协同工作以更快地交付内容。 CDN 存储站点内容的缓存版本并从最近的可用服务器传送内容。 一些流行的 CDN 提供商是 Cloudflare、Amazon cloudfront、Google Cloud CDN 等。
