• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

Zwei php-Skripte parallel (Auslagerung)

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
Hey Leute,

Es wird eine Seite aufgerufen (anzeigen.php).Auf dieser Seite gibt es ein DIV, dass im 2 Sekundentakt über AJAX aktualisiert wird. Das DIV zeigt einen Datenbankeintrag an.

Nun soll parallel dazu durch die anzeigen.php ein Skript (erzeugen.php) aufgerufen werden, das eben diese Datenbankeinträge herstellt. die erzeugen.php braucht etwa 2 Minuten und arbeitet in einer Schleife. Bei jedem Durchlauf wird der Eintrag aktualisiert, sodass man auf der anzeigen.php immer sieht, wie weit die erzeugen.php ist.


Mittels include('erzeugen.php') wird die anzeigen.php erst aufgebaut, wenn erzeugen.php fertig ist. Also nutzlos.
Lass ich die erzeugen.php per AJAX aufrufen, läuft diese zwar an und die anzeigen.php wird vollständig geladen, aber das Reloading des DIVs in der anzeigen.php beginnt erst nach Abschluss der erzeugen.php. Ebenfalls nutzlos.
Ein Cronjob kommt nicht infrage, da ich es auslösen will, nicht die Zeit.

Wie kann ich ein php-Skript vom Browser aus aufrufen, ohne dass der Browser auf irgendwas wartet?

Daaaanke
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Hallo,

meine Idee wäre das "Erzeugen.php" eine temporäre Datei anlegt, in der die "%" (Fortschritt) festgehalten/aktualisiert werden während seiner Laufzeit.
Diese kannst du dann mit "Anzeigen.php" auslesen (über eine feste Zuordnung am Client) und an den Client die "%" zurückgeben.

Der Name der Datei könnte die Client-Id oder Session ID oder sowas sein, die "Anzeigen.php" als Datei abfragt, was eindeutiges.

Anders wüßte ich nicht wie man sonst prüfen kann ob ein Prozess (auch bei mehreren Clients) einen anderen, sinnvoll, in PHP abfragen kann. Aber gut, ich bin auch nicht der PHP-ler ;)

Ist nur die Frage, was machst du wenn du Prozesse (PHP Skripte), 20 davon, laufen hast? - Macht dann nicht irgendwann der Server dicht wenn das "MAX_SCRIPT_EXECUTION_TIME" zu hoch gesetzt ist bzw. generell wenn es noch mehr Clients sind?

Nachtrag:
Aber die Laufzeit des "erzeugen.php" lässt sich nicht anders/positiv beeinflussen? - Ist ne verdammt lange Laufzeit....
 
Zuletzt bearbeitet:

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • Thread Starter Thread Starter
  • #3
Naja, es werden halt die Missionen generiert für meine Mod. Ich weiß, dass ich es noch effizienter gestalten kann. Aber wenn es nachher 7-8 Missionen sind, dauert es eben. Ist auch immer anders.

Was die "erzeugen.php" ausgibt, ist wurscht. Will den Stand ja aus der DB auslesen.

Mein letzter Versuch, der leider das ewige Laden nicht verhindert:

anzeigen.php
[src=php]<html>
<div>immer aktuell</div>
</html>

ignore_user_abort(true);
ob_start();


header('HTTP/1.1 200 OK');
header('Content-Length: ' . ob_get_length());

ob_end_flush();
ob_flush();


include('erzeugen.php');[/src]

Jetzt im Nachhinein fällt mir auf: das hilft mir ja auch nicht. So wird zwar die anzeigen.php angezeigt, aber das DIV nicht aktualisiert, bevor nicht die erzeugen.php fertig ist.

Nee, die erzeugen.php muss in einen ganz neuen Prozess ausgelagert werden, der mit dem Client nichts mehr zu tun hat. Sie arbeitet auch nur mit Inhalten der DB.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Achso, dein letzter Einwand. Ich dachte das wäre der Fall, daher der Vorschlag das die "Anzeige" zwar das "Erzeugen" Abfragt bzw. einmalig startet, aber dann nicht immer wieder den Prozess "Erzeugen" neu startet, sondern den Status des bereits gestarteten Prozesses "ausgibt/anzeigt", wenn nicht bei 0% Status (keine temp-Datei bzw. kein Status 100% in einer Temp-Datei).

Macht das Sinn?
 

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • Thread Starter Thread Starter
  • #5
Genau, die erzeugen.php wird einmal gestartet und durchläuft n paar Schleifen bis sie alle Missionen generiert hat. Pro Durchlauf könnte man den Status in der DB festhalten.

Die auslösende anzeigen.php startet erzeugen.php und zeigt dann den sich ändernden DB-Eintrag an (das klappt auch, wenn ich den Eintrag manuell ändere).

Ich schaffe es nicht, die beiden Prozesse von einander zu trennen.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
@nietaL:

Warum lässt du nicht einfach "Anzeigen.php" das Skript nur ausführen, wenn nicht "kein Status" in der DB steht und kein "%" Fortschritt außer "100%" bzw. "kein Status" gespeichert sind?

Also heißt, wenn "erzeugen.php" läuft, setzt es den % Wert, wenn es fertig ist, setzt es 100%...

Die Frage ist dann die, wann soll "Anzeigen.php" erneut "Erzeugen.php" ausführen lassen, bei 100% (also ein durchlauf und dann noch einer) oder nur wenn "kein Status" in der DB steht?

Ist das nur einmalig mit "erzeugen.php", dann würde ich für den Client den Wert in der DB auf "100%" lassen - soll das Skript gern nochmal durchlaufen würde ich "resetten" lassen.
Ansonsten lässt du es bei 100%, also hat der Spiele "Missionen" generiert bekommen und ein Reset wird dann "extra" durchgeführt, für andere/neue Missionen und dann wird das "100%" in der DB "ignoriert" und neu gestartet/resettet, aber über einen Extra Befehl/Skript halt, was den DB Wert zurückstellt.
 
Zuletzt bearbeitet:

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • Thread Starter Thread Starter
  • #7
Es wird nur ausgeführt, wenn status = 0.
Beginnt die erzeugen.php, ist status = 9.
Wenn der erzeugen.php fertig ist, ist status = 1.

Die 9 wollte ich ersetzen durch Prozentwerte im 10er-Schritt. Man kann natürlich genauso gut von 0-100 gehen, sodass "status= 100" fertig heißt.

Ich finde es einfach nicht schön, wenn man 3 Minuten vor nem weißen Bild sitzt und sich die Sanduhr dreht. Man sieht ja keinen Fortschritt. Zumindest bewegt sich nicht der Browserladebalken, was ja irgendwie logisch ist.
Außerdem sollen viele Clients gleichzeitig den fortschritt sehen können, in dem sie alle auf die DB zugreifen und status abfragen.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Ja, passt doch dann aber, nicht? :)

Die Laufzeit ist natürlich übel und ich weiß auch gar nicht ob du bei mehr Spielern... fangen wir mal nicht an... mehr als 2 Minuten brauchst wenn der Server "belastet"/"ausgelastet" ist.... und dann einige "Prozesse" von "erzeugen.php" einen Time Out bekommen.

Vielleicht noch in "Schritte" unterteilen.... also neu gestartete Skripte zum Beispiel. Die Teilaufgaben lösen.. oder den Code "irgendwie" optimieren damit die Laufzeit nicht all zu lang ist.
Aber ich weiß auch nicht ob es das bringt, da würde ich mal PHP und Execution timeout googlen bzw. auf php.net schauen was dort darunter verstanden wird.
 

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • Thread Starter Thread Starter
  • #9
Alle nicht erzeugenden Clients können ja live in der DB verfolgen, wie weit der Server (bzw. die Missionserzeugung) ist. Das wäre okay.

Der erzeugende Client hängt auf der Seite fest, bis das Skript fertig ist. Kann man mit flush oder so nicht zwischendurch ne Ausgabe raushauen? Damit hab ich noch nie gearbeitet.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Du kannst doch in "Phasen" arbeiten oder du lässt nur die DB innerhalb der Schleife aktualisieren. Eine Idee, je nach Forschritt, 0%, 25%, 50%, 75%, 100% - je nachdem was und wie viel du zu verarbeiten/generieren lassen hast. 10 von 1000 Schritten, gleich 1000/10 %.... oder in "Stufen" die % aktualisieren und an die DB übergeben. Was für dich leichter/besser ist. :)
 

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • Thread Starter Thread Starter
  • #11
der erzeugende Client arbeitet sagen wir mal 10 Missionen ab:

[src=php]if(status=0)
{
$alle_missionen = mysqli_query($db, "SELECT * FROM missionen");

while ($mission = mysqli_fetch_array($alle_missionen))
{
Mission erzeugen;
packen;
per ftp an gameserver;
status in DB updaten ala DB-UPDATE = 10, dann 20, dann 30 usw.
}
DB-UPDATE status = 100
}[/src]

Währenddessen kann der ausführende Client den Fortschritt nicht sehen, weil das Skript ja noch läuft. Das kann ich auch nicht mehr ändern, weil es einfach unfassbar komplex ist. Dachte an ein echo plus flush nach jedem While-Durchlauf. Geht sowas?

Aber nicht ausführende Clients können die wachsende Prozentzahl live auslesen (AJAX z.B.).
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Klingt doch gut, pro Mission 10% - wenn du mit deiner "Anzeigen.php" jetzt auf die Datenbank zugreifst, und dir die % Zahl holst.... ? Und nicht neu startest, weil die % Zahl in der DB steht und kein False Wert (keine Missionen generiert oder in Progress) ist? Also Status 0 - passt doch alles. :T
 

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • Thread Starter Thread Starter
  • #13
ja, aber das kann doch nur der nicht-ausführende Client.
Der ausführende Client ist ja mit Generieren beschäftigt. Also kann er keine Abfrage an die DB senden.

Vielleicht gibts noch n Denkfehler. Alles passiert GLEICHZEITIG. Viele Clients glotzen auf dieSELBE Befehls-Karte. Der erste der WEITER drückt, hat das Los gezogen, ausführender Client zu sein. Alle anderen warten nur, bis der fertig ist.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Warum, kann nicht alle paar Steps der ausführend ist den DB eintrag aktualisieren, nach jedem Durchlauf, und der Client liest nur den DB Wert aus? Startet oder exited bzw. gibt nur den DB Wert zurück an/mit/durch "Anzeigen.php".

Der Ausführende kann aber "Updaten" in der DB, du mußt ihm das doch nur mitteilen/sagen das er soll, nach jeder Schleife / am Ende.
 

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • Thread Starter Thread Starter
  • #15
Das tut der ausführende ja. Nur auslesen kann er ihn nicht, weil er ja beschäftigt ist. Der ausführende Client kann quasi nur 0 und 100% sehen. Alles dazwischen nicht. Weil das Skript noch nichht feritig ist.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Ach so meinst du das.

Dann lass doch die "Anzeige.php" den Wert aus der Datenbank lesen, und damit arbeiten, das zurückgeben an den Browser-Client und dann nichts weiter machen.

Die "Erstellung.php" hat doch damit gar nichts zu tun, die läuft als anderer Prozess weiter. Und wird nicht "noch einmal" von "Anzeige.php" getriggert, weil wir die Werte aus der Datenbank eingelesen haben.

"Anzeige.php" holt sich nur noch den Status, aus der DB, und gibt den ungefragt an den Browser-Client zurück, weil die Erstellung läuft.
 
Zuletzt bearbeitet:

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • Thread Starter Thread Starter
  • #17
Wenn du von dem Client redest, der NICHT die erzeugen.php aufgerufen hat (also nicht der Erste war, der WEITER geklickt hat), dann geht das so wie du sagst.

Aber der ausführende Client ist mit erzeugen beschäftigt und kann ncihts auslesen. Der Server verarbeitet die Script nacheinander. Es sei denn, man schafft es, ein Script in ein anderen neuen Prozess auszulagern. Von mir aus auch so, dass der Startende da nicht wieder rankommt. Aber daran scheitere ich eben.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Warum machst du keine Abfrage an die Datenbank - ob das "Erzeugen" gerade gemacht/in progress wird/ist?

Wird es gemacht, schaltest du in den Auslese Prozess aus der Datenbank Status >= 0 %. Und zurück an den Client.

Ansonsten wird erzeugt. Das kannst du auch in deinem Ausleseskript machen / aus der DB An/Abfragen, das aber auch für den "Erstellungsauftrag" zuständig ist, aber keinen gibt.

ISt der Wert aus der DB -1 : Starte das Skript zum Erzeugen, setze es auf 0 %
Ansonsten: Gib mir den Wert aus der DB für % Fortschritt (an den Client/Browser)
 
Zuletzt bearbeitet:

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • Thread Starter Thread Starter
  • #19
Warum machst du keine Abfrage an die Datenbank - ob das "Erzeugen" gerade gemacht/in progress wird/ist?

Weil ich keine Abfrage starten kann, wenn das Erzeugen noch läuft. (als ausführender Client)

Bei allen anderen habe ich es mittlerweile so gemacht. Die Mitläufer sehen tatsächlich den prozentualen Zuwachs gemäß deinem letzten Kommentar.

Aber der Ausführende klickt Weiter. Dann dreht sich 3 Minuten seine Sanduhr und dann ist er auf der Seite, die eigentlich live den Stand anzeigt. Und da kann ja nun nur noch 100% stehen.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
Achso, weil kein Exit erfolgt und das Skript ewig weiterläuft..... :o - Daran hab ich NICHT gedacht. Aber ist ja auch ein AJAX Request....

Kannst du aus deinem "anzeigen.php" keinen "Prozess starten" das er Erzeugen.php für den Client aufruft (wenn keine 0% < 100%) ist ... aber wieder an den Client zurück gibt - die Kontrolle, damit du eine geschlossene Abfrage hast?
 
Oben