标签: 并行下载

  • 如何修复“跨主机名并行下载”问题

    错误类型:
    HTTP错误
    错误名称:
    跨主机名并行下载
    英文名称:
    parallelize downloads across hostnames
    错误描述:
    这原则上不是一个错误,而是使用旧的HTTP协议,肯能存在跨域并行下载影响网站加载速度的问题。服务器采用HTTP/2以上协议是不存在该问题的。

    如何修复“跨主机名并行下载”问题

    如果在您的网站上发现潜在的连接问题,大多数网站速度测试工具都会显示“跨主机名并行下载”警告。虽然在大多数情况下它很容易修复,但在某些情况下您可以简单地忽略它。

    在本文中,我们将了解导致“跨主机名并行下载”警告的原因以及如何解决此问题。

    是什么导致“跨主机名并行下载”问题出现?

    “跨主机名并行下载(parallelize downloads across hostnames)”错误通常出现在有大量请求的网站上。这是如何发生的:

    HTTP 1.x协议决定单用户客户端最多可以与任何服务器建立两个连接。这意味着如果队列中有太多资源需要加载,它可能会产生积压。

    另一方面,大多数浏览器也有一些限制——每个域最多六个连接。如果您打开的选项卡太多,您将很容易达到此限制。

    在大多数情况下,人们会尝试重新连接,或者尝试提供多个子域来避免限制(我们稍后会谈到)。

    然而,这种情况只发生在HTTP 1.x连接上。

    如果您使用HTTP/2和安全连接,这将不再是问题。HTTP/2是修订版,允许并行下载。当然现在大部分主机服务商,都使用HTTP/2而不是HTTP 1.x。

    话虽如此,当您在HTTP/2连接上时,忽略“跨主机名并行下载”警告是安全的。

    某些工具(如GTMetrixPingdom)可能仍会出现此错误——使用不同的名称——无论这对您来说是否是一个实际问题。

    修复“跨主机名并行下载”错误

    如前所述,为了避免限制,人们试图使用子域来管理资产,以欺骗浏览器并允许更多的并行连接。这种做法称为域名分片(domain sharding)

    域名分片是一种使用多个子域增加同时下载资源数量的方法。因此,您可以使用域分片来修复“跨主机名并行下载”错误。

    请记住,域名分片也会留下负面影响,例如:

    • DNS查找时间增加
    • 缓存功能丢失
    • 移动设备浏览器的潜在问题

    基本上,域名分片有两个步骤——设置子域和编辑function.php文件。

    设置子域

    域名分片的第一步是创建多个子域或CNAME记录。但是,这可能会拆分对您的静态内容的请求。

    为此,您可以转到您的域名管理面板,然后选择类别下的子域。(注:不同域名服务商,可能稍有不同)

    子域名管理

    在空白字段中输入子域名,然后单击创建。您可以重复此步骤以创建多个条目。大多数时候,添加三个子域就足够了。

    创建子域名 子域名目录

    设置子域后,您就可以编辑functions.php文件了。

    编辑主题functions.php文件

    域名分片的第二步是编辑主题function.php文件以并行化主机名。

    您可以转到WordPress仪表盘 -> 外观 -> 主题编辑器,然后选择主题函数 (functions.php)

    接下来,将以下代码添加到functions.php文件中:

    function parallelize_hostnames($url, $id) {
    $hostname = par_get_hostname($url); //call supplemental function
    $url = str_replace(parse_url(get_bloginfo(‘url’), PHP_URL_HOST), $hostname, $url);
    return $url;
    }
    function par_get_hostname($name) {
    $subdomains = array(‘media1.mydomain.com’,‘media2.mydomain.com’); //add your subdomains here, as many as you want.
    $host = abs(crc32(basename($name)) % count($subdomains));
    $hostname = $subdomains[$host];
    return $hostname;
    }
    add_filter(‘wp_get_attachment_url’, ‘parallelize_hostnames’, 10, 2);
    function parallelize_hostnames($url, $id) {
    $hostname = par_get_hostname($url); //call supplemental function
    $url = str_replace(parse_url(get_bloginfo(‘url’), PHP_URL_HOST), $hostname, $url);
    return $url;
    }
    function par_get_hostname($name) {
    $subdomains = array(‘media1.mydomain.com’,’media2.mydomain.com’); //add your subdomains here, as many as you want.
    $host = abs(crc32(basename($name)) % count($subdomains));
    $hostname = $subdomains[$host];
    return $hostname;
    }
    add_filter(‘wp_get_attachment_url’, ‘parallelize_hostnames’, 10, 2);
    function parallelize_hostnames($url, $id) {
    $hostname = par_get_hostname($url); //call supplemental function
    $url =  str_replace(parse_url(get_bloginfo('url'), PHP_URL_HOST), $hostname, $url);
    return $url;
    }
    function par_get_hostname($name) {
    $subdomains = array('media1.mydomain.com','media2.mydomain.com'); //add your subdomains here, as many as you want.
    $host = abs(crc32(basename($name)) % count($subdomains));
    $hostname = $subdomains[$host];
    return $hostname;
    }
    add_filter('wp_get_attachment_url', 'parallelize_hostnames', 10, 2);

    请注意,您需要使用您创建的子域更改$subdomains值。此外,请确保所有子域都具有相同的路径以避免任何错误。

    完成后,单击更新文件。就是这样!

    您还可以对CDN提供商(如 KeyCDN)执行相同的步骤来修复“跨主机名并行下载”错误。但是,由于大多数CDN提供商使用HTTP/2,因此不建议使用域名分片。

    小结

    如果您在测试网站时遇到“跨主机名并行下载”警告,请不要惊慌。它是由于浏览器和HTTP 1.x连接的限制而发生的。

    总之,您可以通过两个步骤使用域名分片方法修复错误:

    1. 设置子域
    2. 编辑functions.php文件

    但是,如果您的托管服务提供商已经使用HTTP/2,您可以放心地忽略此错误。