Guzzle Pool:把每个任务的代理传给 requestAsync
把代理选项附加到每个异步操作上,而不是附加到 PSR-7 请求消息或会阻塞的工厂上。
把每个 Guzzle 任务的代理放在池启动的异步操作上。在现有的客户端设置中,使用 promise 工厂:
$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();
每个通过校验的任务都会提供目的地和代理。对于允许的公开请求,来自 HTTP 代理列表 的 HTTP 候选可以为该任务提供免凭据的代理 URL;选择发生在它的工厂运行之前。PSR-7 请求描述的是 HTTP 消息,而这些发送选项控制的是传输。在消息旁边打印或保存代理值,无法配置一个以其他方式发送它的操作。
从工厂返回 requestAsync()。在那里调用同步的 request() 可能会在池尝试启动并发工作时发生阻塞。
使用应用程序现有的处理方式添加完成和拒绝的回调。在两种结果中都保留任务键、所选代理标识符和尝试次数;完成顺序与输入顺序不同。在为任务记录了一个端点之后,不要在工厂里偷偷选择另一个端点。
并发值限制了这个池的工作量。多个任务选择同一个受限代理或账户时,仍可能需要为该端点单独预算。
按阶段解读结果:目的地被拒绝、代理认证和连接超时是不同的结果。随任务保留的发送选项显示了哪条路线产生了每个结果。