首页 > 解决方案 > PHP file_get_contents 优化

问题描述

我使用简单的 file_get_contents 功能从其他站点获取数据并将其放在我的站点上。

 <?php
    $mic1link = "https://example.com/yyy.html";
    $mic2link = "https://example.com/zzz.html";
    $mic3link...
    $mic4link...
    $mic5link...
    $mic6link...        
 ?>

 <?php
    $content = file_get_contents($mic1link);
    preg_match('#<span id="our_price_displays" class="price" itemprop="price" content=".*">(.*)</span>#Uis', $content, $mic1);
    $mic1 = $mic1[1];
 ?>
 <?php
    $content = file_get_contents($mic2link);
    preg_match('#<span id="our_price_displays" class="price" itemprop="price" content=".*">(.*)</span>#Uis', $content, $mic2);
    $mic2 = $mic2[1];
 ?>

并被

  <?php echo "$mic1";?> and <?php echo "$mic2";?>

它有效,但会影响性能(延迟)。

有什么方法可以优化这个脚本,或者可能有另一种方法来实现这一点?

标签: phpparsingfile-get-contents

解决方案


首先,正如其他人所说,第一步是为此使用 Guzzle 库而不是file_get_contents(). 这将有所帮助,尽管最终您将始终受到远程站点性能的限制。

如果可能的话,尽量减少你必须发出的 http 请求的数量:远程站点能否将所有请求的数据聚合成一个单一的数据?或者您是否能够通过其他方式获取数据?(例如直接请求远程数据库?)。此处的答案将取决于数据是什么以及您从何处获取数据,但要寻找实现此目标的方法,因为无论如何这些请求都将成为您系统的瓶颈。

如果资源是静态的(即它们不会从一个请求更改为另一个请求),那么您应该在本地缓存它们并读取本地内容,而不是在每次页面加载时读取远程内容。

缓存可以在页面第一次加载时完成(在这种情况下,第一个页面加载仍然会影响性能,但后续加载不会),也可以由单独的后台任务完成(在这种情况下,您的页面需要占用如果在任务运行之前加载页面,则内容可能在缓存中不可用)。无论哪种方式,一旦填充了缓存,您的页面加载速度就会快得多。

如果资源是动态的,那么您仍然可以像上面那样缓存它们,但是您需要更频繁地使缓存过期,具体取决于数据更新的频率。

最后,如果资源特定于单个页面加载(例如基于时间的数据,或特定于会话或用户的),那么您将需要使用不同的策略来避免性能损失。缓存仍然有它的位置,但在这种情况下不会有任何用处。

在这种情况下,您最好的方法是限制在单个页面加载中加载的数据量。您可以通过多种方式做到这一点。也许通过给用户一个选项卡式用户界面,他必须在选项卡之间单击才能查看每一位数据。每个选项卡将是不同的页面加载,因此您将在多个页面之间分配性能影响,因此对用户来说不太明显,特别是如果您使用缓存使其在他翻回之前的选项卡时无缝加载。或者,如果它们都需要在同一个页面上,您可以使用 ajax 技术将不同的数据位直接填充到页面中。您甚至可以直接从浏览器中的 Javascript 调用远程资源,而不是在后端 php 代码中加载它们。

有很多值得思考的地方。您可能希望将其中的一些内容与其他想法混合搭配。我希望我已经给了你一些有用的提示。


推荐阅读