Комментарии 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
Создание Telegram бота на PHP #3: примеры отправки сообщений с кнопками в Telegram