Ξεκινήστε από το αποτέλεσμα του cURL όταν μια σελίδα που κατέβηκε μέσω διακομιστή μεσολάβησης φαίνεται ελλιπής. Μια σύντομη απόκριση, μια αποτυχημένη μεταφορά και μια πλήρης σελίδα αποκλεισμού χρειάζονται διαφορετικές εξηγήσεις.

Με ενεργό το CURLOPT_RETURNTRANSFER στο υπάρχον διαμορφωμένο handle:

$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);

Συλλέξτε αυτές τις τιμές πριν απελευθερώσετε το handle. Η αυστηρή σύγκριση ξεχωρίζει την αποτυχία μεταφοράς από επιτυχημένα σώματα όπως μια κενή συμβολοσειρά ή το “0”. Οι καταστάσεις σφάλματος HTTP δεν είναι αυτόματα αποτυχίες του curl_exec, οπότε ερμηνεύστε και την κατάσταση.

Ο μετρητής λήψης δεν περιλαμβάνει τις κεφαλίδες. Η δηλωμένη τιμή προέρχεται από το Content-Length και είναι -1 όταν το μέγεθος είναι άγνωστο. Μια απόκριση μπορεί νόμιμα να παραλείπει το Content-Length· μια άγνωστη τιμή δεν είναι διάγνωση κολοβού αρχείου.

Η αυτόματη αποκωδικοποίηση περιεχομένου προσθέτει άλλη μια διάκριση. Το Content-Length περιγράφει συνήθως τη συμπιεσμένη αναπαράσταση, ενώ η συμβολοσειρά PHP μπορεί να περιέχει αποσυμπιεσμένα byte. Η σύγκριση του strlen($body) με αυτή την κεφαλίδα συγκρίνει τότε διαφορετικές αναπαραστάσεις.

Το cURL μπορεί να αναφέρει CURLE_PARTIAL_FILE όταν η μεταφορά παραβιάζει ένα αναμενόμενο μέγεθος. Διατηρήστε αυτό το σφάλμα αντί να θεωρείτε οποιαδήποτε μη κενή έξοδο επιτυχία. Αντίστροφα, μια επιτυχημένη μεταφορά με μικρή απόκριση 200 μπορεί να είναι ολόκληρη η σελίδα που επέλεξε να επιστρέψει η προέλευση ή ο μεσολαβητής.

Τέλος ελέγξτε το απαιτούμενο περιεχόμενο. Το HTML που λαμβάνει το cURL δεν εκτελεί JavaScript για να γεμίσει τη σελίδα. Ενότητες που εμφανίζει ο φυλλομετρητής μπορεί να λείπουν από την αρχική απόκριση ακόμη και όταν έφτασε κάθε byte που μεταδόθηκε.

Σχετικά άρθρα