D
D
DjimiDjimi2018-03-20 08:10:03
PHP
DjimiDjimi, 2018-03-20 08:10:03

Why is the proxy not reset in the CURL PHP class?

There is a Curl class (more precisely, a wrapper for it), under the spoiler:

spoiler
<?php

/**
* 
*    Файл-обертка для библиотеки cURL
*
*/

class Curl 
{

  protected static $curl;  //экземпляр объекта

  const FOLLOWLOCATION = true;
  const RETURNTRANSFER = true;
  const AUTOREFERER = true;
  const TIMEOUT = 30;
  const CONNECT_TIME = 30;

  private $ch;
  private $url = null;	
  private $httpheaders = [];
  private $postparams = null;
  private $proxy_type = null;
  private $proxy = null;

  public $cookies;
  public $user_agent;
  
  private function __construct() 
  {
    $this->ch = curl_init();
  }

  //	Запрос экземпляра класса	
  public static function setCurl()
  {
        if (is_null(self::$curl)) { 
            self::$curl = new self;  //	Создаем экземпляр класса если он не создан
        }
        return self::$curl;
    }	

  //	Функция POST/GET - запросов
  public function post($url, $postparams = []) 
  {
    $this->url = $url;	
    if (isset($postparams)) {	
      $this->postparams = $postparams;
    }		
    return $this->exec();
  }
  
  //	Заголовок запроса
  public function addHttpheaders($headers)
  {
    foreach ($headers as $name => $value) {
      $this->httpheaders[$name] = $name . ': ' . $value;
    }
  }

  //	Присваемваем USER-AGENT
  public function setUserAgent($user_agent = null)
  {
    $this->user_agent = $user_agent;
  }

  //	Подключение прокси (HTTPS/SOCKS5)
  public function setProxy($proxy, $proxy_type = null)
  {
    $this->proxy = $proxy;
    $this->proxy_type = $proxy_type;
  }

  //	Удаление cookie файла
  public function clearCookies()
  {
    $this->cookies = null;
  }

  private function exec()
  {
    curl_setopt($this->ch, CURLOPT_URL, $this->url);
    curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION , self::FOLLOWLOCATION);
    curl_setopt($this->ch, CURLOPT_AUTOREFERER, self::AUTOREFERER);
    curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, self::RETURNTRANSFER);	
    curl_setopt($this->ch, CURLOPT_HEADER, true);
    
    if ($this->postparams)
      curl_setopt($this->ch, CURLOPT_POSTFIELDS, $this->postparams);
    
    if (count($this->httpheaders))
      curl_setopt($this->ch, CURLOPT_HTTPHEADER, $this->httpheaders);

    if ($this->proxy)
      curl_setopt($this->ch, CURLOPT_PROXY, $this->proxy);
      
    if ($this->proxy_type == 'socks5')
      curl_setopt($this->ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);

    curl_setopt($this->ch, CURLOPT_COOKIEFILE, $this->cookies);
    curl_setopt($this->ch, CURLOPT_TIMEOUT, self::TIMEOUT);
    curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, self::CONNECT_TIME);
    $response = curl_exec($this->ch);
    $response = substr($response, curl_getinfo($this->ch, CURLINFO_HEADER_SIZE));
    $this->cookies = implode("\n", curl_getinfo($this->ch, CURLINFO_COOKIELIST));
        
    $this->postparams = null;

    return $response;
  }

  public function __destruct()
  {
    curl_close($this->ch);
  }
}

I'm trying to check the proxy for validity:
//  Проверка валидности PROXY
function checkProxy($proxy = null)
{  
    if (!empty($proxy)) {
        Curl::setCurl()->addHttpheaders([
                "User-Agent" => Curl::setCurl()->user_agent
            ]);
        Curl::setCurl()->setProxy($proxy);
        $response = Curl::setCurl()->post('https://vk.com');
        if (preg_match('/lg_h/', $response)) {
            return true;
        }
    }
}

Curl::setCurl()->setUserAgent('Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'); 
if (!checkProxy('190.190.2.2:8080')) {
    echo "Не рабочая прокси!";
}
Curl::setCurl()->setProxy(); //<- тут должно обнулять прокси но не обнуляет
echo Curl::setCurl()->post('https://vk.com');

why is the proxy not reset? That is, it is not possible to open the page.

Answer the question

In order to leave comments, you need to log in

1 answer(s)
I
ice2038, 2018-03-20
@DjimiDjimi

This is where the error should be thrown. The $proxy parameter is required, either pass it as null or set it to null by default.

//	Подключение прокси (HTTPS/SOCKS5)
  public function setProxy($proxy = null, $proxy_type = null)
  {
    $this->proxy = $proxy;
    $this->proxy_type = $proxy_type;
  }

You can also make a class method with the $proxy class property cleared
public function clearProxy()
{
    $this->proxy = null;
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question