2011-07-06 13 views
1

基本的には、サムネイルのページを生成しています。指定されたユーザーが持つ各タグごとに1つのサムネイルがあります。したがって、ユーザーが50種類の異なるタグを使用している場合は、50のサムネイルが表示されます(これには最終的にページが貼り付けられます)。できます;それだけで非効率です。わずか8つのタグでも、Flickrサーバーから9つの応答(タグのリストの+1)を待たなければならないため、これは非常に遅いです。これを行うより効率的な方法はありますか? Flickr APIをスキャンしているうちに、より良い解決策を見つけることができないようです。以下は私が現在これを行うために使用しているものです。1回のリクエストで特定のユーザーがFlickrタグごとに1枚の写真を取得するにはどうすればよいですか?

<?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

あなたはユーザーさんの写真(ページあたり最大500)についての情報を取得するためにflickr.people.getPhotosメソッドを使用して、コールのパラメータにextra=tagsを追加することができます。次に、メモリ内でタグごとの選択を行うことができます。ユーザーがアカウントで500枚の写真につき1つ以下のユニークタグを使用しない限り、APIレスポンスが大きく、スクリプト内でのメモリ使用量と計算量が増えます。

(写真が500枚未満のユーザーの「1つのリクエスト」基準を満たしています)。

+0

あなたが言っていることは(私があなたを正しく理解している場合)、1ページあたり最大写真数500セットの特定のユーザーがすべての写真を検索し、すべての写真を取得するために必要な場合に複数のリクエストを行います。次に、すべてのタグを解析して、各タグごとに1つの写真を取得します。ユーザーがタグごとに平均500枚以上の写真を撮っていない限り、これはより効率的なソリューションになります。あれは正しいですか? –

+0

、API呼び出しの数の点でより効率的です。私はそれがより効率的であるかどうかをベンチマークします。 – geoffspear

+0

うわー。非常に顕著な違い。ありがとう。 –

関連する問題