2011-05-14 61 views
2

我已經得到了這個非常緩慢的php。不是毫秒緩慢,而是導致頁面在8秒內加載緩慢。任何人都可以加快此代碼?

它是什麼做的是拉的演員和導演的信息來自第三方的電影數據庫與JSON字符串,爲每個頁面上的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

+0

是否第三方電影數據庫允許您發送人ID的JSON編碼陣列? – Tim 2011-05-14 23:41:03

+0

如果你告訴我怎麼做,我可以試試嗎? – Rowan 2011-05-14 23:44:08

回答

0

假設getMovie只會返回1個電影的結果是否安全?如果是這樣,你可以擺脫foreach電影循環,但我們現在就離開。

不循環兩次 - 如果你發現導演,然後移動到下一個循環...

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名演員的mximum - 當心,它可能不是您打算

+0

值得注意的是,可以列出不止一個董事。我認爲這不會顯示多個? – Rowan 2011-05-14 23:46:28

+0

試過這個,由於某種原因,它也顯示所有的演員,不只是5. – Rowan 2011-05-14 23:48:26

+0

這就是我的壞$我%5 == 0它應該說..是的,這將只顯示一名導演 - 你可以有$迪爾爲一個數組並添加每個導演像$ dirs [] = $ cast;那麼你foreach $ dirs作爲$ dir – 2011-05-14 23:53:12

1

不要通過$film->cast對象不循環播放兩次(演員,然後導演)。而是循環一次,將html結果保存在變量中,然後在循環結束時輸出該變量。

+0

我該怎麼做?抱歉。應該提到我是一個EXTREME初學者。 – Rowan 2011-05-14 23:43:52

+0

@ rowanc88,你可以使用連接來存儲一個變量(html代碼),在所有數據解析結束時打印出來。 – robx 2011-05-15 00:36:55

1

有幾個選項:

  1. 使並行遠程數據庫的調用。看看curl_multi。它允許您一次向遠程頁面發出多個請求。
  2. 由於聽起來最慢的部分是訪問遠程數據庫,因此您可能還需要考慮在返回的數據庫結果(如memcachedapc)上使用緩存機制來記錄先前請求中給定影片的結果。
  3. 每晚或每週到本地SQLite/MySQL數據庫
  4. 如果1和/或2不爲你工作不夠好,你也可以考慮下載(如果允許)的電影資料庫,並從那裏,而不是看你的結果。
+0

看看curl thingie,但不幸的是我無法緩存它。不允許根據條款和條件 – Rowan 2011-05-14 23:52:19

+0

嗯...任何curl_multi指針?我不知道我可以放在哪裏。我會把它放在上面列出的代碼中嗎? – Rowan 2011-05-14 23:55:16

+0

@ rowanc88實際上緩存它似乎允許合理的時期以提供您的服務(T&C:1.B.iii)。根據訪問數據的頻率以及更改頻率,我建議在後臺獲取新數據時返回緩存結果。緩存它幾個小時甚至一天左右應該被認爲是相對靜態的電影數據庫的合理性。 – 2011-05-15 00:18:59

相關問題