2017-03-24 13 views
1

私はカールを経由してstats.nba.comからいくつかのgamescore情報を取得しよう:ブラウザでカールAPI要求 - 長い応答

function getGame($gameID) 
{ 
$url = "http://stats.nba.com/stats/boxscoretraditionalv2?EndPeriod=10&EndRange=28800&GameID=00" . intval($gameID) . "&RangeType=0&Season=2016-17&SeasonType=Regular+Season&StartPeriod=1&StartRange=0"; 
$process = curl_init($url); 

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($process, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0"); 
curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); 

$return = curl_exec($process); 
$results = json_decode($return); 
curl_close($process); 

return $results; 
} 

この情報は次のようになります。

http://stats.nba.com/stats/boxscoretraditionalv2?EndPeriod=10&EndRange=28800&GameID=0021600966&RangeType=0&Season=2016-17&SeasonType=Regular+Season&StartPeriod=1&StartRange=0

とロードに約1〜2秒かかります。 しかし、PHPを介して情報を取得するには10-12秒かかります。

array(26) { 
["url"]=> 
string(174) "http://stats.nba.com/stats/boxscoretraditionalv2?EndPeriod=10&EndRange=28800&GameID=0021601068&RangeType=0&Season=2016-17&SeasonType=Regular+Season&StartPeriod=1&StartRange=0" 
["content_type"]=> 
string(31) "application/json; charset=utf-8" 
["http_code"]=> 
int(200) 
["header_size"]=> 
int(384) 
["request_size"]=> 
int(284) 
["filetime"]=> 
int(-1) 
["ssl_verify_result"]=> 
int(0) 
["redirect_count"]=> 
int(0) 
["total_time"]=> 
float(10.717) 
["namelookup_time"]=> 
float(0.046) 
["connect_time"]=> 
float(0.109) 
["pretransfer_time"]=> 
float(0.109) 
["size_upload"]=> 
float(0) 
["size_download"]=> 
float(5455) 
["speed_download"]=> 
float(509) 
["speed_upload"]=> 
float(0) 
["download_content_length"]=> 
float(5455) 
["upload_content_length"]=> 
float(-1) 
["starttransfer_time"]=> 
float(10.686) 
["redirect_time"]=> 
float(0) 
["redirect_url"]=> 
string(0) "" 
["primary_ip"]=> 
string(13) "87.245.194.98" 
["certinfo"]=> 
array(0) { 
} 
["primary_port"]=> 
int(80) 
["local_ip"]=> 
string(12) "192.168.1.88" 
["local_port"]=> 
int(62105) 
} 

その理由とどのようにそれを修正することができるもの: curl_getinfoは()starttransfer_timeは10秒であることを示していますか?

+1

ここで回答:[期待カール:100-続ける](http://stackoverflow.com/a/37387896/1796006)http://stackoverflow.com/questions/14158675/how-can-i-ストップカール - 使用中 - 100-continue – Darker

答えて

0

実際、@darkerのようにコメントに指摘されています。それはあなたのコードに次の行を追加することは、そのトリックを行うようだ。 (テスト済み)。

curl_setopt($process, CURLOPT_HTTPHEADER, array('Expect: 100-continue')); 

Expect: 100-continueは、POSTを使用するときに一般的に適切と思われます。 POSTではなくGETを使用するコードでは、使用しているAPIが別の方法をサポートするように設計されているように見えるかもしれません。

私の研究では、トランザクションの仕組みを説明した記事(下記のリンク)が表示されました。

記事から引用

期待含まAPIのPOSTリクエスト:リクエストボディが偶数である前に、サーバはAPIリクエストを拒否することができるので、100-続行ヘッダーは、クライアントとサーバの間の帯域幅を節約送信されます。非常に大きなリクエストボディ(ファイルアップロードなど)を持つAPI POSTリクエストの場合、サーバは、たとえば、プッシュボディが送信される前に無効な認証をチェックしてリクエストを拒否することができ、帯域幅を大幅に節約できます。

参考:https://support.urbanairship.com/hc/en-us/articles/213492003--Expect-100-Continue-Issues-and-Risks

0

まず、あなたのリクエストヘッダを介してサーバーから圧縮された応答を依頼する必要があります。

第2に、サーバーはAccept-Language:ヘッダーを使用して迅速に対応する必要があります。

ここでは、あなたの応答をより速くするでしょう。

curl_setopt($process, CURLOPT_HTTPHEADER, array("Accept-Language: en-US,en;q=0.8,bn;q=0.6")); 
curl_setopt($process,CURLOPT_ENCODING , ""); // Means handle all encodings