2017-03-24 6 views
1

ich versuchen, einige gamescore Informationen von stats.nba.com über curl zu erhalten:Locken-API-Anforderungen mit PHP - lange Antwort

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

:

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; 
} 

In Browser diese Informationen wie folgt aussieht

und dauert etwa 1-2 Sekunden zu laden. Aber über PHP dauert es 10-12 Sekunden, um Informationen zu erhalten. curl_getinfo() zeigt, dass starttransfer_time bei 10 Sekunden:

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) 
} 

Was ein Grund dafür sein könnte, und wie man es beheben?

+1

Antworten hier: [Die Wellung erwarten: 100-Continue] (http://stackoverflow.com/a/37387896/1796006) http://stackoverflow.com/questions/14158675/how-can-i- stop-curl-from-using-100-weiter – Darker

Antwort

0

In der Tat, wie @darker in den Kommentaren darauf hingewiesen. Es scheint, dass das Hinzufügen der folgenden Zeile zu Ihrem Code den Trick macht. (Geprüft).

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

Expect: 100-continue scheint generell relevant, wenn Sie POST verwenden. Obwohl Sie in Ihrem Code GET und nicht POST verwenden, könnte es so aussehen, als ob die von Ihnen verwendete API möglicherweise anderweitig unterstützt wurde.

In meiner Recherche stieß ich auf einen Artikel (Link unten), der erklärt, wie die Transaktion funktioniert.

aus dem Artikel zitiert,

API POST-Anfragen, die die umfassen erwarten: 100-Continue-Header speichert Bandbreite zwischen dem Client und dem Server, da der Server der API-Anforderung ablehnen kann, bevor der Antrag Körper selbst ist übertragen. Bei API-POST-Anfragen mit sehr großen Anforderungskörpern (z. B. Datei-Uploads) kann der Server beispielsweise nach einer ungültigen Authentifizierung suchen und die Anfrage ablehnen, bevor die Push-Nachricht gesendet wurde, was zu erheblichen Einsparungen bei der Bandbreite führt.

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

0

Zuerst müssen Sie für komprimierte Antwort vom Server über den Request-Header fragen.

Zweitens interessant für Ihre bestimmte URL der Server stützt sich auf die Accept-Language: Header, um schnell zu reagieren.

Hier sind die Linien werden Ihre Antwort schneller.

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