Katkaistiinko PHP:n cURL-vastaus?
Tarkista cURL:n siirron tulos, vastauksen tila ja rungon esitys ennen kuin vertaat ladattua kokoa Content-Length-otsakkeeseen.
Aloita cURL:n tuloksesta, kun välityspalvelimen kautta ladattu sivu näyttää puutteelliselta. Lyhyt vastaus, epäonnistunut siirto ja täysi estosivu tarvitsevat erilaiset selitykset.
Kun CURLOPT_RETURNTRANSFER on käytössä olemassa olevassa määritetyssä handlesa:
$body = curl_exec($ch);
if ($body === false) {
throw new RuntimeException(curl_error($ch), curl_errno($ch));
}
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$downloaded = curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD_T);
$declared = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T);
Kerää nämä arvot ennen kuin vapautat handlen. Tiukka vertailu erottaa siirtovirheen onnistuneista rungoista, kuten tyhjästä merkkijonosta tai arvosta “0”. HTTP-virhetilat eivät ole automaattisesti curl_exec-virheitä, joten tulkitse myös tila.
Ladatun datan laskuri ei sisällä otsakkeita. Ilmoitettu arvo tulee Content-Length-otsakkeesta ja on -1, kun koko on tuntematon. Vastaus voi laillisesti jättää Content-Lengthin pois; tuntematon arvo ei ole katkaistun tiedoston diagnoosi.
Sisällön automaattinen dekoodaus tuo vielä yhden eron. Content-Length kuvaa yleensä pakattua esitystä, kun taas PHP-merkkijono voi sisältää purettuja tavuja. strlen($body) -kutsun vertaaminen tuohon otsakkeeseen vertailee silloin eri esityksiä.
cURL voi raportoida CURLE_PARTIAL_FILE, kun siirto rikkoo odotetun koon. Säilytä tämä virhe sen sijaan, että pitäisit mitä tahansa ei-tyhjää tulostetta onnistumisena. Päinvastoin, onnistunut siirto ja pieni 200-vastaus voivat olla koko se sivu, jonka lähde tai välityspalvelin päätti palauttaa.
Lopuksi tarkista tarvittava sisältö. cURL:n hakema HTML ei suorita JavaScriptiä sivun täyttämiseksi. Selaimessa näkyvät osiot voivat puuttua alkuperäisestä vastauksesta, vaikka jokainen siirretty tavu saapui perille.