Php 在狂饮中设置代理

Php 在狂饮中设置代理,php,curl,proxy,guzzle,Php,Curl,Proxy,Guzzle,我对guzzle中的set-proxy有一个问题,即在使用curl时,会显示一个空白页面,但一切都很完美。下面是我在guzzle和curl中使用的代码。 此代码有什么问题: 狂饮: 谢谢。psr-7的程序可能不同,但如果您使用 实例化客户机的标准方法 包括用于读取环境变量的代码,以查看当前计算机上是否设置了HTTP_代理和HTTPS_代理,如果设置了,Guzzle将使用这些值 此外,我必须设置HTTPS_PROXY=(不是HTTPS),因为我们的workplace PROXY似乎通过http协议

我对guzzle中的set-proxy有一个问题,即在使用curl时,会显示一个空白页面,但一切都很完美。下面是我在guzzle和curl中使用的代码。 此代码有什么问题: 狂饮:


谢谢。

psr-7的程序可能不同,但如果您使用 实例化客户机的标准方法

包括用于读取环境变量的代码,以查看当前计算机上是否设置了HTTP_代理和HTTPS_代理,如果设置了,Guzzle将使用这些值

此外,我必须设置HTTPS_PROXY=(不是HTTPS),因为我们的workplace PROXY似乎通过http协议处理HTTPS和http请求


这种配置的优点是,您不必在源代码中更改代理设置。

现在也有同样的问题,我所需要做的就是使用curl数组键作为常量而不是字符串

$response = $client->send($request, [
              'timeout'  => 30,
              'curl'  => [
                  CURLOPT_PROXY => '*.*.*.*',
                  CURLOPT_PROXYPORT => *,
                  CURLOPT_PROXYUSERPWD => '*:*',
             ],
         ]);

请参见卷曲选项键,它们不再是字符串。

至于Guzzle 6

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

$client->request('GET', '/', ['proxy' => 'tcp://localhost:8125']);
但您可以在初始化客户端时将其设置为所有请求

    $client = new Client([
        'base_uri' => 'http://doma.in/',
        'timeout' => 10.0,
        'cookie' => true,
        'proxy' => 'tcp://12.34.56.78:3128',
    ]);
UPD。我不知道为什么,但我面对一种奇怪的行为。一台guzzle版本为6.2.2的服务器与上面的配置配合得很好,另一台版本相同的服务器从代理服务器接收
400错误请求
HTTP错误。使用另一个配置结构(在中找到)解决此问题


在Guzzle中设置proxy/https,SSL工作得很好。

对于Guzzle6,我认为最好的方法是实现一个用于设置代理的中间件

来自Guzzle 6文档:

我们可以按如下方式设置代理:

use Psr\Http\Message\RequestInterface;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
use GuzzleHttp\Client;
use GuzzleHttp\Middleware;
use Util\Api;
function add_proxy_callback($proxy_callback) {
    return function (callable $handler) use ($proxy_callback) {
        return function (RequestInterface $request,$options) use ($handler,$proxy_callback) {
            $ip = $proxy_callback();
            $options['proxy'] = $ip;
            return $handler($request,$options);
        };
    };
} 
$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());
$stack->push(add_proxy_callback(function() {
    return Api::getIp(); //function return a ip 
}));
$client = new Client(['handler'=>$stack]);
$response = $client->request('GET','http://httpbin.org/ip');
var_dump((string)$response->getBody());

对于代理,如果您有用户名和密码,则可以使用:

$client = new GuzzleHttp\Client();

$res = $client->request("POST", "https://endpoint.com", [
    "proxy" => "http://username:password@192.168.16.1:10",
]);

这在php中与guzzle一起工作。

由于httpoxy漏洞,这不再有效:@LarsNyström使用Laravel.env对此进行了测试,它仍在工作
$client = new Client([
    'base_uri' => 'http://doma.in/',
    'timeout' => 10.0,
    'cookie' => true,
    'request.options' => [
        'proxy' => 'tcp://12.34.56.78:3128',
    ],
]);
$response = \Drupal::httpClient()->post($settings['base_url'] . 'api/search/', [
    'verify' => true,
    'body' => $post_data,
      'headers' => [
        'Content-type' => 'application/json',
      ],
    'curl' => [
        CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2, 
        CURLOPT_PROXY => 'proxyip:58080'],
    ]
  )->getBody()->getContents();
use Psr\Http\Message\RequestInterface;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
use GuzzleHttp\Client;
use GuzzleHttp\Middleware;
use Util\Api;
function add_proxy_callback($proxy_callback) {
    return function (callable $handler) use ($proxy_callback) {
        return function (RequestInterface $request,$options) use ($handler,$proxy_callback) {
            $ip = $proxy_callback();
            $options['proxy'] = $ip;
            return $handler($request,$options);
        };
    };
} 
$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());
$stack->push(add_proxy_callback(function() {
    return Api::getIp(); //function return a ip 
}));
$client = new Client(['handler'=>$stack]);
$response = $client->request('GET','http://httpbin.org/ip');
var_dump((string)$response->getBody());
$client = new GuzzleHttp\Client();

$res = $client->request("POST", "https://endpoint.com", [
    "proxy" => "http://username:password@192.168.16.1:10",
]);