<?php
// пример вызова
// http://kvzrm.ru/cab/print/reports_itog1.html

class c_page_sse
{
  function  show()
  { $group=$_GET['group'] ;
    if (!$group) $group=execSQL_value('select max(pkey) from obj_site_account where clss=206 and enabled=1') ;
    //LOGS()->reg_file_log('SSE '.getmypid().' - start','') ;

    // Set necessary headers
    header("Content-Type: text/event-stream");
    header("Cache-Control: no-cache");
    header("Connection: keep-alive");

    //LOGS()->reg_log('SSE','SSE start to IP '.IP) ;

    // If connection is closed and then reopened then browser sends last event id that it received.
    // So server can continue sending data from that even and not to send all events again.
    // Note that it is incremented by one, because we have to send next value (after last id).
    // HTTP header value is Last-Event-ID and should be accessible by HTTP_LAST_EVENT_ID field.
    $lastId = $_SERVER["HTTP_LAST_EVENT_ID"];   // тут будет передаваться ID последнего события при разрыве соединения
    if (!$lastId) $lastId=$_GET['from_id'] ;    // в GET передается ID последнего события при перезагруке окна монитора
    if (isset($lastId) && !empty($lastId) && is_numeric($lastId)) $lastId = intval($lastId);
    else $lastId = 0;

    $start_time=time() ; // фиксируем время старта потока

    // Using while server keeps connection open and thus we have only one request.
    // If connection is closed browser will reconnect and will send last event Id.
    $last_send_mess_id=$lastId ;
    while (true)
    {   $last_monitor_mess_id=LOGS()->get_last_monitor_mess_id($group) ;
        if ($last_monitor_mess_id>$last_send_mess_id)
        { $recs=LOGS()->get_monitor_mess($group,$last_send_mess_id) ;
          if (_sizeof($recs)) foreach($recs as $rec)
          {  $last_send_mess_id=$rec['pkey'] ;
              //array_unshift($rec['_data'],getmypid()) ;
             $rec['_data']['session_id']=session_id() ;
             $rec['_data']['last_monitor_mess_id']=$last_monitor_mess_id ;
             $rec['_data']['group']=$group ;
              //$rec['_data']=array_merge($debug,$debug['_data'])
             $this->sendMessage($rec['pkey'], $rec['_data']);
            //LOGS()->reg_log('SSE','SSE send mess to IP '.IP) ;
          }
        }

        // максимальное время жизни потока - 1 мин
        // сделано для предотвращения накапливания потоков при частой перезагрузке окна мониторинга
        //if ($last_monitor_mess_id % 10 == 0) // для предотвращения бесконечного цикла
        if (time()-$start_time>60) // для предотвращения бесконечного цикла
        { //LOGS()->reg_file_log('SSE '.getmypid().' - stop','') ;
          //header("Content-Type: text/html");
          _exit();

        }

        // Sleep some 1 seconds
        sleep(2);
    }
    //LOGS()->reg_log('SSE','SSE end to IP '.IP) ;
  }

  function check_monitor_mess()
  {

  }

  // Function to send data in format "ticket:price".
  function sendMessage($id, $data)
    {   $text_json=json_encode($data,JSON_UNESCAPED_UNICODE) ;
        echo "id: $id\n";
        echo "data: $text_json\n\n";
        ob_flush();
        flush();
    }

}
?>
