-1

我有一个使用 php 扫描大量 last.fm JSON 数据的网络应用程序。这是我目前用来解析它的 php。

<?php
$lfm = file_get_contents('http://ws.audioscrobbler.com/2.0/?method=chart.gettopartists&api_key=apikey&format=json');
$json = json_decode($lfm, true);
foreach ($json['artists']['artist'] as $track) {
    $artist = $track['name'];
    $image = $track['image'][2]['#text'];
    if ($artist&&$image){
        echo 'data';
    }
}
?>

我目前使用的 php 可以完成这项工作,但有时似乎很慢。我想知道是否有更有效的方法来编写此代码以使其性能更好,或者它是否只是因为我正在通过如此大量的数据运行它而变得缓慢。非常感谢任何帮助,谢谢!

4

1 回答 1

3

这很可能不是由于您的代码,而是下载外部 JSON 需要一段时间。

你应该考虑缓存它。

找出问题所在

您可以使用以下命令检查问题所在microtime()

<?php
    $timeStart = microtime(true);
    $lfm = file_get_contents('http://ws.audioscrobbler.com/2.0/?method=chart.gettopartists&api_key=apikey&format=json');
    $timeAfterGet = microtime(true);
    $json = json_decode($lfm, true);
    foreach ($json['artists']['artist'] as $track) {
        $artist = $track['name'];
        $image = $track['image'][2]['#text'];
        if ($artist&&$image){
            echo 'data';
        }
    }
    $timeEnd = microtime(true);
    echo "Time taken to get JSON: " . number_format($timeAfterGet - $timeStart, 4) . " seconds<br />";
    echo "Time taken to go through JSON: " . number_format($timeEnd - $timeAfterGet, 4) . " seconds<br />";
?>

缓存

保留本地文件 - 检查文件上次修改的时间以及是否小于MAX_CACHE_LIFETIME(以秒为单位),然后使用缓存文件。

<?php
    define("MAX_CACHE_LIFETIME", 60 * 60); //1 hour

    $localJSONCache = "audioscrobbler.json.cache";

    $lfm = null;
    if (file_exists($localJSONCache)) {
        if (time() - filemtime($localJSONCache) < MAX_CACHE_LIFETIME) {
            $lfm = file_get_contents($localJSONCache);
        }
    }
    if (empty($lfm)) {
        $lfm = file_get_contents('http://ws.audioscrobbler.com/2.0/?method=chart.gettopartists&api_key=apikey&format=json');
        file_put_contents($localJSONCache, $lfm);
    }
    $json = json_decode($lfm, true);
    foreach ($json['artists']['artist'] as $track) {
        $artist = $track['name'];
        $image = $track['image'][2]['#text'];
        if ($artist&&$image){
            echo 'data';
        }
    }
?>
于 2013-02-12T21:52:18.050 回答