[TS3 PHP Framework] Łączenie z serwerem oraz bloki try/catch

Tagi: #<Tag:0x00007f3a90da8dc0> #<Tag:0x00007f3a90da8cf8>

Łączymy się z serwerem TeamSpeak 3 za pomocą TeamSpeak 3 Server Query

W poprzednik poradniku [TS3 PHP Framework] Tworzenie konfiguracji pokazałem Wam, jak w prosty sposób stworzyć plik konfiguracyjny naszych skryptów opartych o framework.

Następnym krokiem będzie połączenie się z naszym serwerem i poznanie podstaw obsługi obiektowego języka PHP.

Połączmy się więc!

// Ładujemy nasz framework
require_once("libraries/TeamSpeak3/TeamSpeak3.php");
// Ładujemy naszą konfigurację
require("ts_config.php");

Początkowy kod wyglądałby tak:

$ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");

My uprościmy go korzystając z utworzonej przez nas wcześniej konfiguracji

// $ts - tworzymy obiekt naszego wirtualnego serwera, a korzystając z wcześniejszej konfiguracji wpisujemy odpowiednie stałe w odpowiednie miejsca
$ts = TeamSpeak3::factory("serverquery://".ts_query_username.":".ts_query_password."@".ts_query_ip.":".ts_query_port."/?server_port=".ts_server_port);

Wartości dotyczące użytkownika, hasła, IP, portu Server Query, oraz portu serwera zastąpiliśmy odpowiednio stałymi - funkcja define() - ts_query_username, ts_query_password, ts_query_ip, ts_query_port, ts_server_port.

W całości połączenie z serwerem uzyskami tworząc plik connect.php o takiej zawartości.

require_once("libraries/TeamSpeak3/TeamSpeak3.php");
require("ts_config.php");

$ts = TeamSpeak3::factory("serverquery://".ts_query_username.":".ts_query_password."@".ts_query_ip.":".ts_query_port."/?server_port=".ts_server_port);

Od teraz możemy wysyłać komendy do naszego serwera.

W kolejnych poradnikach dowiemy się w jaki sposób pracować nad listą osób na serwerze oraz wykonywać najprostsze polecenia na użytkownikach.

Błędy w obiektowym programowaniu PHP

Pracując na obiektach PHP (inne języki również) daje nam możliwość wyświetlania błędów w przypadku błędnego użycia klas czy parametrów, ich rodzaju, miejscu powstania (dokładny numer linii) w sposób bardziej dokładny, ze względu na stworzenie odpowiednich reakcji na konkretne pomyłki programisty.
Jak podaje nam Wikipedia:

Błędy nie muszą wynikać wyłącznie z nieuwagi programisty. Może je powodować użytkownik poprzez dziwne działania, niewłaściwą konfigurację lub nawet problemy systemowe.
Obsługa błędów jest to jeden z istotniejszych elementów współczesnych aplikacji.
Początkujący programiści często ją bagatelizują, kompletnie nie przejmując się tym, że przy złych ustawieniach na ekranie przeglądarki pojawia się 500 ostrzeżeń PHP, albo załatwiając sprawę najprostszą komendą die().
Wykorzystują to hakerzy, dla których ścieżki dostępu, nazwy plików i numery linii wyświetlane przy komunikatach PHP to znakomite źródło informacji o serwerze, skrypcie oraz umiejętnościach programisty.

Przyjrzyjmy się zatem dwóm blokom, z których będziemy często korzystać: try oraz catch. Jest również finally, jednak na tym etapie poradnika nie będzie nam potrzebny.


Załóżmy, że podczas łączenia się z serwerem wystąpi pewien problem. Np. podamy błędne hasło, serwer jest wyłączony, zostaniemy zbanowani itp. Jak się o tym dowiedzieć? To proste - używając bloków try oraz catch.

Połączmy się z naszym serwerem jeszcze raz, ale tym razem używając złego hasła:

// włączmy raportowanie błędów
error_reporting(E_ALL);
ini_set('display_errors', 1);

// połączmy się ze złym hasłem
$ts = TeamSpeak3::factory("serverquery://".ts_query_username.":bylejakiehaslo@".ts_query_ip.":".ts_query_port."/?server_port=".ts_server_port);

Skrypt zwróci nam taki błąd:

Fatal error:  Uncaught exception 'TeamSpeak3_Transport_Exception' with message 'Connection refused' in /lvlup/libraries/TeamSpeak3/Transport/TCP.php:54
Stack trace:
#0 /lvlup/libraries/TeamSpeak3/Transport/TCP.php(108): TeamSpeak3_Transport_TCP->connect()
#1 /lvlup/libraries/TeamSpeak3/Adapter/ServerQuery.php(76): TeamSpeak3_Transport_TCP->readLine()
#2 /lvlup/libraries/TeamSpeak3/Adapter/Abstract.php(60): TeamSpeak3_Adapter_ServerQuery->syn()
#3 /lvlup/libraries/TeamSpeak3/TeamSpeak3.php(320): TeamSpeak3_Adapter_Abstract->__construct(Array)
#4 /lvlup/lvlup.php(12): TeamSpeak3::factory('serverquery://s...')
#5 {main}
  thrown in /lvlup/libraries/TeamSpeak3/Transport/TCP.php on line 54

Bład krytyczny! Uncaught exception!


Spróbujmy z blokami try i catch

// włączmy raportowanie błędów
error_reporting(E_ALL);
ini_set('display_errors', 1);

// połączmy się ze złym hasłem oraz blokiem try i catch
try{
	$ts = TeamSpeak3::factory("serverquery://".ts_query_username.":bylejakiehaslo@".ts_query_ip.":".ts_query_port."/?server_port=".ts_server_port);
}
catch(Exception $e){
	// przypiszmy błąd do $e 
	// wyświetlmy kod błędu oraz jego treść
	echo 'Kod błędu: <b>'.$e->getCode().'</b> oraz treść błędu: <b>'.$e->getMessage().'</b>';
}

Skrypt zwróci:

Kod błędu: 111 oraz treść błędu: Connection refused

Na podstawie kodu błędu oraz jego treści możemy zdiagnozować problem, który wystąpił. Będzie to tyczyć się większości operacji, jakie będziemy chcieli dokonać już po zalogowaniu na nasz serwer. W tym wypadku podaliśmy błędne hasło i serwer odrzucił nasze połączenie - jak możemy się domyślić z podania błędnych danych logowania.

Jak czytamy na https://pl.wikibooks.org/wiki/PHP/Wyjątki

Konstruktor klasy Exception przyjmuje do trzech argumentów:

Komunikat $message
Kod błędu $code
Poprzedni wyjątek $previous

Ponadto mamy do dyspozycji szereg metod służących do pobierania informacji o wyjątku, gdy już go przechwycimy:

getMessage() - zwraca komunikat błędu.
getCode() - zwraca kod błędu.
getPrevious() - zwraca poprzedni wyjątek.
getFile() - zwraca nazwę pliku, w którym wyjątek został rzucony.
getLine() - zwraca numer linii, w której wyjątek został rzucony.
getTrace() - zwraca tablicę zawierającą ślad stosu, czyli informacje o wszystkich funkcjach i metodach wywołanych w momencie rzucenia wyjątku.
getTraceAsString() - zwraca ślad stosu, ale jako tekst.

Jeśli chcesz dowiedzieć się więcej zachęcam do przeczytania o wyjątkach tutaj:
https://pl.wikibooks.org/wiki/PHP/Wyjątki
http://php.net/manual/en/language.exceptions.php
http://www.w3schools.com/php/php_exception.asp


Reasumując dzisiejszą część poradnika. Dzięki zastosowaniu w odpowiedni sposób bloków try i catch będziemy mogli zdiagnozować błędy występujące w naszym skrypcie lub podczas jego używania. Połączenie z serwerem nie będzie stanowiło już problemu.

2polubienia

Poradnik bardzo fajny i ładnie napisany :slight_smile:

Osobiście wolę używać ts3admin, ale to już sprawa indywidualna

Czekam na więcej poradników :smiley:

w ts3admin jest taki problem, że nie jest w stanie obsługiwać eventów (a przynajmniej mi się tak wydaje).

ts3admin odbiera wiadomości tylko wtedy kiedy potrzebujesz tego ty. A Przynajmniej mi się tak wydaje.

Co masz dokładniej na myśli? Rozbudowane boty można stworzyć i tu i tu. Co byś chciał osiągnąć?

Nie można nasłuchiwać eventów, które są wbudowane w Server Query.
Chodzi mi o notify…

Jak najbardziej TS3Framework ma takie funkcje, a w ts3admin nie zagłębiałem się. Masz rację.