Udp Timeout Probleme

10/26/2015 22:09 False#1
Hey Leute,

kurze Erklärung :
Ich will per 'stream_socket_client' und 'fwrite' eine Verbindung mit einem Gameserver aufbauen und Informationen abfragen.
Soweit geht das ganze auch, jedoch wenn der Server offline ist gibt es natürlich einen Timeout.
Da ich aber 20 Server prüfe und wenn nur 10 an sind habe ich 10 mal einen Timeout und die minimale Timeout Zeit ist 1 Sekunde.
Somit habe ich 10 Sekunden die ich unnötig warte, wie kann ich das Problem lösen ?
Gibt es eine art "ping", das ich kurz prüfen kann ob der Server online ist ?


liebe grüße
10/26/2015 23:02 Devsome#2
Man könnte eine Funktion schreiben wo nicht mehr passiert als

Code:
fsockopen("udp://IP", PORT);
bei einem return true ist der Server online, bei einem false offline.
10/27/2015 00:21 ComputerBaer#3
Sollte es sich dabei um Minecraft-Server handeln könnte der Ping Probleme mit Bukkit/Spigot verursachen. Ich bin mir nicht ganz sicher, ob Bukkit den Schutz auch auf das Query-Protokoll anwendet, aber ich meine schon.
Sollte der "Ping" erfolgreich sein, wird der Server für die nächsten Sekunden jeden weiteren Kontakversuch ablehnen. Du würdest also die Wartezeit bei Offline-Servern einsparen, aber bei allen Server die Online sind die Zeit um ein vielfaches erhöhen.

Wie wäre es mit einer leicht anderen Lösung? Du fragst beispielweise nur alle 5 Minuten deine Server mit einem Cronjob ab, dann muss niemand warten. Die Ergebnisse kommen dann in die Datenbank und deine Webseite zeigt dann die Informationen aus der Datenbank an.
Der Schutz von Bukkit würde auch bei mehreren schnellen Seitenaufrufen hintereinander (egal ob eine oder mehrere Personen) aktiv werden. Je nach Besucherzahlen wäre es also ein Glücksspiel, ob man Serverinformationen sehen kann oder (meistens) nicht.
10/27/2015 09:26 False#4
Quote:
Originally Posted by Devsome View Post
Man könnte eine Funktion schreiben wo nicht mehr passiert als

Code:
fsockopen("udp://IP", PORT);
bei einem return true ist der Server online, bei einem false offline.
Wenn der Server nicht online ist läuft es ja wieder auf einen Timeout herraus.....

Quote:
Originally Posted by ComputerBaer View Post
Sollte es sich dabei um Minecraft-Server handeln könnte der Ping Probleme mit Bukkit/Spigot verursachen. Ich bin mir nicht ganz sicher, ob Bukkit den Schutz auch auf das Query-Protokoll anwendet, aber ich meine schon.
Sollte der "Ping" erfolgreich sein, wird der Server für die nächsten Sekunden jeden weiteren Kontakversuch ablehnen. Du würdest also die Wartezeit bei Offline-Servern einsparen, aber bei allen Server die Online sind die Zeit um ein vielfaches erhöhen.

Wie wäre es mit einer leicht anderen Lösung? Du fragst beispielweise nur alle 5 Minuten deine Server mit einem Cronjob ab, dann muss niemand warten. Die Ergebnisse kommen dann in die Datenbank und deine Webseite zeigt dann die Informationen aus der Datenbank an.
Der Schutz von Bukkit würde auch bei mehreren schnellen Seitenaufrufen hintereinander (egal ob eine oder mehrere Personen) aktiv werden. Je nach Besucherzahlen wäre es also ein Glücksspiel, ob man Serverinformationen sehen kann oder (meistens) nicht.
Nein kein Minecraft, sondern Teeworlds.
Per cron kann ich es nicht machen, da es ja drum geht das ich erfahren will welche spieler online sind :p
10/27/2015 09:34 Devsome#5
Quote:
Originally Posted by .ƒaℓsє. View Post
Wenn der Server nicht online ist läuft es ja wieder auf einen Timeout herraus.....


Nein kein Minecraft, sondern Teeworlds.
Per cron kann ich es nicht machen, da es ja drum geht das ich erfahren will welche spieler online sind [emoji14]
Ja ebend es gibt einen timeout, wenn du vorher schaust mit dem was ich oben geschrieben habe und er in die Funktion nur geht wenn ein true wieder gegeben wird kommt doch auch kein timeout. So kannst du vorher schauen online oder offline.

Gesendet vom Handy
10/27/2015 11:36 False#6
Quote:
Originally Posted by Devsome View Post
Ja ebend es gibt einen timeout, wenn du vorher schaust mit dem was ich oben geschrieben habe und er in die Funktion nur geht wenn ein true wieder gegeben wird kommt doch auch kein timeout. So kannst du vorher schauen online oder offline.

Gesendet vom Handy
Ja sprich wenn 10 Server nicht an sind gibt es 10 mal einen Timeout und somit muss ich immer noch 10 Sekunden warten, da die minimale Timeout Zeit eine Sekunde ist.
10/27/2015 22:07 NotEnoughForYou#7
Quote:
Originally Posted by .ƒaℓsє. View Post
Ja sprich wenn 10 Server nicht an sind gibt es 10 mal einen Timeout und somit muss ich immer noch 10 Sekunden warten, da die minimale Timeout Zeit eine Sekunde ist.
Dann mach das ganze doch async mit Javascript.
10/27/2015 22:39 False#8
Quote:
Originally Posted by NotEnoughForYou View Post
Dann mach das ganze doch async mit Javascript.
wie geht das den mit JavaScript ;o ?Was mir aber auch nicht sooo viel bringt, da ich auch ein Cron haben will und dort ja nur Php geht :p
10/27/2015 22:46 NotEnoughForYou#9
Quote:
Originally Posted by .ƒaℓsє. View Post
wie geht das den mit JavaScript ;o ?Was mir aber auch nicht sooo viel bringt, da ich auch ein Cron haben will und dort ja nur Php geht :p
Naja was willst du denn genau machen? Irgendwelche Informationen abfragen, aber wieso solltest du dazu einen Cron brauchen? Wenn es schon ein Cronjob ist (der sowieso nur alle x minuten für gewöhnlich läuft), wieso sind dann zb. 10 Sekunden wartezeit so schlimm?

Klar geht das auch per Cron. Einfach nen javascript interpreter nutzen (z.B. node).

Alternativ: Wieso überhaupt PHP? Wenn du das parallelisieren willst nimm doch lieber eine andere Sprache (wo du ganz normal Threading betreiben kannst).
11/02/2015 18:15 xsrf#10
Eventuell weil er keine andere Sprache außer PHP kann?

Ich würde einfach ein Objekt erstellen welches Datenspeichert und abgerufen werden kann. Somit vermeidest du die Ladezeit, da letztendlich der Cronjob die ganzen Abfragen macht und dir dann nur ein .json Objekt (Beispiel) erstellt welches dann für jeden Server einen Boolean speichert.
11/03/2015 23:06 False#11
Quote:
Originally Posted by xsrf View Post
Eventuell weil er keine andere Sprache außer PHP kann?

Ich würde einfach ein Objekt erstellen welches Datenspeichert und abgerufen werden kann. Somit vermeidest du die Ladezeit, da letztendlich der Cronjob die ganzen Abfragen macht und dir dann nur ein .json Objekt (Beispiel) erstellt welches dann für jeden Server einen Boolean speichert.
Doch kann ich, jedoch wollte ich eigentlich kein Cron nutzen da die Infos dann nicht aktuell sind..Jedoch wird es nicht anders gehen und ich habe es schon per Cron gelöst.