如何查找HTTP头文件的下载大小称为Content-Length


How to find the download size of a file on HTTP header called Content-Length?

问题还要求我们找到URL的总下载大小。但是,如果传递给脚本的URL仅指向单个文件资源(如JPG文件或GIF文件),该怎么办?对于单个文件资源,我们只需要找到特定文件的大小然后返回它作为答案,就完成了。但是,对于HTML文档,我们需要找到嵌入和包含在页面上的所有资源的总大小,并将其作为答案返回

function get_remote_file_size($url) {
    $headers = get_headers($url, 1);
    if (isset($headers['Content-Length'])) 
        //checks for lower case "L" in Content-length:
    if (isset($headers['Content-length'])) 
           return $headers['Content-length'];    
}

这实际上是一个非常复杂的问题,而且没有明确的答案。你要查的东西很多,所以我来教你怎么做。

  1. 下载原始页面HTML
  2. 使用DOM解析器将HTML解析成元素图。
  3. 遍历每个元素,并下载您关心的任何外部资源。这将是<img>, <video>, <script>, <iframe>等的src属性。别忘了CSS可以是<link rel="stylesheet" href="..." />

但这并不是全部。你现在有了一个新问题。如果JavaScript加载了更多的脚本呢?也许它通过AJAX添加数据?也许CSS引用了一些图形或其他CSS?也许是嵌入式字体?

更糟的是,有时这些事情是定时的。有时候,脚本在有用户交互或加载几秒钟后才会加载某些内容。

最重要的是,不要忘记每个加载的新项都可以带来它自己的内容。(例如,广告通常会加载数兆的内容。)

你能做的最好的事情是使用像PhantomJS这样的无头浏览器,加载页面并让脚本运行,并跟踪下载的所有资源。然后,等待几秒钟(如果您愿意,也可以等到触发页面加载),并将其相加。但是,没有万无一失的确定时间来判断页面何时完成。

get_headers函数接受URL作为参数。因此,检索" Content-Length "标题的PHP代码应该是这样的

function get_remote_file_size($url) {
$headers = get_headers($url, 1);
if (isset($headers['Content-Length'])) 
       return $headers['Content-Length'];
    //checks for lower case "L" in Content-length:
if (isset($headers['Content-length'])) 
       return $headers['Content-length'];

}