Intereting Posts
Модуль против контроллера Как вызвать функции wordpress в пользовательском скрипте php Проблема с потреблением веб-службы php в настольном приложении c # WordPress – Использование функций вне wordpress Получить идентификатор соединения PDO Загрузка нескольких изображений для одиночной записи в codeigniter Как читать «,» как «<br />» в PHP / MySQL? jQuery | Получение отображения значения, когда несколько одинаковых идентификаторов Проверка наличия содержимого $ _REQUEST в виде int Маршрут с особыми символами не корректно обрабатывается в Zend Framework 2 Загрузка файла Ajax с данными формы Laravel 5.3 PHP: как проверить, содержит ли строка запроса или POST-вары одинаковые переменные дважды Как рекурсивно построить <select> с неизвестной глубиной дерева Paypal IPN Получение пустого подтверждения (должно быть «VERIFIED» или «INVALID») Удалить идентификатор статьи из URL-адреса Joomla 3

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

У меня возникла проблема с установленным прокси-сервером в том, что была показана пустая страница, а с завитом все работает отлично. Код, который я использовал в жжеме и завитке, был ниже. Что не так с этим кодом: 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:

  • запрос-options.proxy
  • Обработчики-и-промежуточный слой

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

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