问题还要求我们找到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'];
}
这实际上是一个非常复杂的问题,而且没有明确的答案。你要查的东西很多,所以我来教你怎么做。
- 下载原始页面HTML
- 使用DOM解析器将HTML解析成元素图。
- 遍历每个元素,并下载您关心的任何外部资源。这将是
<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'];
}