2011-07-06 39 views
1

基本上我正在做的是生成一個縮略圖的頁面。每個標籤有一個指定用戶的縮略圖。因此,如果用戶使用了50個不同的標籤,則會有50個縮略圖(我將最終對此進行分頁)。有用;這只是低效率。即使只有8個標籤,由於它必須等待來自Flickr服務器的9個響應(標籤列表的+1),所以速度很慢。有沒有更有效的方法來做到這一點?掃描Flickr API時,我似乎無法找到更好的解決方案。以下是我目前用來做到這一點。如何在特定用戶的請求下爲每個Flickr標籤獲取一張照片?

<?php 
    function get_api_url($additional_params) { 
     $params = array_merge($additional_params, array(
      'api_key' => API_KEY, 
      'format' => 'php_serial', 
      'user_id' => USER_ID, 
     )); 

     $encoded_params = array(); 
     foreach ($params as $k => $v) 
      $encoded_params[] = urlencode($k) . '=' . urlencode($v); 

     return 'http://api.flickr.com/services/rest/?' . implode('&', $encoded_params); 
    } 

    // Set any additional paramaters. 
    $additional_params = array(
     'method' => 'flickr.tags.getListUser', 
    ); 

    // Get the tags. 
    $rsp_obj = unserialize(file_get_contents(get_api_url($additional_params))); 

    // Parse the tags. 
    $unparsed_tags = $rsp_obj['who']['tags']['tag']; 
    $tags = array(); 
    foreach ($unparsed_tags as $tag) { 
     $tags[] = $tag['_content']; 
    } 

    // Set any additional parameters. 
    $additional_params = array(
     'method' => 'flickr.photos.search', 
     'per_page' => '1', 
    ); 
    $api_url = get_api_url($additional_params); 

    // Call the API and parse the response. 
    echo "<div id=\"tags\">"; 
    foreach ($tags as $tag) { 
     $rsp_obj = unserialize(file_get_contents($api_url . '&tags=' . urlencode($tag))); 
     $photo = $rsp_obj['photos']['photo'][0]; 

     $image_url = 'http://farm' . $photo['farm'] . '.static.flickr.com/' . 
      $photo['server'] . '/' . $photo['id'] . '_' . $photo['secret'] . '_m.jpg'; 
     $tag_url = "/gallery/?tag=$tag"; 
     $tag = ucwords($tag); 
     echo <<<HD 
      <a class="tag" href="$tag_url"> 
       <img src="$image_url" /> 
       <span class="caption">$tag</span> 
      </a> 
HD; 
    } 
    echo '</div>'; 

?> 

回答

0

你可以使用flickr.people.getPhotos方法來獲取所有的用戶的照片(每頁最多500)信息,並添加extra=tags爲調用的參數。然後,您可以在內存中執行每個標籤選擇。這將需要更少的API調用,除非用戶在其帳戶中每500張照片使用少於1個唯一標記,代價是更大的API響應以及腳本中更多的內存使用和計算。

(這隻能滿足您的「一個請求」標準,用戶照片少於500張)。

+0

所以你說的話(如果我正確理解你的話)是我搜索指定用戶的所有照片,每個頁面設置500個最大照片,並在需要獲取所有照片時發出多個請求。然後解析所有內容,爲每個標籤獲取一張照片。只要用戶每個標籤的平均照片不超過500張,這將是一個更有效的解決方案。那是對的嗎? –

+0

不錯,就API調用的數量而言效率更高。我會基準它是否整體效率更高。 – geoffspear

+0

哇。非常明顯的差異。謝謝。 –

相關問題