Код модуля который выводит на страницы сайта информацию.
<script>
function showContent(link) {
var cont = document.getElementById('contentBody');
var loading = document.getElementById('loading');
cont.innerHTML = loading.innerHTML;
var http = createRequestObject();
if( http )
{
http.open('get', link);
http.onreadystatechange = function ()
{
if(http.readyState == 4)
{
cont.innerHTML = http.responseText;
}
}
http.send(null);
}
else
{
document.location = link;
}
}
// создание ajax объекта
function createRequestObject()
{
try { return new XMLHttpRequest() }
catch(e)
{
try { return new ActiveXObject('Msxml2.XMLHTTP') }
catch(e)
{
try { return new ActiveXObject('Microsoft.XMLHTTP') }
catch(e) { return null; }
}
}
}
</script>
<div style="padding-left:32px; width:580px; " id="contentBody">
</div>
<div style="padding-left:32px; width:580px; display: none" id="loading">
<b>Сейчас в эфире:</b> <img src="/js/loading.gif">
</div>
<script>
showContent('/js/icecast.php');
function sec() {
showContent('/js/icecast.php')
}
setInterval(sec, 30000) // использовать функцию
</script>
Вот что находится в icecast.php
<?php
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
header("Pragma: no-cache");
// Don't allow direct acces to the file
//defined( '_JEXEC' ) or die( 'Direct Access to this location is not allowed.' );
// Настройки модуля
error_reporting(0);
$servername = '*******';
$serverhost = 'www.*******.ru';
$serverport = '82';
$serverpoint = 'radio13-128-mp3';
$serverpointtip = 'm3u';
$bitrate = '128';
$fake = '500';
$nowork = 'Информация временно недоступна';
$moduleclass_sfx = '0';
//$baseurl = JURI::base();
$ip = "$serverhost";
$port = "$serverport";
$ice2_station = "$servername";
$fp = fsockopen("$ip", $port, $errno, $errstr, 30); //open connection
if(!$fp) {
$success=2; //set if no connection
echo'
<div><b>Сейчас в эфире: '.$nowork.'</b></div>'; //Не работает, если вещательный сервер выключен вообще
}
if($success!=2){ //if connection
fputs($fp,"GET /status2.xsl?mount=/$serverpoint HTTP/1.0\r\nUser-Agent: Icecast2 XSL Parser (Mozilla Compatible)\r\n\r\n"); //get status2.xsl
while(!feof($fp)) {
$page .= fgets($fp, 1000);
}
fclose($fp); //close connection
$page = ereg_replace(".*<pre>", "", $page); //extract data
$page = ereg_replace("</pre>.*", ",", $page); //extract data
$numbers = explode(",",$page); //начала проверки пунктов
$mount = $numbers[0];
$connections = $numbers[1];
$stream_n = $numbers[2];
$listeners = $numbers[3];
$desc = $numbers[4];
$cur_song = $numbers[5];
$str_url = $numbers[6];
$client_info = $numbers[7];
$test1 = $numbers[8]; //Не понял что это
$mount = $numbers[11];
$connections = $numbers[12];
$station =$numbers[13];
$listeners = $numbers[14];
$description = $numbers[15];
$cur_song = $numbers[16];
$www_url = $numbers[17];
$listfake = $listeners + $fake;
if (strlen($mount)<2) echo '
<div><b>Сейчас в эфире: Информация временно недоступна</b>
</div>'; // не работает, но сервер запущен
//Здесь редактировать, что отображать какая статистика
else echo '
<div>
<b>Сейчас в эфире: '.$cur_song.'</b>
</div>
';
}
?>
Данный скрипт находится на Joomla 1.5 движке.
Проблема в том, что очень часто идет обработка. если порядка 20 обработок в секунду, то сайт ложится под 500.
Что делать помогите плиз.
Спустя 32 минуты, 31 секунда (26.05.2010 - 12:40) FatCat написал(а):
Цитата (bugsmafia @ 26.05.2010 - 13:08) |
если порядка 20 обработок в секунду, то |
... то выполняется инструкция из конфигуратора апача:
MaxClients 15
Значит пятеро идут по инструкции:
Timeout 300
Если и через 300 милисекунд у апача нет свободных ресурсов - апач отдает 50х-ю страницу.
Работайте над оптимизацией кода или (лучше) выкиньте в помойку тяжеловесную джумлу, чтобы генерация страницы происходила быстрее.
Или берите сервер помощнее, чтобы лимиты можно было побольше выставить. 15 одновременных и 300 таймлимита - это дефолтные значения для большинства шаред-хостингов.
Спустя 1 час, 7 минут, 36 секунд (26.05.2010 - 13:48) bugsmafia написал(а):
FatCat
Да обработка этого запроса минимальная. Она аджаксом подгружается (сейчас) тобишь заного выполняется этот скрипт на хосте.
Да обработка этого запроса минимальная. Она аджаксом подгружается (сейчас) тобишь заного выполняется этот скрипт на хосте.
Спустя 6 минут, 12 секунд (26.05.2010 - 13:54) Семён написал(а):
Может сервер вешается изза постоянного открытия сокетов? 
И не проще-ли кешировать результат? Зачем его каждый раз получать снова и снова.

И не проще-ли кешировать результат? Зачем его каждый раз получать снова и снова.
Спустя 15 минут, 31 секунда (26.05.2010 - 14:09) bugsmafia написал(а):
Семён
Подскажите как это сделать.
Подскажите как это сделать.
Спустя 34 минуты, 20 секунд (26.05.2010 - 14:44) Семён написал(а):
Теоретически:
После получения информации посредством fopen / curl (без разницы), ты парсишь это информацию получаешь нужные переменные с информацией, приводишь их к нужному виду и т.д. Теперь необходимо сделать так, чтобы информация не загружалась каждый раз снова и снова, ведь за 1-2 секунды не произойдёт смена 10 треков верно?
Здесь стоит 2-ва выбора:
1) Записывать информацию в файл и обзывать его маске даты / времени.
2) Записывать в базу данных - указывать время посл. получения, если кеш неактуален загружать новую инфу и выдавать её пользователю:
Минусы БД: тратится время на подключение (но не существенно)
Плюсы БД: можешь вести историю парсинга вещания.
Тем самым при 1000 запросах в 1-2 секунды у тебя не будет открываться каждый раз сокет, а просто будет получаться из 1000 - 1 раз, а остальным 999 будет выдаваться кеш.
Практическое решение: $
После получения информации посредством fopen / curl (без разницы), ты парсишь это информацию получаешь нужные переменные с информацией, приводишь их к нужному виду и т.д. Теперь необходимо сделать так, чтобы информация не загружалась каждый раз снова и снова, ведь за 1-2 секунды не произойдёт смена 10 треков верно?
Здесь стоит 2-ва выбора:
1) Записывать информацию в файл и обзывать его маске даты / времени.
2) Записывать в базу данных - указывать время посл. получения, если кеш неактуален загружать новую инфу и выдавать её пользователю:
Минусы БД: тратится время на подключение (но не существенно)
Плюсы БД: можешь вести историю парсинга вещания.
Тем самым при 1000 запросах в 1-2 секунды у тебя не будет открываться каждый раз сокет, а просто будет получаться из 1000 - 1 раз, а остальным 999 будет выдаваться кеш.
Практическое решение: $