У меня возникла проблема с установленным прокси-сервером в том, что была показана пустая страница, а с завитом все работает отлично. Код, который я использовал в жжеме и завитке, был ниже. Что не так с этим кодом: 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;
Благодарю.
Процедура psr-7 может отличаться, но если вы используете стандартный способ создания экземпляра клиента,
путь \ to \ project \ vendor \ guzzlehttp \ guzzle \ src \ Client.php, строки 164-170 содержит код для чтения переменных окружения, чтобы увидеть, установлены ли HTTP_PROXY и HTTPS_PROXY на текущем компьютере, и если да, то Guzzle будет использовать эти значения.
Кроме того, мне пришлось установить свой HTTPS_PROXY = http: // ip: port (not https), потому что наш прокси рабочего места, похоже, обрабатывает как https, так и http-запросы через http-протокол.
Преимущество этой конфигурации заключается в том, что вам не нужно настраивать параметры прокси-сервера в исходном коде.
Что касается 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', ]);
UPD. Я не знаю почему, но у меня странное поведение. Один сервер с жузливой версией 6.2.2 отлично работает с конфигурацией, как указано выше, а другой с той же версией получает 400 Bad Request
ошибочных ошибок HTTP- 400 Bad Request
от прокси-сервера. Он решен с другой конфигурационной структурой (найденной в документах для guzzle 3 )
$client = new Client([ 'base_uri' => 'http://doma.in/', 'timeout' => 10.0, 'cookie' => true, 'request.options' => [ 'proxy' => 'tcp://12.34.56.78:3128', ], ]);
Имел ту же проблему прямо сейчас, и все, что мне нужно было сделать, это использовать ключи массива curl как константы, а не строки.
$response = $client->send($request, [ 'timeout' => 30, 'curl' => [ CURLOPT_PROXY => '*.*.*.*', CURLOPT_PROXYPORT => *, CURLOPT_PROXYUSERPWD => '*:*', ], ]);
См. Опции CURL. Они больше не являются строками.
$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();
Установите proxy / https в Guzzle и SSL, его работа прекрасна.
Для 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());