2016-03-04 2 views
0

Я попытался использовать документы Guzzle для установки прокси-сервера, но он не работает. Официальная страница Github для Goutte довольно мертва, поэтому ничего не может найти.Настройка прокси-сервера в Goutte

Кто-нибудь знает, как установить прокси-сервер?

Это то, что я пробовал:

$client = new Client(); 
$client->setHeader('User-Agent', $user_agent); 
$crawler = $client->request('GET', $request, ['proxy' => $proxy]); 

ответ

0

Вы думаете Rigth, но в Goutte \ Client :: doRequest(), при создании жрать клиента

$guzzleRequest = $this->getClient()->createRequest(
     $request->getMethod(), 
     $request->getUri(), 
     $headers, 
     $body 
); 

параметры не передаются, когда создать объект запроса. Итак, если вы хотите использовать прокси-сервер, а затем переопределить класс Goutte \ Client, метод doRequest(), и замените этот код на

$guzzleRequest = $this->getClient()->createRequest(
     $request->getMethod(), 
     $request->getUri(), 
     $headers, 
     $body, 
     $request->getParameters() 
); 

Пример переопределяя класса:

<?php 

namespace igancev\override; 

class Client extends \Goutte\Client 
{ 
    protected function doRequest($request) 
    { 
     $headers = array(); 
     foreach ($request->getServer() as $key => $val) { 
      $key = implode('-', array_map('ucfirst', explode('-', strtolower(str_replace(array('_', 'HTTP-'), array('-', ''), $key))))); 
      if (!isset($headers[$key])) { 
       $headers[$key] = $val; 
      } 
     } 

     $body = null; 
     if (!in_array($request->getMethod(), array('GET','HEAD'))) { 
      if (null !== $request->getContent()) { 
       $body = $request->getContent(); 
      } else { 
       $body = $request->getParameters(); 
      } 
     } 

     $guzzleRequest = $this->getClient()->createRequest(
      $request->getMethod(), 
      $request->getUri(), 
      $headers, 
      $body, 
      $request->getParameters() 
     ); 

     foreach ($this->headers as $name => $value) { 
      $guzzleRequest->setHeader($name, $value); 
     } 

     if ($this->auth !== null) { 
      $guzzleRequest->setAuth(
       $this->auth['user'], 
       $this->auth['password'], 
       $this->auth['type'] 
      ); 
     } 

     foreach ($this->getCookieJar()->allRawValues($request->getUri()) as $name => $value) { 
      $guzzleRequest->addCookie($name, $value); 
     } 

     if ('POST' == $request->getMethod() || 'PUT' == $request->getMethod()) { 
      $this->addPostFiles($guzzleRequest, $request->getFiles()); 
     } 

     $guzzleRequest->getParams()->set('redirect.disable', true); 
     $curlOptions = $guzzleRequest->getCurlOptions(); 

     if (!$curlOptions->hasKey(CURLOPT_TIMEOUT)) { 
      $curlOptions->set(CURLOPT_TIMEOUT, 30); 
     } 

     // Let BrowserKit handle redirects 
     try { 
      $response = $guzzleRequest->send(); 
     } catch (CurlException $e) { 
      if (!strpos($e->getMessage(), 'redirects')) { 
       throw $e; 
      } 

      $response = $e->getResponse(); 
     } catch (BadResponseException $e) { 
      $response = $e->getResponse(); 
     } 

     return $this->createResponse($response); 
    } 
} 

И попробуйте отправить запросить

$client = new \igancev\override\Client(); 
$proxy = 'http://149.56.85.17:8080'; // free proxy example 
$crawler = $client->request('GET', $request, ['proxy' => $proxy]); 
Смежные вопросы