วาง 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 และการหมดเวลาการเชื่อมต่อเป็นผลลัพธ์ที่แตกต่างกัน ตัวเลือกการส่งที่เก็บไว้กับงานแสดงให้เห็นว่าเส้นทางใดให้ผลลัพธ์แต่ละรายการ

บทความที่เกี่ยวข้อง