Задать вопрос
@accountnujen

Как можно установить время неответа на CURLOPT_WRITEFUNCTION?

Есть ip, который постоянно (каждые 5 секунд), отвечает в виде потока. Это камера, которая информирует о новых видео. Функция writer поддерживает эти ответы, а handler обрабатывает ответ. Мне нужно, чтобы этот запрос выполнялся вечно, однако в какой-то момент, как, к примеру, сейчас, камера может перестать вообще отвечать. Свет выключили либо ещё что-то случилось, но сейчас я не могу обратиться по ip. В обычном состоянии камера постоянно отвечает:
--myboundary
Content-Type: text/plain
Content-Length: 9
Heartbeat

Что означает, что новых видео нет. На данных момент логах у меня зафиксировано последнее время и ответ, когда запустился writer и всё.

Как мне можно установить какой-нибудь ограничитель, чтобы он срабатывал в случае если ответа нет в течении условных 20 секунд? По сути, за это отвечает TIMEOUT, однако скрипт перестанет выполняться через 20 секунд, даже если ответы во writer были, поэтому сейчас установлен 0. Нужен другой ограничитель.

function writer($ch, $data) {
  handler($data);
  return strlen($data);
}

$ch = curl_init("$urlcam/cgi-bin/eventManager.cgi?action=attach&codes=[NewFile]&heartbeat=5");
curl_setopt_array($ch, [
        CURLOPT_USERPWD => "$user:$pass",
        CURLOPT_CONNECTTIMEOUT => 20,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_HTTPAUTH=>CURLAUTH_DIGEST,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_WRITEFUNCTION => 'writer'
    ]);

$result = curl_exec($ch);
curl_close($ch);
  • Вопрос задан
  • 76 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
У вас callback в виде функции writer скорее всего не срабатывает, в случае ошибки по curl.
Попробуйте проанализировать curl после посылки запроса:
$result = curl_exec($ch);
$info = curl_getinfo($ch);
if($info['http_code'] != 200)
{
  // по http не получили статус 200, значит, пишем репорт об этом
}
curl_close($ch);

Вариант 2:
$result = curl_exec($ch);
$curl_error_number = curl_errno($ch);
if($curl_error_number)
{
   $info = curl_getinfo($ch);
  // что-то случилось с соединением в целом, пишем репорт об этом со сведениями $info
}
curl_close($ch);
Ответ написан
Ваш ответ на вопрос

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

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