progress_man
@progress_man
php – it's my life

Почему может возникать ошибка curl_setopt(): supplied resource is not a valid cURL handle resource?

Есть код:
class CurlAny extends BaseObject
{
    protected $_ch;
    
    protected $_timeout = 10;
    
    public function __construct(array $config = [])
    {
        $this->_ch = curl_init();

        parent::__construct($config);
    }
    
    public function send()
    {
        $this->_query('test.com', ['key' => 'value']);
    }
    
    private function _query(string $url, $data = false)
    {
        if (!$this->_ch) {
            throw new Exception('Empty $_ch in MtargetOffers.');
        }

        curl_setopt($this->_ch, CURLOPT_URL, $url);
        curl_setopt($this->_ch, CURLOPT_HEADER, false);
        curl_setopt($this->_ch, CURLOPT_TIMEOUT, $this->_timeout);
        curl_setopt($this->_ch, CURLOPT_NOBODY, 0);
        curl_setopt($this->_ch, CURLOPT_RETURNTRANSFER, true);

        if ($data) {
            curl_setopt($this->_ch, CURLOPT_POST, true);
            curl_setopt($this->_ch, CURLOPT_HTTPHEADER, [
                'Expect:',
            ]);
            curl_setopt($this->_ch, CURLOPT_POSTFIELDS, http_build_query($data));
        } else {
            throw new Exception('Пустые данные на нашей стороне', 500);
        }

        $page = curl_exec($this->_ch);
        $info = curl_getinfo($this->_ch);
        $err = curl_errno($this->_ch);
        $errmsg = curl_error($this->_ch);

        if ($this->_ch) {
            curl_close($this->_ch);
        }
        
        return $page;
    }
}

Код немного упрощен, но передано самое важное. Используется Yii2 на PHP 7.3

Время от времени отлавливаю такую ошибку
curl_setopt(): supplied resource is not a valid cURL handle resource

В чем может быть причина? Разве не достаточно проверки if (!$this->_ch) {...}?

P.S. На ~10000 запросов (с полной инициализацией данного объекта для каждого запроса) приходится 2-3 шт. указанной ошибки.
  • Вопрос задан
  • 3636 просмотров
Решения вопроса 3
progress_man
@progress_man Автор вопроса
php – it's my life
В ходе нудной трассировки выяснилось, что (по неизвестным пока причинам) не создавался curl дескриптор
(CurlAny::$_ch) функцией curl_init() при создании нового объекта CurlAny
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Вангую что ошибка вываливается когда вы делаете 2 запроса используя 1 созданный объект ) Я бы на вашем месте не выносил инит в конструктор )

Разве не достаточно проверки if (!$this->_ch) {...}

там может быть например 1, что удовлетворяет условию, но нифига не ресурс. ЕМНИП is_resource будет как минимум правильнее. Но смысла особого в этой проверке нет.
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
Сложно сказать с не воспроизводимым примером кода. Впрочем легко заметить, что сейчас ваш метод _query строго одноразовый. На повторный запуск этого метода (в контексте одного объекта) вы получите такую ошибку. Потому что curl_close закрывает ресурс, но переменная остаётся типа ресурс и потому не отвечает условию !$this->_ch
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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