Guzzle Pool: ส่ง proxy ของแต่ละงานไปยัง requestAsync
แนบตัวเลือก proxy กับทุกการทำงานแบบ async แทนที่จะแนบกับข้อความคำขอ PSR-7 หรือ factory ที่บล็อก
วาง proxy ของแต่ละงาน Guzzle ไว้บนการทำงานแบบ async ที่พูลเริ่ม ในซิงก์การตั้งค่าไคลเอนต์ที่มีอยู่ ใช้ factory ของสัญญา:
$operations = function () use ($client, $jobs) {
foreach ($jobs as $id => $job) {
yield $id => function () use ($client, $job) {
return $client->requestAsync('GET', $job['url'], [
'proxy' => $job['proxy'],
'timeout' => 20,
]);
};
}
};
$pool = new GuzzleHttp\Pool($client, $operations(), [
'concurrency' => 4,
]);
$pool->promise()->wait();
ทุกงานที่ผ่านการตรวจสอบจะให้ปลายทางและ proxy หนึ่งรายการ สำหรับคำขอสาธารณะที่ได้รับอนุญาต ผู้สมัคร HTTP จากรายการ proxy HTTP สามารถให้ URL proxy ที่ไม่มีข้อมูลรับรองของงานนั้นได้ การเลือกเกิดขึ้นก่อนที่ factory ของมันจะทำงาน คำขอ PSR-7 อธิบายข้อความ HTTP ในขณะที่ตัวเลือกการส่งเหล่านี้ควบคุมการขนส่ง การพิมพ์หรือจัดเก็บค่า proxy ไว้ข้างข้อความไม่สามารถกำหนดค่าการทำงานที่ส่งด้วยวิธีอื่นได้
คืน requestAsync() จาก factory การเรียก request() แบบซิงโครนัสที่นั่นอาจบล็อกในขณะที่พูลพยายามเริ่มงานพร้อมกัน
เพิ่ม callback สำหรับผลลัพธ์ที่สำเร็จและถูกปฏิเสธโดยใช้การจัดการที่มีอยู่ของแอปพลิเคชัน เก็บคีย์งาน ตัวระบุ proxy ที่เลือก และหมายเลขความพยายามไว้ในผลลัพธ์ทั้งสอง ลำดับการเสร็จสิ้นแตกต่างจากลำดับอินพุต อย่าเลือกปลายทางอื่นใน factory อย่างลับ ๆ หลังจากบันทึกไว้หนึ่งรายการสำหรับงานแล้ว
ค่าความพร้อมกันจำกัดงานของพูลนี้ หลายงานที่เลือก proxy หรือบัญชีจำกัดเดียวกันอาจยังต้องใช้งบประมาณแยกสำหรับปลายทางนั้น
ตีความผลลัพธ์ตามขั้นตอน: การปฏิเสธปลายทาง การรับรองความถูกต้องของ proxy และการหมดเวลาการเชื่อมต่อเป็นผลลัพธ์ที่แตกต่างกัน ตัวเลือกการส่งที่เก็บไว้กับงานแสดงให้เห็นว่าเส้นทางใดให้ผลลัพธ์แต่ละรายการ