任何人都可以加速这段代码吗?

时间:2011-05-14 23:31:52

标签: php

我在这里有一点这个非常迟钝的PHP。不是毫秒的缓慢,但导致页面在8秒内加载缓慢。

它正在做的是从第三方电影数据库中获取带有json字符串的Actor和Director信息,用于页面上20部电影中的每一部。

我做了一些测试并确定我的代码必须正常。这是连接数据库20次就是问题。

除了从20减少页面上的电影数量外,还有什么我可以做的吗?

echo '<h3>Starring</h3>
      <p>';
$num_actors = 0;
$films_result = $tmdb->getMovie($film->id);
$films = json_decode($films_result);
foreach ($films as $film) {
foreach ($film->cast as $cast) {
  if ($cast->job == 'Actor') {
    echo '<a href="person.php?id=' . $cast->id . '">' . $cast->name . '</a> ';
    $num_actors++;
    if ($num_actors == 5)
    break;
}
}
echo '</p>
      <h3>Director</h3>
      <p>';
foreach ($film->cast as $cast) {
  if ($cast->job == 'Director') {
    echo '<a href="person.php?id=' . $cast->id . '">' . $cast->name . '</a> ';
  }
}
echo '</p>';

我不知道它是否会有所帮助,但这是我正在进行的电话会议中的数据库文档页面 - http://api.themoviedb.org/2.1/methods/Movie.getInfo

3 个答案:

答案 0 :(得分:1)

不要两次遍历$film->cast个对象(演员然后导演)。相反,循环一次,将html结果保存在变量中,然后在循环结束时输出该变量。

答案 1 :(得分:1)

有几个选择:

  1. 并行调用远程数据库。看看curl_multi。它允许您一次向远程页面发出多个请求。
  2. 由于听起来最慢的部分是访问远程数据库,您可能还需要考虑对返回的数据库结果(如memcachedapc使用缓存机制来记住结果来自先前请求的电影。
  3. 如果1和/或2对您不起作用,您也可以考虑每晚或每周将电影数据库(如果允许)下载到本地sqlite / MySQL数据库并从那里读取结果。

答案 2 :(得分:0)

假设getMovie只返回1部电影的结果是否安全?如果是这样你可以摆脱foreach $ films循环,但我们暂时不会这样做。

不要循环两次 - 如果你找到导演然后进入下一个循环......

echo '<h3>Starring</h3>
      <p>';

$films_result = $tmdb->getMovie($film->id);
$films = json_decode($films_result);
foreach ($films as $film) {
    $i=0;
    foreach ($film->cast as $cast) {
        if ($cast->job == 'Director') {
            $dir = $cast;
            continue;
        }
        if ($cast->job == 'Actor') {
            echo '<a href="person.php?id=' . $cast->id . '">' . $cast->name . '</a> ';

            if ($i%5 == 5) break;
        }
        $i++;
    }
    echo '</p>
          <h3>Director</h3>
          <p>';
    echo '<a href="person.php?id=' . $dir->id . '">' . $dir->name . '</a> ';
    echo '</p>';

这个脚本只显示最多5个演员 - 请注意它可能不是你想要的