Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pytanie dot. fsockopen i jej podobnych
Forum PHP.pl > Forum > Przedszkole
Wolny_Login
Jako, że jest to mój pierwszy post (i mam nadzieję, że nie ostatni) na tym forum to wypada mi się przywitać - Dobrywieczór biggrin.gif
Niestety, ale ten pierwszy post będzie postem z prośbą o pomoc / radę.
Aktualnie razem z kolegą 'pracujemy' nad stworzeniem listy serwerów do jednej z gier MP (on wygląd, ja kod). Wszystko byłoby pięknie gdyby nie fakt, że moja wiedza o PHP jest na bardzo średnim poziomie (uczę się; wiem, że dzwoni ale nie wiem w którym kościele). Niby wszystko działa, ale jest pewien niesmak. Czołowa strona tego projektu czyli ta, która ma wyświetlać listę serwerów działa strasznie opornie tzn. raz ładuje się szybko, a innym następnym razem potrzebuje 10s albo i więcej. Oczywiście nie wróży to dobrze komfortowi używania tej strony. Podejrzewam, że ma to związek z łączeniem się z danym serwerem bo nawet przy wysyłaniu zwykłego pakietu bez jakiejkolwiek obróbki tego co zostanie zwrócone, strona ma tendencje do długiego odświeżania.
Aktualnie używam funkcji 'fsockopen' do nawiązania połączenia. Próbowałem również użyć 'stream_socket_client' jednak nie widzę żadnej różnicy w działaniu strony.
W manualu PHP znalazłem funkcje 'stream_set_blocking' oraz 'stream_select'. Z tego co zrozumiałem to pierwsza z wymienionych ustawiona na parametr 'false' powinna spowodować, że kod pobierający dane o serwerach nie będzie się zatrzymywał oczekując na dane z serwera, a druga powinna 'nasłuchiwać' odpowiedzi, dobrze myślę? Jeśli tak to czy ktoś mógłby mnie naprowadzić na to w jaki sposób poprawnie użyc tych funkcji? Zwłaszcza, jak odebrać dane bo niestety z tym sobie nie radzę, a to co zrozumiałem z manuala dla mnie nie wystarcza.
I jeszcze jedno pytanie - czy to są w ogóle dobre funkcje, które w przypadku właśnie takiej strony powinny zostać użyte?
abort
Nie wiem, co dokładnie jest sprawdzanie przy łączeniu się z serwerem, ale mam dla Ciebie propozycję do rozważenia:
Spróbuj kod odpowiedzialny za generowanie listy serwerów wyrzucić do osobnego pliku, który to plik wywoływałbyś z crona (a jeśli cron, to częściej niż minutę się nie da) i po zebraniu statystyk wszystkich sewerów generuj jakiś metafile i dołączaj nawet wprost przez include do strony.

Będzie błyskawicznie. Pytanie, czy chcesz/możesz sobie pozwolić na podobne rozwiązanie, bo jeśli wyniki muszą być w realtime, to niestety musisz o takim rozwiązaniu zapomnieć.
Wolny_Login
Nie, wyniki nie muszą być realtime i takie rozwiązanie było by wystarczające, a nawet dobre, bo później można by było dodać sortowania i filtry. Jednak nie wiem jak by to było z tym 'lagiem'. Z tego co sprawdzałem, przy 100 polaczeniach i przesłaniu jakiegoś pakietu czas realizacji był ok 20 sekund.

Przykładowy kod na połączenie i wysłanie pakietu do serwera wyglądał w moim przypadku tak:
Kod
$sIP = '78.129.221.58';
$sPort = '7784';
$srv_socket = fsockopen('udp://'.$sIP, $sPort, $errNO, $errSTR, 30); // serwer 100% aktywny wiec darowalem sobie wszelkie sprawdzanie czegokolwiek

//kod nizej jest wzorowany na tym umieszczonym w "Query mechanism" multiplayera                         
$sIP = explode('.', $sIP);
$packet = "SAMP";
$packet .= chr($sIP[0]);
$packet .= chr($sIP[1]);
$packet .= chr($sIP[2]);
$packet .= chr($sIP[3]);  
                           
$packet .= chr($sPort & 0xFF);                                                
$packet .= chr($sPort >> 8 & 0xFF);     
                      
$packet .= 'i';     
                      
fwrite($srv_socket, $packet);
$read = fread($srv_socket, 4096);    
if(!empty($read))
{
/* Wyswietlanie wyniku itp. usuniete przy testach        
   Ogolnie odpowiedz miala zawierac podstawowe informacje o serwerze takie jak nazwa / czy uzywa hasla / sloty / ilosc graczy itp.
*/                                
}     
fclose($srv_socket);

Kod wyżej pisałem teraz, to nie jest dokładnie ten który testowałem jednak tamten był b.podobny do tego.

Edit: Zrobiłem tak jak zasugerowałeś i jak narazie działa świetnie smile.gif Dziękuje Ci bardzo za podpowiedź.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.