Διακοπή μεταφοράς PHP cURL μετά από πρόθεμα σώματος
Κρατήστε ένα περιορισμένο πρόθεμα σε ένα callback εγγραφής και αναγνωρίστε μόνο το σφάλμα εγγραφής που προκαλεί σκόπιμα αυτό το callback.
Ένα callback εγγραφής του cURL μπορεί να κρατήσει ένα περιορισμένο πρόθεμα του σώματος και να σταματήσει τη μεταφορά μόλις συμπληρωθεί αυτό το όριο. Χρησιμοποιήστε δική σας σημαία για να ξεχωρίσετε αυτή τη σκόπιμη διακοπή από ένα άλλο σφάλμα εγγραφής.
Για ένα νέο handle του οποίου το URL προορισμού είναι ήδη ρυθμισμένο:
$limit = 32768;
$prefix = '';
$limitReached = false;
curl_setopt_array($ch, [
CURLOPT_PROXY => 'socks5h://proxy.example.net:1080',
CURLOPT_HEADER => false,
CURLOPT_WRITEFUNCTION => function ($handle, $chunk)
use (&$prefix, &$limitReached, $limit) {
$remaining = $limit - strlen($prefix);
$prefix .= substr($chunk, 0, $remaining);
if (strlen($prefix) >= $limit) {
$limitReached = true;
return 0;
}
return strlen($chunk);
},
]);
$result = curl_exec($ch);
$error = curl_errno($ch);
$expectedStop = $limitReached && $error === CURLE_WRITE_ERROR;
if ($result === false && !$expectedStop) {
throw new RuntimeException(curl_error($ch), $error);
}
Το σχήμα socks5h του URL του διαμεσολαβητή ζητά από τον διαμεσολαβητή να επιλύσει το όνομα του κεντρικού υπολογιστή προορισμού. Για μια επιτρεπόμενη δοκιμή δημόσιου προορισμού στο νέο handle που φαίνεται, μια καταχώριση χωρίς λογαριασμό από τη λίστα διαμεσολαβητών SOCKS5 μπορεί να παρέχει αυτό το endpoint. Η επαλήθευση πιστοποιητικού TLS διατηρεί τις κανονικές ρυθμίσεις της.
Η επιστροφή μηδενός για ένα μη κενό τμήμα λέει στο libcurl ότι το callback δεν δέχτηκε τα δεδομένα που δόθηκαν. Διακόπτει με CURLE_WRITE_ERROR. Εδώ μόνο ο συνδυασμός αυτού του σφάλματος και της σημαίας limitReached του callback θεωρείται αναμενόμενος.
Μια απάντηση μικρότερη από το όριο ολοκληρώνεται κανονικά. Στο όριο ή πάνω από αυτό, το prefix κρατά το πολύ 32 KiB ακόμη και αν το τελευταίο callback λάβει μεγαλύτερο τμήμα. Τα μεγέθη τμημάτων ποικίλλουν· ένα ζητούμενο μέγεθος buffer δεν εγγυάται κλήσεις σταθερού μήκους.
Αυτό περιορίζει το σώμα που κρατείται, όχι κάθε byte που έχει ήδη αποθηκευτεί προσωρινά ή μεταφερθεί στη σύνδεση. Το πρόθεμα μπορεί να τελειώσει μέσα σε χαρακτήρα πολλών byte, τιμή JSON ή στοιχείο HTML, οπότε μην υποθέσετε ότι είναι ένα πλήρες έγγραφο που μπορεί να αναλυθεί.