Arbeitet ein Server Anfragen hintereinander ab oder auch gleichzeitig?

5 Antworten

Die bisherigen Antworten sind leider falsch.

Natürlich werden Serveranfragen parallel verarbeitet, und das sogar bei nur einer einzigen CPU mit nur einem einzigen Kern!

Wenn es anders wäre, könnte man das Internet mit seinen Webservern in der heutigen Form kaum benutzen und Seitenanfragen würden ewig laden, mit einer Latenz wesentlich höher als zu Modem-Zeiten!

Deshalb kannst du in PHP auch keine Datei auslesen, den Wert um eins erhöhen und das Ganze dann wieder in die Datei schreiben! Dabei WIRD es früher oder später zu einer sog. Race-Condition kommen.

Die Parallelisierung von solchen Aufgaben ist eine Wissenschaft für sich, und da PHP so eine primitive Skriptsprache ist, gibt es leider auch keine andere Möglichkeit die einzelnen Prozesse / Threads zu synchronisieren, ohne eine Datei zu öffnen und mit der flock()-Funktion zu sperren.

In deinem Falle, ist "einen Integer in einer Textdatei um eins erhöhen" wegen dieser mangelnden Sprachfeatures leider mindestens eine 50-Zeilen lange Funktion. Eine kürzere Lösung gibt es nicht, ohne dass die hohe Wahrscheinlichkeit besteht, dass sich mehrere Requests in die Haare kriegen.

Leider wirst du zu diesem Thema - wie die anderen drei Antworten - oft falsche HInweise bekommen, da PHP-Programmierer überdurchschnittlich oft die Parallelisierung von Resourcen (Dateien, Datenbanken, etc.) vernachlässigen.

Fazit: Wenn du bei deinem Zähler die einzelnen Zugriffe nicht mittels flock() ordentlich sperrst, WIRST du einige Zugriffe fälschlicherweise mit alten Werten inkrementieren, und dein Counter wird somit einige "Hits" übersehen, was zu ungenauen Ergebnissen führt.

Leider verursachen die meisten Counterskripte (die sogar MySQL oder SQLite benutzen) solche Fehler.

Bei vielen gleichzeitigen Zugriffen (ca. einige zich pro Sekunde) funktioniert das dann nicht mehr zuverlässig!

Also es gibt zwei Möglichkeiten:

  • Du sperrst den kritischen Bereich aus "lesen", "erhöhen" und "schreiben" mit einem File-Lock.

  • Dir sind ungenaue und fehlerhafte Ergebnisse recht, und du machst es ohne Lock.

Viel Spaß noch beim programmieren! :)

PS: Da PHP dafür leider völlig ungeeignet ist, guck dir mal eine weitere "richtige" Programmier- oder Skriptsprache an, die ebenfalls mit Prozessen und Threads arbeitet und solche sachen wie wait(), notify(), Semaphoren, Mutexe, Locks, RLocks, usw. bereitstellt. Und sei es nur, um ein Gefühl für Paralellisierung zu bekommen! Was PHP Programmierer teilweise mit Resourcen-IO anrichten ist wirklich ein graus! (Guck dir mal Python, C#, Java oder C/C++ mit Zusatzbibliotheken wie pthreads, usw. an, falls du nicht weißt, wo du anfangen sollst!)

Viel Erfolg! :)

PS: Mir ist gerade noch aufgefallen, dass dein Counter im schlimmsten Falle sogar auf 0 bzw. 1 zurückgesetzt werden kann, wenn der Scheduler bei Request A direkt nach fread() und ftruncate() zu Request B wechselt.

Nehmen wir mal an, bei Request A hat jetzt den String "1000" gelesen und kurz vor dem fwrite() von "1001" wird dann zu Request B gewechselt.

Request B würde dann einen leeren String erhalten, welchen die intval() Funktion in einen echten Integer mit dem Wert "0" konvertiert. (Da Request A ja eben bereits ftruncate() in Vorbereitung zu fwrite() aufgerufen hat, und die Datei jetzt kurzzeitig die Länge Null hat.)

Jetzt wird wieder gewechselt, und Request A schreibt "1001" in die Datei. Request A ist jetzt mit seiner Arbeit fertig, und der Scheduler wechselt wieder zu Request B.

Dort wird der Wert (den wir fälschlicherweise als "0" erhalten haben) inkrementiert somit zu "1". Diese "1" wird als Ergebnis zurück in die Datei geschrieben.

Und bammmm ... dein Counter wurde von 1001 auf 1 zurück gesetzt, wegen besagter Race-Condition.

Der Zählvorgang würde dann so aussehen:

....
998
999
1000
[Race-Condition]
1
2
...

Im harmlosesten Falle wird - wie ich eingangs in meiner Antwort geschrieben habe, "nur" ein Wert "übersehen", was dann so aussehen könnte:

...
998
999
1000
[Race-Condition]
1000
1001
...

Wie du siehst, wird zwei (!) mal die "1000" gezählt, obwohl nach der ersten "1000" bereits "1001" folgen sollte.

Und wir reden hier nur von Request A und B ... jetzt stell dir mal vor, was passiert, wenn du hunderte oder tausende gleichzeitige Anfragen hast. Dabei steigt die Wahrscheinlichkeit für Race-Conditions dann exponentiell an.

Wie gesagt, fast alle Counter, die ich bis jetzt gesehen haben, sogar die, die Datenbanken anstatt Dateien benutzen, haben solche Race-Conditions! In PHP fehlt einfach ein effizientes Mittel, um Code-Bereiche zu synchronisieren. (So etwas wie eine abgewandelte "synchronized" Anweisung wie in Java, allerdings mit einem Mixed-Value als Monitor wäre genial.)

Die momentan einzige Möglichkeit mit flock() ist extrem Resourcenhungrig und ein absolutes Knickei, welches bei hochfrequentierten Servern die Performance drastisch senkt!

0

Hallo

ch will in eine Textdatei eine Zahl auslesen und diese dann +1 rechnen.

in eine Datei auslesen, was ist das denn?

Soll da ein Wert der in einer Textdatei steht geändert werden oder wohin soll die Berechnung gehen?

dies soll aber für jeden einzelnen aufruf der Seite enstehen.

Wenn die Datei gerade bearbeitet wird und ein anderer diese ebenfalls öffnet, dann ist diese für den Anderen nicht beschreibbar, bzw. wird im Cache gehalten. Am Ende steht das drinnen was der letzte darin gespeichert hat.

Und kann es da sein das der Server gleichzeitig auf die Datei zugreift und irgendwas falsches rein schreibt oder arbeitet der jeden Nutzer einzeln ab bis das Script durchgelaufen ist?

Das auslesen der Datei geschieht schon gleichzeitig, der Schreibvorgang aber in Reihenfolge - Ist doch logisch, wäre ja blöd wenn die Seite nur für einen Betrachter da wäre.

Wie wäre es denn wenn Du mal darlegst was das Ziel ist, eventuell gibt es ja einen Weg den Du noch nicht in Betracht gezogen hast.

Linuxhase

Immer hintereinander. Alles was an Computern/Servern parallel abläuft ist nur pseudoparallel, da die auszuführenden Tätigkeiten dann in Threads oder Prozessen ablaufen. Demnach zwingend nacheinander.

Natürlich laufen Prozesse parallel ab! Welche Server sind denn heute keine Mehrkern- bzw. Mehrprozessorsysteme mehr?

Deshalb wird ein großer Teil der Anfragen auch auf verschiedenen Kernen oder Prozessoren ausgeführt, und zwar echt (!) parallel! :)

1

Ihr habt beide recht ;)

0

Fritzbox ip adressen auslesen script?

Ich plane eine Client-Server anwendung, welche den Zugriff auf das Internet steuert.

Wenn sich jemand mit dem Internet verbindet ist die IP adresse des Benutzes in der FritzBox gespeichert.  Ich will diese IP adressen an einen Server schicken welcher dann versucht eine TCP verbindung zu den jeweiligen Geräten herzustellen ("gegenstück" ist eine bestimmte Software auf dem Gerät des Benutzers). Nur wenn dies erfolgreich war, darf der Nutzer ins Internet.

Ich habe im Internet keine guten Beispiele / docs zu der API der FritzBox gefunden. Kann mir jemand helfen?

...zur Frage

Minecraft stürzt immer ab wenn ich versuche optifine und shadermod gleichzeitig zu spielen?

Immer wenn ich Shadermod und Optifine zusammen spielen will stürzt Minecraft immer ab wenn ich eine neue Welt erstelle oder eine Alte welt oder einen server beitreten will.

...zur Frage

Was ist Node.js und wofür nutze ich es?

Hallo. Ich bin gerade dabei ein neues Projekt um zu setzen und bin dabei auf eine Bibliothek für Node.js gestoßen was mich veranlasst hat mich ein wenig mit diesem Interpreter auseinander zu setzen. Dabei bin ich aber auf ein paar Fragen gestoßen ,die mir das Internet nicht wirklich gut beantworten konnte. Ich denke aber jemand der sich auskennt könnte mir besser weiter Helfen was das angeht:

Node.js ist ein Interpreter, welcher Serverseitig Javascript Code ausführt und ihm einige Funktionen hinzufügt bzw. andere Clientexclusive Funktionen entfernt. Er ist schnell, arbeitet mehrere Anfragen parallel ab und ist somit perfekt für die Programmierung eines Webservers oder generell Serverseitiger Anwendungen die einer Menge Nutzer zur Verfügung stehen müssen geeignet. Ein paar Fragen habe ich aber:

  • Ist bei der Nutzung von Node.js überhaupt noch die Nutzung von PHP nötig?

  • Kann der Nutzer der Seite den Node.js Code auf irgendeine Weise uncompiliert ansehen (Private Key bla bla bla)

  • Ist es möglich Node.js auf einer Webseite ein zu binden ohne den Webserver mit Node.js um zu setzen? (Bestehender Webserver, kennt ihr bestimmt von Strato usw.) Oder ist das zu Kompliziert und sollte in solchen fällen eher auf PHP zurückgegriffen werden? (Die Performance von Node.js hat mich so vom Hocker gehauen, dass ich es mal nutzen wollte :D)

Danke für eure Antworten! :)

...zur Frage

Debian 8 PHP Daten werde nicht angezeigt?

Hey Leute ich habe grade meinen vServer neuinstalliert aber jetzt wo ich alles installiert habe also einen ganzen Web Server installiert habe Zeigt er mir die PHP Daten nicht richtig an also wenn ich im Internet http://craftenmedia.net/test/index.php eingebe sollte er normaler weise auf Facebook weiterleiten aber es geht nicht genau so wie mit einer test Seite da werden die PHP Elemente nicht richtig angezeigt ! Ich weiß langsam nicht mehr weiter weil ich schon 10 mal meinen Server neuinstalliert habe !

...zur Frage

Ich möchte eine eigene DNS-Weiterleitung für meinen zu Hause stehenden Minecraft-Server erstellen. Wie kann ich das am besten ohne Fremdanbieter realisieren?

Ich betreibe seit inzwischen 4 Jahren einen Minecraft-Server, der bei mir zu Hause steht. Mein Internetprovider gibt mir in unregelmäßigen Abständen eine neue Web-IP, so dass die Spieler immer wieder informiert werden müssen, unter welcher Adresse der Server gerade erreichbar ist.

Die Lösung ist eine DNS-Weiterleitung, die ich in den letzten Jahren auch über kostenlose Anbieter genutzt habe. Doch erstens habe ich in letzter Zeit mehrfach Pech mit unzuverlässigen Anbietern gehabt und zweitens juckt es in den Fingern, eine eigene Lösung zu realisieren.

Meine Idee bisher:

  • Mein zu Hause laufender Minecraft-Server ruft in regelmäßigen Abständen - z.B. alle 10 Minuten - eine URL im Internet auf. Das könnte ich mittels einer HTML-Datei (meta refresh) oder über den Windows Taskplaner realisieren.
  • Bei Aufruf der URL wird auch noch ein Passwort drangehängt, in Form von www.irgendwo.de/test.php?pw=tabaluga
  • Die aufgerufene Adresse befindet sich auf meinem Webspace, wo ich PHP nutzen kann. Diese PHP-Datei ermittelt die IP des Aufrufers und wenn das mitgesendete Passwort korrekt ist, wird die ermittelte IP auf dem Webspace in eine Textdatei gespeichert.
  • Nun richte ich bei meinem Provider eine Subdomainweiterleitung ein, z.B.: server.irgendwo.de Diese benutzt die in der Textdatei hinterlegte IP-Adresse, um bei Aufruf sofort zum Minecraft-Server bei mir zu Hause weiterleiten zu können.

Allerdings ist mir jetzt noch nicht ganz klar, wie die automatische Weiterleitung zur aktuellen Server-IP inkl. dem Port realisiert werden soll.

Wird das Spiel beim Spieler zu Hause nicht eine Fehlermeldung zeigen, wenn es anstatt des erwarteten Servers erst auf eine Weiterleitungsdatei stößt?

Bin ich evtl. auf dem Holzweg und ich könnte das Problem noch viel einfacher lösen?

Ich habe jetzt schon seit Wochen im Internet recherchiert, komme aber irgendwie nicht weiter. Es gibt zwar ähnlich gelagerte Fragen, allerdings wird zur Lösung fast immer irgend ein Fremdanbieter hinzugezogen. Aber genau das würde ich gern vermeiden.

Ich danke schon mal für jede hilfreiche Antwort!

...zur Frage

php curl variable abfragen?

Hallo, folgendes Problehm:

Ich habe auf server A ein script welches mit curl auf einen anderen server (B) zugreift dieser setzt eine variable kann ich diese auf Server A abfragen?

...zur Frage

Was möchtest Du wissen?