Php Irc Client
Ich will versuchen eine einfache Verbindung zu einen IRC Server mit PHP zu erklären.
Also fangen wir einmal an... Zuerst benötigt man einen Befehl der dem Server
mitteilt das er das Script nicht nach der vorgegebenen max_execution_time, die
standartmässig auf 30 Sekunden eingestellt ist, abbricht. Dieser funktioniert
allerdings nur wenn der Server nicht im PHP Save Modus läuft, was allerdings
die meisten Online Webserver haben! Wenn man einen eigenen Server hat kann man
dies auch für alle Scripte in der PHP Config Datei einstellen, dazu einfach
"max_execution_time = 30;" ändern. Dadurch würde dieser
Befehl natürlich überflüssig werden.
Nun brauchen wir eine Verbindung zu einen Server, diese erlangen wir über den
befehl fsockopen(), wobei der Server und Port sich natürlich von meinem Bespiel
unterscheiden können.
<?
$server = "irc.de.quakenet.org";
$port = "6667";
$verbindung = fsockopen($server, $port);
?> |
So nun haben wir eine Verbindung zum Server...das wars auch schon, wir wollen
natürlich mehr, z.B. müssen wir uns beim IRC Server "registrieren"
bevor wir die IRC Befehle nutzen können. Dies geschiet über den Befehl mit dem
wir in Zukunft alle irc befehle an den Server schicken werden, fputs($verbindung,
"IRC-BEFEHL\n\r") die Variable $verbindung sagt aus das der Befehl an
unsere oben gestartete Serververbindung geschickt wird das \n\r ist sozusagen
das "Enter Zeichen". Nun wollen wir den neugelernten Befehl fputs()
dazu verwenden uns beim IRC Server zu registrieren, mit den IRC Befehlen USER
und NICK.
<?
fputs($verbindung, "USER $nick 0 0 :$realname\r\n");
fputs($verbindung, "NICK $nick\r\n");
# Für IRC Server die Passwörter verlangen
$passwort = "passwort";
fputs($verbindung, "PASS $passwort\r\n");
?> |
An dieser Stelle sollte nun nach einiger Zeit die Ping Anfrage des Servers
kommen, oder eine Fehlermeldung falls der Nickname falsch oder benutz ist. Um
festzusellen was uns der Server mitteilt sollten wir eine Schleife verwenden da
der Befehl fgets($verbindung, 1024) nur eine Zeile auslesen kann. Natürlich
soll er nicht nur eine Zeile auslesen sondern solange auslesen wie der Client
connected ist, dafür verwendet man die While Schleife while(!feof($verbindung))
{}.
<?
while (!feof($verbindung))
{
$new = fgets($verbindung, 1024);
}
?> |
Wenn man jetzt das ganze per echo ausgeben würde wird man bemerken das der
Client nicht wirklich connected sondern an der Ping abfrage des Servers hängenbleibt
(manche Server haben den Ping reply nicht unbedingt am Anfang aber die meisten
eben). Um zu antworten müssen wir überprüfen ob die Zeile die wir soeben
erhalten haben einen PING Befehl enthält, und die nötige ID die angehängt ist
rausfiltern, damit wir mit dem PONG Befehl antworten können. Das ganze kommt
natürlich in unsere Schleife rein, direkt nachdem wir die Neue Zeile erhalten
haben. Auch werden wir diesmal zum Schluss (nach durchlaufen der Schleife) die
Verbindung zum Server "Ordnungsgemäß" beenden und zwar mit dem
Befehl fclose($verbindung) vor dem man auch noch eine IRC Quit Message schicken
könnte mit fputs($verbindung, "QUIT : $quit\n\r"). Es bewirkt beides
das gleiche, allerdings hat man mit der IRC Quitmessage dann die möglichkeit
seinen Eigenen Text reinzuschreiben und wenn man nur mit fclose($verbindung)
beendet erhalten die anderen die Meldung Read error to Nickname[Addresse]: EOF
from client. Und das wir mitkriegen ob wir irgendwelche fehler vom Server
bekommen haben werden wir das ganze nun endlich mit echo $new .
"\r\n"; ausgeben.
<?
while (feof($verbindung)
{
$new = fgets($verbindung, 1024);
# ++ Ping
if(substr($new,0,4) == "PING")
{
$ping = explode(":", $new); #
Trennt den PONG Befehl von der ID
$reply = $ping[1]; #
speichert die ID in $reply
fputs($verbindung, "PONG $reply\r\n"); #
Sendet den vom Server erwarteten PONG Befehl - Nun kann man die IRC
Befehle nutzen
}
# -- Ping
echo $new . "\r\n";
}
# Quitnachricht
$quit = "Simple
PHP IRC Client - dreamcodes.info";
fputs($verbindung, "QUIT : $quit\n\r");
fclose($verbindung);
?> |
So wenn alles glatt geht ist es geschafft! Die IRC Verbindung steht. Nun kann
man diese Simple Verbindung für seine eigenen Zwecke ausbauen mit
fputs($verbindung, "IRC-BEFEHL\r\n") kann jetzt ein beliebiger IRC
Befehl an den Server geschickt werden oder empfangen und verarbeitet werden.
So hier endet es auch schon, ich hoffe ihr habt einigermassend kapiert was ich
meine, dies sollte ja eigentlich nur die Grundverbindung vermitteln.
|