Guzzle Pool: den Proxy jedes Jobs an requestAsync übergeben
Hängen Sie Proxy-Optionen an jede asynchrone Operation statt an eine PSR-7-Anfragenachricht oder eine blockierende Factory.
Legen Sie den Proxy jedes Guzzle-Jobs auf die asynchrone Operation, die der Pool startet. Verwenden Sie innerhalb eines bestehenden Client-Setups Promise-Factories:
$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();
Jeder validierte Job liefert ein Ziel und einen Proxy. Für eine erlaubte öffentliche Anfrage kann ein HTTP-Kandidat aus der HTTP-Proxy-Liste die anmeldedatenfreie Proxy-URL dieses Jobs liefern; die Auswahl erfolgt, bevor seine Factory läuft. Eine PSR-7-Anfrage beschreibt die HTTP-Nachricht, während diese Sendeoptionen den Transport steuern. Das Ausgeben oder Speichern eines Proxy-Werts neben der Nachricht kann keine Operation konfigurieren, die ihn auf andere Weise sendet.
Geben Sie requestAsync() aus der Factory zurück. Ein Aufruf von synchronem request() dort kann blockieren, während der Pool versucht, nebenläufige Arbeit zu starten.
Fügen Sie Callbacks für erfüllte und abgelehnte Ergebnisse mit der vorhandenen Behandlung der Anwendung hinzu. Behalten Sie den Job-Schlüssel, die Kennung des gewählten Proxys und die Versuchsnummer in beiden Ausgängen; die Abschlussreihenfolge unterscheidet sich von der Eingabereihenfolge. Wählen Sie in der Factory nicht heimlich einen anderen Endpunkt, nachdem einer für den Job erfasst wurde.
Der Nebenläufigkeitswert begrenzt die Arbeit dieses Pools. Mehrere Jobs, die einen eingeschränkten Proxy oder Account wählen, können dennoch ein separates Budget für diesen Endpunkt benötigen.
Deuten Sie Ergebnisse nach Stufe: Zielablehnung, Proxy-Authentifizierung und Verbindungs-Timeout sind verschiedene Ausgänge. Die mit dem Job aufbewahrten Sendeoptionen zeigen, welche Route jedes Ergebnis erzeugt hat.