Как стать автором
Обновить

Комментарии 7

Поучаствую в написании статьи.
Лично я весь начинаю чесаться, когда вижу все эти кучи curlopt в количестве. И отдельно бесит, когда в примерах кода появляется горизонтальный скроллинг. Особенно если предполагается, что это у нас "более удобочитаемый код" ;-)


Поэтому после пары примеров с сырым курлом, я все-таки предлагаю написать небольшую функцию-хелпер, и дальше уже обращаться к ней


function curl($url, $data = [], $method = 'GET', $options = [])
{
    $default_options = [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HEADER => false,
        CURLOPT_SSL_VERIFYPEER => false,
    ];

    if ($method === 'GET') {
        $url .= (strpos($url, '?') === false) ? '?' : '&';
        $url .= http_build_query($data);
    } 
    if ($method === 'POST') {
        $options[CURLOPT_POSTFIELDS] = http_build_query($data);
    } 
    if ($method === 'JSON') {
        $options[CURLOPT_POSTFIELDS] = json_encode($data);
        $options[CURLOPT_HTTPHEADER][] = 'Content-Type:application/json';
    }

    $ch = curl_init($url);
    curl_setopt_array($ch, array_replace($default_options, $options));

    $result = curl_exec($ch);
    if ($result === false) {
        throw new ErrorException("Curl error: ".curl_error($ch), curl_errno($ch));
    }
    curl_close($ch);
    return $result;
}

Понятно что внутри ее можно облагородить, сделать CURLOPT_SSL_VERIFYPEER подключаемой, допилить обработку ошибок НТТР, добавить еще всякой красоты — но чисто функционально она свою задачу решает. Чтобы в итоге мы видели только нужный для понимания статьи код, а детали реализации не болтались у нас все время перед носом:


$token = "5340791844:AAEXXDduvInvQrlykV91USOQSevrPVU";
$url = "https://api.telegram.org/bot$token/sendMessage";

$getQuery = array(
    "chat_id"   => 1424625511,
    "text"      => "Новое сообщение из формы",
    "parse_mode" => "html"
);
echo curl($url, $getQuery);

Спасибо за участие в написание материала. Я добавил твой код в свою статью на сайте Prog-Time с ссылкой на профиль на Habr. Функция добавлена в 3 урок

Ну, в таком-то виде, "шоб було" добавлять не стоило. Это был пример того, как можно сократить количество кода при минимальном пороге обучения. А если уж просто упоминать, то не этот самопал, а нормальные библиотеки.

Если curl_exec вернёт false, не будет вызван curl_close. Не приведёт ли это к утечке ресурсов?

О, кстати, хороший вопрос. Теоретически может, но по факту скорее всего не приведет. Но всё равно получилось неаккуратненько. Писал на коленке, причем так старался всё учесть, а тут такая мелочь обидная. Всего-то перенести парой строчек выше.


К счастью, как я тут узнал из коммента под другой статьёй, начиная с 8 версии curl_close() — уже не нужна. Курл сам все закроет по окончании работы функции.

согласен. Или просто подключить готовую либу, например guzzle

Верно, и в реальном коде только так и надо делать. Но поскольку статья обучающая, то как раз стоит показать хороший пример того, как можно убрать повторяющийся код, поместив его в функцию. Но, к сожалению, многие начинающие писатели туториалов не умеют пользоваться даже базовыми функциями языка.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории