-2

vimeos API を使用して、XML ファイルを介してビデオの名前を呼び出そうとしています。このコードを1つのxmlファイルに使用すると、ファイルが機能します。

    $location = "http://vimeo.com/api/v2/video/16417063.xml";
    $xml = simplexml_load_file($location);
    echo $xml->video->title;

しかし、すべてのvimeoビデオIDをデータベースに保存し、次のコードを使用した後:

    <?php
    $seasontwo=mysql_query("SELECT s2 FROM video_ids LIMIT 1");
    while($row=mysql_fetch_array($seasontwo))
    {
    $headline=$row['s2'];
    $location = "http://vimeo.com/api/v2/video/".$headline.".xml";
    $xml = simplexml_load_file($location);
    echo $xml->video->title;
    }
    ?>

エラーが発生します:

    Warning: simplexml_load_file(http://vimeo.com/api/v2/video/16417063.xml) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.1 429 Too Many Requests in /home/dpnews0/public_html/tnn/wordpress/wp-content/themes/twentytwelve/content.php on line 11

    Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://vimeo.com/api/v2/video/16417063.xml" in /home/dpnews0/public_html/tnn/wordpress/wp-content/themes/twentytwelve/content.php on line 11

xml ファイルhttp://vimeo.com/api/v2/video/16417063.xmlは実際には有効ですが。誰でもこれで私を助けることができますか?

4

2 に答える 2

0

要求が多すぎるというのは、http ステータス エラー コードの 1 つです。
こちらを参照してください: http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error

429 要求が多すぎます (RFC 6585) ユーザーが一定時間内に送信した要求が多すぎます。レート制限スキームでの使用を目的としています。

このエラーが発生する理由は、スクリプトを介した異常な高アクティビティ トリガーにより、vimeo がリクエストをブロックするだけです。これは、サービス プロバイダーがコンテンツのスクラップを防止するための一般的な方法です (あなたがやろうとしているのと同じように)。

エラー 429 がスローされると、有効な xml 応答が得られません。
したがって、xml I/O 警告の 2 番目の警告メッセージが表示されます。

この問題を解決するには、xml 応答 ( http://vimeo.com/api/v2/video/16417063.xml ) をローカルに保存して、vimeo への繰り返しの要求を避ける必要があります。

簡単な方法の 1 つは、xml 応答をディスク キャッシュに格納することです。

于 2013-04-15T04:55:16.623 に答える
0

所有していない別のコンピューターと対話しており、制御できません。そのため、他のコンピューターは、予期したものとは異なる動作を変更する可能性があります。それがここで起こったことです。XML を開くリクエストがエラーになりました。エラー メッセージが理解できない場合は、問題ありません。対処するだけで済みます。

リモート サービスとやり取りするときは、障害に備えて設計する必要があります。

$xml = simplexml_load_file($location);

$hasLoaded = (bool) $xml;

if (!$hasLoaded) 
{
   // handle the case that the remote server could not provide valid XML
   // e.g. provide a stub, search inside a cache or what not:

   $xml = new SimpleXMLElement('<r><video><title>Unknown</title></video></r>');
}

Vimeo は、応答ヘッダーで使用する HTTP レート制限に関するメタ情報も提供します ( $http_response_header)。

  1. X-RateLimit-Limit: 3600
  2. X-RateLimit-Remaining: 0
  3. X-RateLimit-Reset: 1366033220

これは、使用されている WAN IP が現在、2013 年 4 月 15 日月曜日 13:40:20 GMT (約20 分) までブロックされていることを示しています。リクエスト制限 (3600 リクエスト) をトリガーしてから 1 時間。

429 Too Many Requests (RFC6585)は取得せず、403 Forbiddenのみを取得します。結局のところ、Vimeo が使用するレート制限が原因です。

Var ダンプ:

array(17) {
  [ 0] => string(22) "HTTP/1.1 403 Forbidden"
  [ 1] => string(13) "Server: nginx"
  [ 2] => string(35) "Date: Mon, 15 Apr 2013 12:49:05 GMT"
  [ 3] => string(38) "Content-Type: text/html; charset=UTF-8"
  [ 4] => string(17) "Connection: close"
  [ 5] => string(23) "X-RateLimit-Limit: 3600"
  [ 6] => string(24) "X-RateLimit-Remaining: 0"
  [ 7] => string(29) "X-RateLimit-Reset: 1366033220"
  [ 8] => string(38) "Expires: Mon, 15 Apr 2013 13:40:20 GMT"
  [ 9] => string(39) "X-UA-Compatible: IE=EmulateIE9,chrome=1"
  [10] => string(26) "X-DNS-Prefetch-Control: on"
  [11] => string(21) "Vary: Accept-Encoding"
  [12] => string(20) "X-Varnish: 366390796"
  [13] => string(6) "Age: 0"
  [14] => string(16) "Via: 1.1 varnish"
  [15] => string(18) "X-Varnish-Cache: 0"
  [16] => string(24) "X-VServer: 10.90.128.147"
}

同様に参照してください:

于 2013-04-15T11:45:15.693 に答える