2015-09-01 6 views
5

Ich habe ein Problem mit Proxy in guzzle, dass eine leere Seite gezeigt wurde, während mit curl alles perfekt funktioniert. Der Code, den ich beim Fressen und Locken benutzt habe, kam unten. Was mit diesem Code falsch ist: Guzzle:Proxy in Guzzle setzen

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

und der Code mit 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; 

Dank.

Antwort

2

Das Verfahren für die bA-7 kann unterschiedlich sein, aber wenn Sie die Standardmethode unter Verwendung eines Client zu instanziiert,

path\to\project\vendor\guzzlehttp\guzzle\src\Client.php, lines 164-170 Code enthält die Umgebungsvariablen zu lesen, um zu sehen, ob HTTP_PROXY und https_proxy eingestellt auf die aktuelle Maschine, und wenn ja, wird Guzzle diese Werte verwenden.

Zusätzlich musste ich meine HTTPS_PROXY = http://ip:port (nicht https) einstellen, weil unser Arbeitsplatz-Proxy sowohl HTTPS- als auch http-Anfragen über das http-Protokoll zu bearbeiten scheint.

Der Vorteil dieser Konfiguration besteht darin, dass Sie die Proxy-Einstellungen in Ihrem Quellcode nicht ändern müssen.

1

Hatte das gleiche Problem gerade jetzt, und alles, was ich anstelle von Strings Verwendung curl Array-Schlüssel als Konstanten tun musste ..

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

Siehe ROTATION Optionen Keys, sie sind nicht mehr Saiten.

4

Wie für Guzzle 6.

Guzzle docs geben Informationen über Proxy für eine einzige Anforderung Einstellung

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

Aber man kann es auf alle Anforderungen festgelegt, wenn Client

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

initialisiert. Ich weiß nicht warum, aber ich habe ein seltsames Verhalten. Ein Server mit der Version 6.2.2 funktioniert gut mit der Konfiguration wie oben, und der andere mit der gleichen Version erhält 400 Bad Request HTTP-Fehler von einem Proxy. Es ist

$client = new Client([ 
    'base_uri' => 'http://doma.in/', 
    'timeout' => 10.0, 
    'cookie' => true, 
    'request.options' => [ 
     'proxy' => 'tcp://12.34.56.78:3128', 
    ], 
]); 
1
$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(); 

Set-Proxy/https in Guzzle und SSL seine Arbeit perfekt mit einer anderen Konfigurationsstruktur (in docs for guzzle 3 gefunden) gelöst.

0

Für Guzzle6, denke ich, ist der beste Weg, eine Middleware zur Proxy-Einstellung zu implementieren.

Von Guzzle6 docs:

Wir Proxy einstellen können, wie unten:

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