【问题标题】:PHP file_get_contents optimizationPHP file_get_contents 优化
【发布时间】:2018-08-17 11:32:00
【问题描述】:

我使用简单的 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";?>

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

有没有什么办法可以优化这个脚本,或者用其他方法来达到这个目的?

【问题讨论】:

标签: php parsing file-get-contents


【解决方案1】:

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

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

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

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

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

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

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

有很多事情要考虑。您可能希望将其中的一些内容与其他想法混合搭配。我希望我已经给了你一些有用的提示。

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 2017-03-15
    • 2017-09-14
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多