[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Уменьшение запросов на php
bugsmafia
У меня проблема заключается в том, что когда несколько пользователей одновременно находятся на сайте, код PHP который выводит название композиции выполняется очень часто... как это исправить не знаю.

Код модуля который выводит на страницы сайта информацию.

<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) Семён написал(а):
Может сервер вешается изза постоянного открытия сокетов? tongue.gif
И не проще-ли кешировать результат? Зачем его каждый раз получать снова и снова.

Спустя 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 будет выдаваться кеш.

Практическое решение: $
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.