@DjimiDjimi

Почему не обнуляется прокси в CURL классе PHP?

Есть класс Curl (точнее обертка для него), под спойлером:
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);
	}
}


пытаюсь провести чек прокси на валидность:
//  Проверка валидности 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');


почему не обнуляется прокси? То есть не получается открыть страницу.
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
ice2038
@ice2038
На этом месте должна вылетать ошибка. Параметр $proxy обязательный, либо передавать его как null,
Curl::setCurl()->setProxy(null);
либо установить по-умолчанию как null.
//	Подключение прокси (HTTPS/SOCKS5)
  public function setProxy($proxy = null, $proxy_type = null)
  {
    $this->proxy = $proxy;
    $this->proxy_type = $proxy_type;
  }

Также можешь сделать метод класса с очисткой свойства класса $proxy
public function clearProxy()
{
    $this->proxy = null;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы