Obciążanie serwera - PHP, Ajax

0

Witam Was,

napisałem w miarę prosty skrypt na swoją strone, lecz po wejściu sporej liczby osób np. 100 strona zaczyna bardzo wolno się ładować. Możecie mi powiedzieć, czy poniższy kod może aż tak obciążać serwer?

Mam taki kodzik na stronie:

 <script type="text/javascript" language="javascript">
   $(document).ready(function() {
 
   function live(){
         $.ajax({
    url: './a_php.php',
    data: {data: 'info'},
    type: 'post',
    success: function(output) {
    $("#div").html(output);
 
    }
  });
 
          }
   live();
    setInterval(function(){live();}, 19800);
 
   });
   </script>

a to kod a_php.php

<?php
if( $_POST['data'] == 'info' && !empty($_POST['data'])){
 
	$twitch_live = false;
	$twitch_live_v = 0;
	$twitch_live_t = '';
	$twitch_live_g = '';
	//---------------------
	$gamecreds_live = false;
	$gamecreds_live_v = 0;
	$gamecreds_live_t = '';
	$gamecreds_live_g = '';
	//------------
	$wyswietl = '';
	$razem = 0;
					//pobieranie danych gamecreds
			$json_array = json_decode(file_get_contents('https://api.dailymotion.com/videos/?ids=kod&fields=title,genre,onair,tag,audience&limit=25'), true);
			   if($json_array['list'][0]['onair'] == true){
				$gamecreds_live = true;
				$gamecreds_live_v = $json_array['list'][0]['audience'];
				$gamecreds_live_t = $json_array['list'][0]['title'];
				$gamecreds_live_g = $json_array['list'][0]['tag'][1];
			   }
			   //pobieranie danych twitch
			$json_array2 = json_decode(file_get_contents('https://api.twitch.tv/kraken/streams/nick'), true);
 
			if ($json_array2['stream'] != NULL) {
				$twitch_live = true;
				$twitch_live_v = $json_array2['stream']['viewers'];
				$twitch_live_t = $json_array2['stream']['channel']['status'];
				$twitch_live_g = $json_array2['stream']['channel']['game'];
 
			} 
 
			if($twitch_live == true || $gamecreds_live == true){
			$razem = $twitch_live_v + $gamecreds_live_v;
					$wyswietl = '
					<div id="live-header-on">
					'.$razem.'</div>';
			}
 
 
			if($twitch_live == false && $gamecreds_live == false){
					$wyswietl = '
					<div id="live-header-off"></div>';
			}
 
			echo $wyswietl;
 
}
?>

Czy przyczyną obciążenia jest źle zrobiony kod, czy słaby serwer lub z jakimiś ograniczeniami?

0

Kod sam w sobie nie jest zły ale api ktore pobierasz za kazdym razem już tak, po pierzesz transferna swoim hoscie.
Jezeli dane z tych api nie są generowane dynamicznie to pobierz je np raz na 24h czy coś w tym stylu.

Sry za literowki ale pisze z komy

0

Nie mogę pobrać je raz na 24h, ponieważ jest to status live, sprawdza czy streamer jest online czy nie.

0

https://api.dailymotion.com/videos/?ids=kod&fields=title,genre,onair,tag,audience&limit=25
odpowiada ~100ms
https://api.twitch.tv/kraken/streams/nick
odpowiada ~1,1s
zauważ że pobiera te dane w takim średnim czasie każdy użytkownik (~1,2 [s] x 100 [userów] / 40 [wątków skryptu] = ~4s odpowiedzi)
z tym że jak masz ich 100 to ten czas znacznie się wydłuża a wątpię że twój hosting zezwala na działanie tylu skryptów jednocześnie dlatego masz te opóźnienia.
Sugeruję byś pomyślał nad obsługą tych API z poziomu przeglądarki użytkownika (w JS) by odciążyć swój serwis.

0

Dziękuję Ci bardzo za odpowiedź.

Znasz może jakiś sposób, którym będę mógł pobrać te dane z apli poprzez JQ?

0

Coś w ten deseń musisz zrobić.
http://funkcje.net/view/2/3292/index.html

0

Ale tym skryptem nie pobiorę danych z zewnętrznej strony, jaką jest api twitch'a, prawda?

0

No właśnie pobierasz normalnie te dane i je parsujesz
Są one w formacie JSON opisane jak tego używać jest tu http://www.w3schools.com/json/default.asp
i musisz ten kod przerobić tak żeby pracował pod JS i na żywo wprowadzał zmiany na stronie.

        $twitch_live = false;
        $twitch_live_v = 0;
        $twitch_live_t = '';
        $twitch_live_g = '';
        //---------------------
        $gamecreds_live = false;
        $gamecreds_live_v = 0;
        $gamecreds_live_t = '';
        $gamecreds_live_g = '';
        //------------
        $wyswietl = '';
        $razem = 0;
                                        //pobieranie danych gamecreds
                        $json_array = json_decode(file_get_contents('https://api.dailymotion.com/videos/?ids=kod&fields=title,genre,onair,tag,audience&limit=25'), true);
                           if($json_array['list'][0]['onair'] == true){
                                $gamecreds_live = true;
                                $gamecreds_live_v = $json_array['list'][0]['audience'];
                                $gamecreds_live_t = $json_array['list'][0]['title'];
                                $gamecreds_live_g = $json_array['list'][0]['tag'][1];
                           }
                           //pobieranie danych twitch
                        $json_array2 = json_decode(file_get_contents('https://api.twitch.tv/kraken/streams/nick'), true);
 
                        if ($json_array2['stream'] != NULL) {
                                $twitch_live = true;
                                $twitch_live_v = $json_array2['stream']['viewers'];
                                $twitch_live_t = $json_array2['stream']['channel']['status'];
                                $twitch_live_g = $json_array2['stream']['channel']['game'];
 
                        } 
 
                        if($twitch_live == true || $gamecreds_live == true){
                        $razem = $twitch_live_v + $gamecreds_live_v;
                                        $wyswietl = '
                                        <div id="live-header-on">
                                        '.$razem.'</div>';
                        }
 
 
                        if($twitch_live == false && $gamecreds_live == false){
                                        $wyswietl = '
                                        <div id="live-header-off"></div>';
                        }
 
                        echo $wyswietl;
0
hzmzp napisał(a):

No właśnie pobierasz normalnie te dane i je parsujesz

Zmieniłem link, na coś takiego. Nie pobiera mi tego pliku.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Ajax</title>
<script type="text/javascript">
var XMLHttpRequestObject = false;

if (window.XMLHttpRequest){
  XMLHttpRequestObject = new XMLHttpRequest();
}
else if (window.ActiveXObject){
  XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
}

function pobierzDane()
{
  if(XMLHttpRequestObject){
    var p = document.getElementById("pt1");
    XMLHttpRequestObject.open("GET", "http://patryk2.xaa.pl/dane.txt");
    XMLHttpRequestObject.onreadystatechange = function()
    {
      if (XMLHttpRequestObject.readyState == 4 && 
          XMLHttpRequestObject.status == 200) {
        p.innerHTML = XMLHttpRequestObject.responseText;
      }
    }
    XMLHttpRequestObject.send(null);
  }
}
</script>
</head>
<body>
<div>
<input type="button" value="Kliknij tu" onClick="pobierzDane();" />
</div>
<p id="pt1">
Ten tekst zostanie zmieniony...
</p>
</body>
</html>
0

Ja tego nie pojmuje :( Jak to może nie działać...

0

No mi nie działa. Działa dopiero wtedy, gdy wrzucę skrypt na ten sam serwer co dane.txt

0

Odpalałem na localhosćie i też mi nie działało :P

Pomyślałem o czymś takim, zeby jakiś skrypt co 20 sekund wykonywał zapytanie np. w php i zapisywał wynik do pliku txt. No i potem java by sobie to wybierała. Tylko nie wiem jak zrobić taki osobny skrypt, który będzie to zapisywał do pliku, bo w PHP raczej nie, ponieważ aby skrypt się odpalił, ktoś musi otworzyć stronę z tym skryptem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1