如何使用PHP查找网站的加载时间


How to find loading time of website using PHP?

我正在开发一个工具来分析用户提供的网站。其中一个重要部分是显示网站的加载时间。如何在PHP中实现这一点?我尝试了以下方法

方法1:

下载网站的HTML代码进行解析,找到每个资源,如CSS文件、JavaScript文件、图像等。然后逐一下载。

问题:由于像Chrome这样的真实浏览器,它们一次下载大约6个资源。PHP不能异步执行。难以实现缓存。

方法2:

使用Apache的基准工具。看起来不错。我可以设置并发连接等等。出色的工具。甚至可以启用Gzip。

ab -n 100 -c 10 http://www.google.com/

问题:如何启用缓存?因为我想测试网站两次(用缓存显示加载时间)。我还听说ApacheAB测试不下载资源。有人知道吗?

还有其他方法吗?或者有没有办法解决方法上的问题?

如果你想在PHP中做到这一点,你有几个选项:

  • 通过一个队列连接到PhantomJS,比如Gearman或Beanstalk。Phantom包含一个真实的浏览器(WebKit引擎),因此将以真实世界的方式加载网站。PHP有一些驱动程序,比如Spiderling
  • 使用Goutte之类的东西解析页面,然后使用multi_curl(PHP可以这样做!)或Guzzle之类的包装器并行加载其资源。然而,由于这种方法不会运行JavaScript,因此在代码中触发的额外负载将不会运行

您可以尝试wget而不是ab。它对下载整个页面很有用,如果启用了缓存,它可能会使用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文件也可能触发加载其他资源(字体文件、图像、其他样式表)。

除非您使用浏览器控制器/模拟器,否则在上述情况下测量网页的加载时间会变得困难。

因此,我建议查看硒驱动程序。或者其他库/工具,如Mink或PhantomJS,正如@halfer所提到的。

Php可以通过"multi"接口使用CURL同时执行多个请求http://php.net/manual/en/function.curl-multi-init.php.

您还可以通过If Modified Since(请参阅How to test for"If Modified Since"HTTP Header support),您的2分就得到了回答。

但你还有几点需要考虑:

如何知道是否必须单独在php中加载条件Js?

远程后端如何使用"新鲜"cookie或旧cookie?也许网站有一些特殊的逻辑返回用户。。。

当然,网络浏览器中的模拟是更接近真实世界的模拟,实际上它甚至没有被模仿。

但请检查"处理"一个反过来控制网络浏览器的外部进程是否会导致时间的改变。。。。