我正在开发一种工具来分析用户提供的网站。其中一个重要部分是显示网站的加载时间。我怎样才能在PHP中实现它?我尝试了以下方法
方法1:
下载网站的HTML代码解析它,找到CSS文件,JavaScript文件,图像等各种资源。然后逐个下载。
问题:由于像Chrome这样的真实浏览器,他们一次下载大约6个资源。 PHP无法异步执行。很难实现缓存。
方法2:
使用Apache的Bench mark工具。看起来很不错。我可以设置并发连接和一切。优秀的工具。甚至可以启用Gzip。
ab -n 100 -c 10 http://www.google.com/
问题:如何启用缓存?因为我想测试网站两次(用缓存显示加载时间)。我也听说过Apache AB测试没有下载资源。有人知道吗?
还有其他方法吗?或者有什么方法可以解决方法的问题吗?
答案 0 :(得分:2)
您可以尝试ab
而不是wget
。它对于下载整个页面很有用,如果启用了缓存,它可能会使用If-Modified-Since
标题
- https://www.gnu.org/software/wget/
另一个想法是使用Selenium WebDriver
,它允许您从PHP控制Web浏览器
- https://github.com/facebook/php-webdriver
[稍后编辑]
我担心您无法使用wget
执行并发下载(页面及其资源)。
即使你可以,也很难让它成为真正的浏览器。
例如,一个页面可能会加载7个JavaScript文件:三个在同一个域中,三个来自另一个域,第七个来自CDN。其中一些脚本文件在执行时可能会加载其他资源 - CSS文件,图像和其他JavaScript库。每个CSS文件也可能触发加载其他资源(字体文件,图像,其他样式表)。
在上述情况下测量网页的加载时间变得困难,除非您使用的是浏览器控制器/模拟器。
所以,我建议看看 Selenium Driver 。 或其他图书馆/工具,如Mink或PhantomJS - 正如@halfer所述。
答案 1 :(得分:2)
如果你想在PHP中这样做,你有几个选择:
multi_curl
并行加载其资源(PHP 可以执行此操作!)或围绕相同的包装器,例如{ {3}}。但是,由于此方法不会运行JavaScript,因此代码中触发的额外负载将无法运行。答案 2 :(得分:1)
Php可以通过“多”接口http://php.net/manual/en/function.curl-multi-init.php使用CURL同时做多个请求。
你也可以传递If-Modified-Since(见How to test for "If-Modified-Since" HTTP Header support)并回答你的2分。
但你还有几点需要考虑:
你怎么知道你是否必须在php中加载条件J?
远程后端如何使用“新鲜”cookie或旧cookie? 也许该网站有一些返回用户的特殊逻辑......
当然,网络浏览器中的模拟是更接近真实世界的模拟,实际上它甚至都没有被模仿。
但请检查“处理”外部流程是否可以控制网络浏览器,从而改变时间....