Установить прокси в Guzzle

У меня проблема с установленным прокси в guzzle, что отображается пустая страница, а с curl все работает отлично. Ниже приведен код, который я использовал в guzzle и curl. Что не так с этим кодом: Guzzle:

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

require_once "vendor/autoload.php";

try {
  $client = new Client();
  $request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org');
  $response = $client->send($request, [
      'timeout'  => 30,
      'curl'  => [
          'CURLOPT_PROXY' => '*.*.*.*',
          'CURLOPT_PROXYPORT' => *,
          'CURLOPT_PROXYUSERPWD' => '*:*',
      ],

  ]);
  echo '</pre>';
  echo($response->getBody());
  exit;
} catch (RequestException $e) {
  echo $e->getRequest();
  if ($e->hasResponse()) {
      echo $e->getResponse();
  }
}

И код с CURL:

$url = 'http://httpbin.org';
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_setopt($ch, CURLOPT_PROXY, '*.*.*.*');
curl_setopt($ch, CURLOPT_PROXYPORT, *);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, '*:*');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$page = curl_exec($ch);
echo $page;

Спасибо.


person M Sh    schedule 01.09.2015    source источник


Ответы (6)


Что касается Guzzle 6.

документы Guzzle предоставляют информацию о настройке прокси для одного запроса.

$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',
    ]);

УПД. Я не знаю почему, но я сталкиваюсь со странным поведением. Один сервер с guzzle версии 6.2.2 отлично работает с конфигурацией, как указано выше, а другой с той же версией получает 400 Bad Request ошибку HTTP от прокси. Это решается с помощью другой структуры конфигурации (находится в документах для guzzle 3).

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

для прокси, если у вас есть имя пользователя и пароль, вы можете использовать:

$client = new GuzzleHttp\Client();

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

это работало с жужжанием в php.

person Diego Santa Cruz Mendezú    schedule 23.01.2019

Я думаю, что для Guzzle6 лучше всего реализовать промежуточное программное обеспечение для настройки прокси.

Из документов Guzzle6:

Мы можем установить прокси, как показано ниже:

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());
person ResRelentelss    schedule 06.12.2017

У меня была такая же проблема прямо сейчас, и все, что мне нужно было сделать, это использовать ключи массива curl в качестве констант вместо строк.

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

См. параметры CURL Keys , они больше не являются строками.

person Golu    schedule 22.02.2016

Процедура для psr-7 может отличаться, но если вы используете стандартный способ создания экземпляра клиента,

https://github.com/guzzle/guzzle/blob/master/src/Client.php#L171 содержат код для чтения переменных среды, чтобы увидеть, установлены ли HTTP_PROXY и HTTPS_PROXY на текущем компьютере, и если да, Guzzle будет использовать эти значения.

Кроме того, мне пришлось установить HTTPS_PROXY = http://ip:port (не https), потому что наш прокси-сервер на рабочем месте, похоже, обрабатывает как https, так и http. запросы по протоколу http.

Преимущество этой конфигурации в том, что вам не нужно менять настройки прокси в исходном коде.

person Isuru Walpola    schedule 13.01.2016

$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();

Установите прокси/https в Guzzle и SSL, все работает идеально.

person Shaktik    schedule 17.10.2017