PHP cURL გადაცემის შეჩერება სხეულის პრეფიქსის შემდეგ
შეინახეთ შეზღუდული პრეფიქსი ჩაწერის callback-ში და ამოიცანით მხოლოდ ის ჩაწერის შეცდომა, რომელსაც ეს callback განზრახ იწვევს.
cURL-ის ჩაწერის callback-ს შეუძლია სხეულის შეზღუდული პრეფიქსის შენახვა და გადაცემის შეჩერება, როგორც კი ეს ზღვარი მიიღწევა. გამოიყენეთ საკუთარი დროშა, რომ ეს განზრახ შეჩერება სხვა ჩაწერის შეცდომისგან გაარჩიოთ.
ახალი 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);
}
proxy URL-ის socks5h სქემა proxy-ს სთხოვს სამიზნე ჰოსტის სახელის ამოხსნას. ნაჩვენებ ახალ handle-ზე დაშვებული საჯარო სამიზნის ტესტისთვის SOCKS5 proxy-ების სიიდან ანგარიშის გარეშე ჩანაწერს შეუძლია ამ endpoint-ის მოწოდება. TLS სერტიფიკატის შემოწმება ჩვეულებრივ პარამეტრებს ინარჩუნებს.
არაცარიელი ნაწილისთვის ნულის დაბრუნება libcurl-ს აცნობს, რომ callback-მა არ მიიღო მოწოდებული მონაცემები. ის წყვეტს CURLE_WRITE_ERROR-ით. აქ მოსალოდნელად ითვლება მხოლოდ ამ შეცდომისა და callback-ის limitReached დროშის ერთობლიობა.
ზღვარზე მოკლე პასუხი ჩვეულებრივად სრულდება. ზღვარზე ან ზემოთ prefix ინახავს მაქსიმუმ 32 KiB-ს, თუნდაც ბოლო callback-მა უფრო დიდი ნაწილი მიიღოს. ნაწილების ზომები იცვლება; მოთხოვნილი ბუფერის ზომა არ არის ფიქსირებული სიგრძის გამოძახებების გარანტია.
ეს ზღუდავს შენახულ სხეულს და არა კავშირზე უკვე ბუფერირებულ ან გადაცემულ ყველა ბაიტს. პრეფიქსი შეიძლება დასრულდეს მრავალბაიტიანი სიმბოლოს, JSON მნიშვნელობის ან HTML ელემენტის შიგნით, ამიტომ ნუ ჩათვლით, რომ ეს სრულად გარჩევადი დოკუმენტია.