如何在 Guzzle 中正确设置 CURLOPT_PROXY?

How to set CURLOPT_PROXY in Guzzle right way?

我正在尝试设置 CURLOPT_PROXY 但它不起作用。卷曲已启用。如果我通过 "raw" curl 请求执行此操作 - 一切正常.. 那么?可能的解决方案是什么?

$client = new GuzzleHttp\Client();

$res = $client->get('http://www.ipmango.com/api/myip', [
    'config' => [
        'curl' => [
            'CURLOPT_PROXY' => '194.135.220.18:8081',
        ],
    ]
]);

echo $res->getBody(); // displays my ip addess, not that what I set.

我花了很多时间发现自己还需要将选项 CURLOPT_HTTPPROXYTUNNEL 设置为 1。所以像:

<?php
$res = $client->get('http://www.ipmango.com/api/myip', [
'config' => [
    'curl' => [
        'CURLOPT_PROXY' => '194.135.220.18:8081',
        'CURLOPT_HTTPPROXYTUNNEL' => 1,
    ]
   ]
]);

GuzzleHttp 客户端自动检测是否设置了环境变量 HTTP_PROXYHTTPS_PROXY

(参见 \path\to\project\vendor\guzzlehttp\guzzle\src\Client.php 的第 165-175 行)

所以将HTTP_PROXY=http://ip:portHTTPS_PROXY=https://ip:port都设置为系统环境变量。现在重新启动命令行,然后重新运行 php artisan serve

如果需要,您也可以在环境变量中为您的代理配置身份验证

Guzzle 文档提供了有关为单个请求设置代理的信息

$client->request('GET', '/', ['proxy' => 'tcp://localhost:8125']);

http://docs.guzzlephp.org/en/latest/request-options.html#proxy

但是可以在初始化客户端的时候设置为所有请求

    $client = new Client([
        'base_uri' => 'http://doma.in/',
        'timeout' => 10.0,
        'cookie' => true,
        'proxy' => 'tcp://12.34.56.78:3128',
    ]);