root / icecast tips&tricks / icecast2 - собираем статистику |
|
Когда есть динамическая статистика по icecast - это хорошо. Но ещё лучше будет её собрать и обработать. Например в такую таблицу: CREATE TABLE `new_streams_stat` ( `ss_id` int(10) unsigned NOT NULL auto_increment, `ss_stream` varchar(255) character set utf8 NOT NULL, `ss_today` int(10) unsigned NOT NULL default '0', `ss_total` int(10) unsigned NOT NULL default '0', PRIMARY KEY (`ss_id`) ) ENGINE=MyISAM ; И скриптом по крону собирать туда информацию о слушателях: <?php include_once '/path/to/db/script.php'; header("Content-Type: text/html; charset=UTF-8"); $scip = '*****.********.ru'; // Сервер, на котором висит Icecast $scport = 8000; // Порт $scfp = fsockopen($scip, $scport, $errno, $errstr, 10); if (!$scfp) die('Socket error: ' . $errno . ' - ' . $errstr); fputs($scfp,"GET /status3.xsl HTTP/1.0\r\n User-Agent: Icecast Song Status (Mozilla Compatible)\r\n\r\n"); $info = ''; while(!feof($scfp)) { $listeners = fgets($scfp, 1000); // Вот то, что нам надо //вывод количества слушателей $info .= trim($listeners); } fclose($scfp); $info = explode('!!', $info); unset($info[0]); foreach ($info as $value) { $exploded = explode('%%', $value); $new_info[$exploded[0]] = $exploded; } $listeners = 0; foreach ($new_info as $key => $value) { $listeners += $value[1]; if ($value[1] > 0) { $streams[$value[0]] = $value[1]; $query_add[] = "'" . $value[0] . "'"; } } $streams_list = implode(', ', $query_add); $query_add = ''; foreach ($streams as $key => $value) { $query_add[] = "('$key', $value)"; } $query_add = implode(', ', $query_add); $query = "SELECT * FROM `new_streams_stat` WHERE `ss_stream` IN ($streams_list)"; $db = new DB(); $result = $db->db_query($query); if (mysql_num_rows($result) == 0) { // insert new values $query = "INSERT INTO `new_streams_stat` (`ss_stream`, `ss_today`) VALUES $query_add"; $db->db_query($query); } else { // select streams which in list $query = "SELECT * FROM `new_streams_stat` WHERE ss_stream IN ($streams_list)"; $result = $db->db_query($query); $db_stat = array(); while ($row = mysql_fetch_assoc($result)) { // check maximum if ($row['ss_today'] < $streams[$row['ss_stream']]) $row['ss_today'] = $streams[$row['ss_stream']]; if ($row['ss_total'] < $streams[$row['ss_stream']]) $row['ss_total'] = $streams[$row['ss_stream']]; // and make db_stat array $db_stat[$row['ss_stream']] = array($row['ss_today'], $row['ss_total']); // and unset it from streams unset($streams[$row['ss_stream']]); } foreach ($db_stat as $key => $value) $db_stat_imploded[] = "('$key', " . implode(', ', $value) . ')'; $db_stat_imploded = implode(', ', $db_stat_imploded); foreach ($streams as $key => $value) $streams_imploded[] = "('$key', $value, $value)"; if (!empty($streams_imploded)) $streams_imploded = implode(', ', $streams_imploded); else $streams_imploded = ''; $query = array(); $query[] = "CREATE TEMPORARY TABLE `tmp_radio_stat` (`stream` VARCHAR(255), `today` INT, `total` INT)"; $query[] = 'TRUNCATE `tmp_radio_stat`'; $query[] = "INSERT INTO `tmp_radio_stat` (`stream`, `today`, `total`) VALUES $db_stat_imploded"; $query[] = "UPDATE `new_streams_stat`, `tmp_radio_stat` SET `new_streams_stat`.`ss_today`=`tmp_radio_stat`.`today`, `new_streams_stat`.`ss_total`=`tmp_radio_stat`.`total` WHERE `new_streams_stat`.`ss_stream`=`tmp_radio_stat`.`stream`"; if ($streams_imploded != '') $query[] = "INSERT INTO `new_streams_stat` (`ss_stream`, `ss_today`, `ss_total`) VALUES $streams_imploded"; foreach ($query as $value) $db->db_query($value); } @mysql_close($db->db_link); ?> Способ с временной таблицей подсмотрен тут. Есть ещё скрипт по очищению значений `today` дабы статистика по дню сегодняшнему была верной: <?php include_once '/path/to/db/script.php'; $query = 'UPDATE `new_streams_stat` SET `ss_today` = 0'; $db = new DB(); $db->db_query($query); ?> И два правила в crontab чтобы оно срабатывало тогда когда это действительно необходимо: * * * * * /full/path/to/php /full/path/to/scripts/cli/icecast_stat_cli.php 0 0 * * * /full/path/to/php /full/path/to/scripts/cli/icecast_field_clear.php Первое правило срабатывает раз в минуту, а второе - в полночь каждого дня. |