Zwei php-Skripte parallel (Auslagerung)

  • Thread Starter Thread Starter
  • #21
eigentlich geht das, ja. Aber mit system, exec und all dem kram krieg ich es nicht hin. Wenn die erzeugen.php irgendwie gestartet und ausgekoppelt werden könnte (hab auch schon an Batch-Datei gedacht), dann kann die anzeigen.php ja ungehindert arbeiten. Auch beim Ausführenden.
 
Und einen Cronjob zu starten, der den Status in einer DB abspeichert? - Geht sowas nicht, also über PHP den Cron, dann über PHP den Status vom Cron (des Prozesses PHP das aktualisiert) auslesen? Und entsprechend handeln.

Du mußt aus der PHP Schleife raus.
 
  • Thread Starter Thread Starter
  • #23
Du mußt aus der PHP Schleife raus.
Das ist es.

Das Abspeichern tut er ja sauber. Nach jedem Schleifendurchlauf wird die DB geupdatet. Aber das ist eben serverseitig. Das Feedback an den Client gibts immer erst, nachdem der Server fertig ist.

Meiner Meinuing nach kann man mit ob_flush(); sowas wie ein Zwischenstand vom laufenden PHP-Skript einfordern. Hab das aber noch nie hinbekommen.
 
Das ist es.

[...] Das Feedback an den Client gibts immer erst, nachdem der Server fertig ist.

Ja, nachdem das PHP Skript wirklich ausgeführt ist, aber ich weiß auch nicht wie es mit Ajax aussieht, der "auftrag" hängt in der Luft und der Server rödelt und versucht diesen zu "befriedigen" / zu beantworten bzw. AJAX.

Cronjob der sofort startet und durch das "erzeugen.php" aufgerufen wird, ist keine Wahl?

Meiner Meinuing nach kann man mit ob_flush(); sowas wie ein Zwischenstand vom laufenden PHP-Skript einfordern. Hab das aber noch nie hinbekommen.

Naja, wenn das Skript von PHP sauber nen "Exit" / "Status" zurückgibt, braucht der ClientBrowser nur alle paar Sekunden die DB abfragen lassen durch PHP.... und gibt den Wert zurück.

Die Aktualisierung der Datenbank erfolgt durch das im CronJob durchgereicht PHP Skript an die DB.
 
  • Thread Starter Thread Starter
  • #25
Cronjob funktioniert doch nur mit festgelegten zeitlichen Intervallen, oder? Der müsste ja sekündlich prüfen, sonst wartet man ja ewig. Und das für nur eine Auslösung in der Woche.

Ja, EXIT klappt nicht, weil ich in der Schleife hänge.
 
Den Cronjob startest du dann, glaube ich, mit nem Start und wenn er abgeschlossen ist, endet er einfach und gibt die Ressourcen frei.

Glaube ich, ich weiß es nicht. ;)
 
PHP kann leider keine Threads (zumindest ohne Erweiterungen). In einem ähnlichen Fall hab ich daher mit mehreren Verbindungen gearbeitet, um mehrere Scripte gleichzeitig anzustoßen.

In deinem Fall könnte das so aussehen, dass die erzeugen.php damit anfängt:
[src=php]ob_start();
$size = ob_get_length();
header("Content-Length: $size");
header('Connection: close');
ob_end_flush();
ob_flush();
flush();
@session_write_close();
set_time_limit(300); // Oder wie lange auch immer dein Script braucht
ignore_user_abort(true);

// Eigentlicher Code[/src]Dieser Code sorgt dafür, dass ein normaler Browser die Verbindung direkt wieder beendet (Connection: close + Content-Length), während das PHP-Script trotzdem weiter ausgeführt wird.

Zum Starten der Datei gibt es dann zwei Methoden (keine Garantie für die URL):
[src=php]$url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['REQUEST_URI']) . '/erzeugen.php';

// V1 - Aufruf durch Server
get_headers($url); // Der Server ruft die erzeugen.php selber auf - Cookies / Sessions werden nicht übernommen

// V2 - Aufruf durch Browser
echo '<img style="display: none" src="'.$url.'?time='.md5(microtime()).'">'; // Der Browser ruft die erzeugen.php auf - sofern es ein "echter" Browser ist der auch Bilder anzeigt.[/src]
Evtl. kann man da auch noch eine dritte Methode bauen, die mit Redirects arbeitet (der Browser ruft die erzeugen.php auf, die nutzt den Code oben, sendet aber einen HTTP Status Code 302 + einen Location-Header mit, der auf die anzeigen.php verweist). Dazu hab ich aber keine Codeschnipsel da, und man müsste das nochmal ausgiebig testen.
Eine weitere Alternative wäre - die Funktion ist aber nicht immer verfügbar (und generell nur unter Linux).


Bei allen Methoden solltest du bedenken, dass möglicherweise zwei Nutzer gleichzeitig in den Genuss kommen, die Ausführung zu starten. Daher solltest du direkt nach dem Start irgendwo vermerken, dass die Erzeugung läuft - und bei jedem Aufruf von erzeugen.php darauf prüfen, ob irgendwo schon eine andere Instanz gestartet wurde.
Zur Fortschrittskontrolle wurde hier ja schon einiges im Thread gepostet. Ich hatte das damals über einen Datenbankeintrag gemacht, der alle paar Sekunden aktualisiert wurde. Hat eigentlich ganz gut funktioniert. Du solltest dir aber eine gute Methode zur Fehlerbehandlung überlegen. Wenn dein erzeugender Code im Hintergrund läuft hast du keine Chance, eine PHP-Fehlermeldung im Browser zu sehen. Und wenn das Script abstürzt warten deine Clients ewig, ohne den Fehler zu bemerken.
 
  • Thread Starter Thread Starter
  • #29
Danke für deine Idee. Ich rufe bisher die erzeugen.php per AJAX von der anzeigen.php aus auf.

[src=javascript]if ($status_abfrage['server'] ==0)
{
echo "
<script language=\"javascript\" >
xmlhttp=new XMLHttpRequest();
xmlhttp.open(\"GET\",\"erzeugen.php\",true);
xmlhttp.send();
</script> ";

}
[/src]

Das funktioniert einwandfrei, bis auf das o.g. Problem natürlich. Den von die geposteten Code habe ich einfach mal an den Anfang der erzeugen.php gesetzt und sonst nichts verändert. Das Problem bleibt. Ist AJAX dahingehend nicht verwendbar? Die SESSIONS-Vars brauche ich leider.


[src=php]
<?php
if ($status_abfrage['server'] ==0)
{
?>
<img style="display: none" src="erzeugen.php">
<?php
}
?>
[/src]

Das bringts auch nicht. Er lädt und lädt. Mir scheint, das Kappen der Verbindung funktioniert nicht.
 
Zuletzt bearbeitet:
Mit meinem Code für die erzeugen.php sollte der AJAX-Request eigentlich direkt wieder beendet werden, das Script aber im Hintergrund weiterlaufen. AJAX sollte genau wie meine V2-Version funktionieren (wenn Javascript aktiv ist).
Kannst du mal in der Browserkonsole prüfen, ob der AJAX-Request wirklich gesendet wird?

Evtl. spielt hier auch Caching mit rein (der Browser "kennt" die Antwort der erzeugen.php schon). Ersetz mal die 2. Javascript-Zeile durch[src=javascript]xmlhttp.open('GET', 'erzeugen.php?rnd='+Math.random(), true);[/src]

Edit: Nach meinem erzeugen.php-Code kannst du (in der erzeugen.php) nur noch lesend auf $_SESSION zugreifen. Könnte das ein Problem werden?
 
  • Thread Starter Thread Starter
  • #31
Der muss ja gesendet werden:

1. Die Datenbank füllt sich wie gewünscht.
2. Meine anderen Browser, die nicht abfeuern, sondern NUR gucken (weil status_abfrage['server'] dann ja schon über NULL liegt), sehen den Fortschrittsbalken sich füllen.
3. Die Missionen sind gepackt aufm Gameserver.

Problem besteht weiterhin. Er wartet bis alle Missionen fertig sind und spuckt dann den Ladbalken aus, der natürlich nur noch 100% anzeigt.
 
Warum keinen CronJob, der den Task bzw. das PHP Skript ausführt? Ich denke, das wäre die beste Lösung. Weil du auch nicht weißt wie lang der Task am Ende bei 100 Benutzern brauchen wird.
Hast du es einfach mal damit getestet, ob das so funktioniert?
 
  • Thread Starter Thread Starter
  • #33
Der Task wird nur einmal ausgeführt. Es wäre ja sinnlos, wenn alle User dieselben Missionen mehrfach erzeugen. Nee dazu kam ich noch nicht. Das ist auch n ganz neues Feld. Hatte kurz die Hoffnung, dass es so einfacher geht. Ich finds auch plausibel, aber er will nicht. Debugging is aber auch schwierig, wenn man nüscht sieht XD
 
Cronjobs kenn ich nur als "crontab" - sprich die starten zu ner gewissen Uhrzeit.

Die "saubere" Lösung wäre wohl eine Background-Worker-Library wie . Allerdings arbeitet keine der Libraries (die ich gefunden habe) auf einem beliebigen Server - alle verlangen zumindest eine spezielle Datenbank (Redis bspw) und "manuell" gestartete Worker-Clients (bspw. über einen Service). Nichts, was man bei dem generischen 0815-Hosting-Provider nutzen kann.

Dein aktuelles Problem ist nur noch der Fortschrittsbalken bei dem auslösenden Client? Woher beziehst du den? Vom erzeugen.php-Aufruf, oder durch andere (parallele) AJAX-Requests?
Im zweiten Fall kann es sein, dass die Session des Clients noch durch den erzeugenden Prozess blockiert ist. Das session_write_close() oben hatte das Problem damals bei mir gelöst.
 
  • Thread Starter Thread Starter
  • #35
Cronjobs kenn ich nur als "crontab" - sprich die starten zu ner gewissen Uhrzeit.

Deshalb denke ich auch, dass das hier schwierig wird. Aber okay. Ich denke, ich sollte mal den Code posten. Habe mich nur davor gescheut, weil das MissionMakerModul so extrem groß ist. Ich werde auf die wichtigen Zeilen hinweisen:

Das ist die bisher genannte "anzeigen.php":
Zeile 80-90 ruft in regelmäßigen Abständen den Statusbalken über ein weiteres Skript ab.
[src=php]<?php ob_start(); ?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="stil.css">

<link rel="icon" type="image/x-icon" href="img/fav.png">
<link rel="shortcut icon" type="image/x-icon" href="img/fav.png">
<link type="image/x-icon" href="img/fav.png">

<title>OurAltis.de</title>
<script src="js/jquery.js"></script>
</head>

<?php
include 'inc/log_check.php';
include 'inc/sprachen.php';

$datenbank = "speicher_".$_SESSION['slot'];
include 'inc/db_connect.php';


$status = mysqli_fetch_array(mysqli_query($db, "SELECT * FROM status"));
if($_SESSION['partei'] == "west") {$eigenpartei = "phase_west"; $gegenpartei = "phase_ost";} elseif ($_SESSION['partei'] == "ost") { $eigenpartei = "phase_ost"; $gegenpartei = "phase_west"; }

if ($status[$eigenpartei] == "P0") { header('Location: desk.php'); }
if ($status[$eigenpartei] == "P1") { header('Location: table1.php'); }
if ($status[$eigenpartei] == "R0") { header('Location: table2.php'); }
if ($status[$eigenpartei] == "R1") { header('Location: table3.php'); }
if ($status[$eigenpartei] == "S1") { header('Location: table5.php'); }



if($_SESSION['partei'] == '')
{
echo "<body bgcolor=\"#333333\" style=\"overflow:hidden;\">";
}elseif($_SESSION['partei'] == 'west') {

echo "<body bgcolor=\"#003366\" style=\"overflow:hidden;\">";
}elseif($_SESSION['partei'] == 'ost') {
echo "<body bgcolor=\"#993333\" style=\"overflow:hidden;\">";
}

?>

<script type="text/javascript" src="js/wz_dragdrop.js"></script>

<div style="position:absolute; z-index:5;">
<img src="img/lan_de.jpg" /> <a href="lang.php?lang=0&back=table4" class="link_tablet">deutsch</a>
<a class="text_tablet"> | </a>
<img src="img/lan_en.jpg" /> <a href="lang.php?lang=1&back=table4" class="link_tablet">english</a>
<a class="text_tablet"> | </a>
<img src="img/lan_fr.jpg" /> <a href="lang.php?lang=2&back=table4" class="link_tablet">français</a>
</div>


<?php
if($_SESSION['partei'] == "west") {$flagge = "flagge_west.jpg";}
elseif($_SESSION['partei'] == "ost") {$flagge = "flagge_ost.jpg";}
elseif(!isset($_SESSION['partei']) || $_SESSION['partei'] == "") {$flagge = "ausweis_leer.png";}

?>
<script type="text/javascript" src="js/wz_tooltip.js"></script>



<div style="position: absolute; width:95%; top: 50px; " align="right" ><img src="img/logo_klein2.png" alt=""/></div>

<div id="division_hg" style="position:absolute; left:50px; top:300px; opacity:0.05; font-size:500px; color:#000; font-family: Arial; white-space: nowrap; "><?php echo $_SESSION['division']; ?></div>


<div style="position:absolute; top:20px; left:0px; width:450px; height:300px;"><img id="flagge" src="img/<?php echo $flagge; ?>"></div>




<div style="position: relative; border: 0px solid #000; color: #333; margin-left:auto; margin-right:auto; width:920px; top: 50px; " >

<script type="text/javascript">
$(document).ready(function() {
$("#status_mission").load("table_status4.php");
var refreshId = setInterval(function()
{
$("#status_mission").load('table_status4.php?' + 1*new Date());
}, 5000);
}); </script>

<div id="status_mission" style="position: relative; border: 0px solid #000; color: #333; margin-left:auto; margin-right:auto; width:920px; top: 165px; " ></div>
</div>


<!-- Altische Zeitung -->
<?php include 'table_zeitung.php'; ?>

<script type="text/javascript">
<!--

SET_DHTML("altische");

//-->


</script>



<?php

$status_abfrage = mysqli_fetch_array(mysqli_query($db, "SELECT * FROM status"));


if ($status_abfrage['server'] ==0)
{
echo "

<script language=\"javascript\" >
xmlhttp=new XMLHttpRequest();
xmlhttp.open(\"GET\",\"serverstart.php?rnd=\"+Math.random(), true);
xmlhttp.send();
</script> ";

}

?>

</body>
</html>

[/src]


statusbalken:
[src=php]<?php

session_start();

include 'inc/log_check.php';
$datenbank = "speicher_".$_SESSION['slot'];
include 'inc/db_connect.php';
include 'inc/sprachen.php';


$status = mysqli_fetch_array(mysqli_query($db, "SELECT * FROM status"));




?>
<a class="formular_titel"><?php echo $T_spielstart[$L]; ?></a>

<table border="0" style="width:100%; color:#FFF; text-align:center;">
<tr>
<td>
<div style="border: 1px solid white; width:100%;"><div id="status_mission" style="background-color:#FFFFFF; height: 5px; width:<?php echo $status['server']; ?>%; "><a class="formular_text"> </a></div></div>
</td>
</tr>
<tr>
<td>
<?php echo $status['server']."%"; ?>
</td>
</tr>
</table>


<?php
if($status['server'] == 100)
{
?>
<div id="buttons" style="position: relative; border: 0px solid #000; color: #333; margin-left:auto; margin-right:auto; width:920px; top: 130px; " >
<input type="button" class="btn" value="<?php echo $B_auswerten[$L]; ?>" onClick="">   
<input type="button" class="btn" value="<?php echo $B_abmelden[$L]; ?>" onClick="window.location='logout.php';">
</div>
<?php
}
?>[/src]

das ist die hier genannte serverstart.php (erzeugen), die im ersten Skript (anzeigen) in den Zeilen 110-125 per AJAX augerufen wird:
[src=php]<?php
ob_start();
$size = ob_get_length();
header("Content-Length: ".$size);
header('Connection: close');
ob_end_flush();
ob_flush();
flush();
@session_write_close();
set_time_limit(200); // Oder wie lange auch immer dein Script braucht
ignore_user_abort(true);



session_start();

include 'inc/db_connect.php';


//Funktion: rekursives Löschen
function rmr($dir) {
if (is_dir($dir)) {
$dircontent=scandir($dir);
foreach ($dircontent as $c) {
if ($c!='.' and $c!='..' and is_dir($dir.'/'.$c)) {
rmr($dir.'/'.$c);
} else if ($c!='.' and $c!='..') {
unlink($dir.'/'.$c);
}
}
rmdir($dir);
} else {
unlink($dir);
}
}

$datenbank = "speicher_".$_SESSION['slot'];
include 'inc/db_connect.php';




//SERVERSTATUS

$status_abfrage = mysqli_fetch_array(mysqli_query($db, "SELECT * FROM status"));



if ($status_abfrage['server'] !=0)
{
exit;
}
else if ($status_abfrage['server'] == 0)
{
mysqli_query($db, "UPDATE status SET server = '1'"); //Serverstatus "laufend(9)"
$zufall = rand(100,999);
mysqli_query($db, "UPDATE status SET serverpw = '".$zufall."'"); //Serverpasswort erstellen und speichern
$serverpw_neu = $zufall;




// alle Potentielle Missionen und Reaktionen auswerten
// Welche Mission wird wirklich gespielt?

$alle_missionen = mysqli_query($db, "SELECT * FROM missionen");

$mission_zahl = mysqli_num_rows($alle_missionen);
$generator_startwert = round(100 / $mission_zahl); // =100/5=20
$generator_faktor = 1;


while ($mission = mysqli_fetch_array($alle_missionen))
{

$fortschritt = $generator_startwert * $generator_faktor;
$generator_faktor++;

if ($mission['done'] != '1') //standard !='1'
{
// KAPITULATION - KAPITULATION (passiert höchstens beim Grenzkrieg)
if ($mission['reaktion_west'] == "Kapitulation" && $mission['reaktion_ost'] == "Kapitulation")
{
// Status Einsatzkräfte auf "Kein Einsatz"
$truppen = mysqli_fetch_array(mysqli_query($db, "SELECT truppen FROM missionen WHERE operation = '".$mission['operation']."'"));

$truppen = str_replace(";;", ";", $truppen[0]);
$IDNR = explode(';', $truppen);
$anzahl = count($IDNR); $i = 0;

while ($i < $anzahl)
{
$id = substr($IDNR[$i],-5);


mysqli_query($db, "UPDATE armeen SET einsatz = '0' WHERE id = '".$id."'");
$i++;
}

// Befehle löschen
$befehlsnrr = mysqli_fetch_array(mysqli_query($db, "SELECT befehlsnr FROM missionen WHERE operation = '".$mission['operation']."'"));

$befehlsnr = explode(';;', $befehlsnrr[0]);
$anzahl = count($befehlsnr); $i = 0;


while ($i < $anzahl)
{
$result1 = mysqli_query($db, "DELETE FROM befehle WHERE befehlsnr = '".$befehlsnr[$i]."'");
$i++;
}


// Mission löschen
mysqli_query($db, "DELETE FROM missionen WHERE mission_id = '".$mission['mission_id']."'");
}

// KAPITULATION - KAMPF
if (($mission['reaktion_west'] == "Kapitulation" && $mission['reaktion_ost'] == "Kampf") || ($mission['reaktion_west'] == "Kampf" && $mission['reaktion_ost'] == "Kapitulation"))
{

// Wer hat gesiegt?
if ($mission['reaktion_west'] == "Kapitulation") {$sieger = "ost"; $verlierer = "west";} else {$sieger = "west"; $verlierer = "ost";}

// Alle Teilhaber (Spawnpunkte/Sammelstellen/Feldlager/Basen) einer Mission bündeln
$gebiete = mysqli_fetch_array(mysqli_query($db, "SELECT gebiete FROM missionen")); $gebiete = explode(';;', $gebiete[0]);
$basen = mysqli_fetch_array(mysqli_query($db, "SELECT basen FROM missionen")); $basen = explode(';;', $basen[0]);
$parteien = mysqli_fetch_array(mysqli_query($db, "SELECT parteien FROM missionen")); $parteien = explode(';;', $parteien[0]);
$truppen = mysqli_fetch_array(mysqli_query($db, "SELECT truppen FROM missionen")); $truppen = explode(';;', $truppen[0]);


for ($i=0; $i<$teilhaber_anzahl; $i++) // erzeugt Array nach Muster: $teilhaber_0 [Lago,1,west,21243234;23212314]
{
${'teilhaber_'.$i} = array(
"gebiet" => $gebiete[$i],
"basis" => $basen[$i],
"partei" => $parteien[$i],
"truppe" => $truppen[$i],
);
}

print_r($teilhaber_0);

// alle Einheiten des Aufgebenden löschen

for ($i=0; $i<$teilhaber_anzahl; $i++)
{
if (${'teilhaber_'.$i}['partei'] == $verlierer)
{
$IDNR = explode(';', ${'teilhaber_'.$i}['truppe']);
$anzahl = count($IDNR); $j = 0;

while ($j < $anzahl)
{
$id = substr($IDNR[$j],-5);
mysqli_query($db, "DELETE FROM armeen WHERE id = '".$id."'");
$j++;
}
}
}

// Einheiten des Siegers in das neue Land verschieben
for ($i=0; $i<$teilhaber_anzahl; $i++)
{
if (${'teilhaber_'.$i}['partei'] != $verlierer)
{
$IDNR = explode(';', ${'teilhaber_'.$i}['truppe']);
$anzahl = count($IDNR); $j = 0;

while ($j < $anzahl)
{
$id = substr($IDNR[$j],-5);
mysqli_query($db, "UPDATE armeen SET gebiet = '".$teilhaber_0['gebiet']."' WHERE id = '".$id."'");
mysqli_query($db, "UPDATE armeen SET einsatz = '0' WHERE id = '".$id."'");
$j++;
}
}
}


// Parteiwechsel im aufgegebenen Gebiet
mysqli_query($db, "UPDATE gebiete SET partei = '".$sieger."' WHERE gebiet = '".$teilhaber_0['gebiet']."'");

// Befehle löschen
$befehlsnrr = mysqli_fetch_array(mysqli_query($db, "SELECT befehlsnr FROM missionen WHERE operation = '".$mission['operation']."'"));

$befehlsnr = explode(';;', $befehlsnrr[0]);
$anzahl = count($befehlsnr); $i = 0;


while ($i < $anzahl)
{
$result1 = mysqli_query($db, "DELETE FROM befehle WHERE befehlsnr = '".$befehlsnr[$i]."'");
$i++;
}

// Mission löschen
mysqli_query($db, "DELETE FROM missionen WHERE mission_id = '".$mission['mission_id']."'");
}



// FLUCHT - KAMPF
if (($mission['reaktion_west'] != "Kapitulation" && $mission['reaktion_ost'] != "Kampf") || ($mission['reaktion_west'] != "Kampf" && $mission['reaktion_ost'] != "Kapitulation"))
{


// Wer hat gesiegt?
if ($mission['reaktion_west'] != "Kampf") {$sieger = "ost"; $verlierer = "west";} else {$sieger = "west"; $verlierer = "ost";}



// Wohin wird geflüchtet?
if($sieger == "west") { $fluchtgebiet = $mission['reaktion_ost']; } else { $fluchtgebiet = $mission['reaktion_west']; }


// Alle Teilhaber (Spawnpunkte/Sammelstellen/Feldlager/Basen) einer Mission bündeln
$gebiete = mysqli_fetch_array(mysqli_query($db, "SELECT gebiete FROM missionen")); $gebiete = explode(';;', $gebiete[0]);
$basen = mysqli_fetch_array(mysqli_query($db, "SELECT basen FROM missionen")); $basen = explode(';;', $basen[0]);
$parteien = mysqli_fetch_array(mysqli_query($db, "SELECT parteien FROM missionen")); $parteien = explode(';;', $parteien[0]);
$truppen = mysqli_fetch_array(mysqli_query($db, "SELECT truppen FROM missionen")); $truppen = explode(';;', $truppen[0]);


$teilhaber_anzahl = count($gebiete);

for ($i=0; $i<$teilhaber_anzahl; $i++) // erzeugt Array nach Muster: $teilhaber_0 [Lago,1,west,21243234;23212314]
{
${'teilhaber_'.$i} = array(
"gebiet" => $gebiete[$i],
"basis" => $basen[$i],
"partei" => $parteien[$i],
"truppe" => $truppen[$i],
);
}


// alle Einheiten des Aufgebenden verschieben

for ($i=0; $i<$teilhaber_anzahl; $i++)
{
if (${'teilhaber_'.$i}['partei'] == $verlierer)
{
$IDNR = explode(';', ${'teilhaber_'.$i}['truppe']);
$anzahl = count($IDNR); $j = 0;

while ($j < $anzahl)
{
$id = substr($IDNR[$j],-5);
mysqli_query($db, "UPDATE armeen SET gebiet = '".$fluchtgebiet."' WHERE id = '".$id."'");
mysqli_query($db, "UPDATE armeen SET einsatz = '0' WHERE id = '".$id."'");
$j++;
}
}
}

// Einheiten des Siegers in das neue Land verschieben
for ($i=0; $i<$teilhaber_anzahl; $i++)
{
if (${'teilhaber_'.$i}['partei'] != $verlierer)
{
$IDNR = explode(';', ${'teilhaber_'.$i}['truppe']);
$anzahl = count($IDNR); $j = 0;

while ($j < $anzahl)
{
$id = substr($IDNR[$j],-5);
mysqli_query($db, "UPDATE armeen SET gebiet = '".$teilhaber_0['gebiet']."' WHERE id = '".$id."'");
mysqli_query($db, "UPDATE armeen SET einsatz = '0' WHERE id = '".$id."'");
$j++;
}
}
}


// Parteiwechsel im aufgegebenen Gebiet
mysqli_query($db, "UPDATE gebiete SET partei = '".$sieger."' WHERE gebiet = '".$teilhaber_0['gebiet']."'");

// Befehle löschen
$befehlsnrr = mysqli_fetch_array(mysqli_query($db, "SELECT befehlsnr FROM missionen WHERE operation = '".$mission['operation']."'"));

$befehlsnr = explode(';;', $befehlsnrr[0]);
$anzahl = count($befehlsnr); $i = 0;


while ($i < $anzahl)
{
$result1 = mysqli_query($db, "DELETE FROM befehle WHERE befehlsnr = '".$befehlsnr[$i]."'");
$i++;
}

// Mission löschen
mysqli_query($db, "DELETE FROM missionen WHERE mission_id = '".$mission['mission_id']."'");
}



// FLUCHT - FLUCHT

// FLUCHT - KAPITULATION

// KAMPF - KAMPF

if ($mission['reaktion_west'] == "Kampf" && $mission['reaktion_ost'] == "Kampf")
{

mysqli_query($db, "UPDATE missionen SET done = '1' WHERE mission_id = '".$mission['mission_id']."'");


//fn_OurAltisInit.sqf schreiben
//Header


$fn_OurAltisInit_sqf_header = "
#include \"macros.hpp\"
GVAR(MarkerAccuracy) = 500;
if(isServer) then {

GVAR(BaseList) = [];
GVAR(Infantry) = [];
GVAR(VehicleListVirtual) = [];
GVAR(OperationName) = \"".$mission['operation']."\";
";


//Basen und Feldlager

$gebiete = explode(";;", $mission['gebiete']);
$parteien = explode(";;", $mission['parteien']);
$basen = explode(";;", $mission['basen']);
$upgrade = explode(";;", $mission['upgrade']);


for ($i=0;$i<count($gebiete);$i++)
{

// Upgradezahlen von römisch in arabisch umwandeln
switch ($upgrade[$i]) {
case "I":
$level = "1";
break;
case "II":
$level = "2";
break;
case "III":
$level = "3";
break;
case "IV":
$level = "4";
break;
case "V":
$level = "5";
break;
case "VI":
$level = "6";
break;
default:
$level = "1";
}



$coords = mysqli_fetch_array(mysqli_query($db, "SELECT * FROM gebiete WHERE gebiet = '".$gebiete[$i]."'"));
if ($parteien[$i] == "west") { $parteien[$i] = "blufor"; } else { $parteien[$i] = "east"; }
${'spawn_'.$i} = "[[".$coords['fix1'].",".$coords['fix2']."], ".$parteien[$i].", \"".$gebiete[$i]."\", ".$basen[$i].", ".$level."]";
}


$fn_OurAltisInit_sqf_bases = "";
for ($i=0;$i<count($gebiete);$i++)
{
$fn_OurAltisInit_sqf_bases = $fn_OurAltisInit_sqf_bases.${'spawn_'.$i};
if($i+1 != count($gebiete)) {$fn_OurAltisInit_sqf_bases = $fn_OurAltisInit_sqf_bases.", ";}
}


$fn_OurAltisInit_sqf_bases = "[".$fn_OurAltisInit_sqf_bases."] call FUNC(createBases);";


//Wetter [0,1,0]

$wetter_teile = str_split($mission['wetter']);
$wetter = $wetter_teile[0].",".$wetter_teile[1].",".$wetter_teile[2];

$fn_OurAltisInit_sqf_wether = "[".$wetter."] call FUNC(setMissionParameter);";





//Fahrzeuge ["classname", "ID1", 1, 0, "Conner"]


$gebiete = explode(";;", $mission['gebiete']);
$truppen = explode(";;", $mission['truppen']);
$fn_OurAltisInit_sqf_geraet = "";
$add_besatzung = array();


for ($i=0;$i<count($gebiete);$i++)
{
$truppen_array = explode(";", $truppen[$i]);

${'fahrer_'.$gebiete[$i]} = 0;
${'crew_'.$gebiete[$i]} = 0;
${'pilot_'.$gebiete[$i]} = 0;


for ($j=0;$j<count($truppen_array);$j++)
{
$stat = mysqli_fetch_array(mysqli_query($db, "SELECT * FROM armeen WHERE id = '".substr($truppen_array[$j],3,5)."'"));
$tank = $stat['tank']/100;
$bestand = (100-$stat['bestand'])/100;
$besatzung = $stat['besatzung'];


if (substr($truppen_array[$j],0,3) == 211) { $fn_OurAltisInit_sqf_geraet .= "[\"B_Truck_01_covered_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'fahrer_'.$gebiete[$i]}++;}
if (substr($truppen_array[$j],0,3) == 221) { $fn_OurAltisInit_sqf_geraet .= "[\"B_Truck_01_Repair_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'fahrer_'.$gebiete[$i]}++;}
if (substr($truppen_array[$j],0,3) == 231) { $fn_OurAltisInit_sqf_geraet .= "[\"B_Truck_01_medical_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'fahrer_'.$gebiete[$i]}++;}
if (substr($truppen_array[$j],0,3) == 241) { $fn_OurAltisInit_sqf_geraet .= "[\"B_Truck_01_fuel_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'fahrer_'.$gebiete[$i]}++;}
if (substr($truppen_array[$j],0,3) == 311) { $fn_OurAltisInit_sqf_geraet .= "[\"B_MRAP_01_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'fahrer_'.$gebiete[$i]}++;}
if (substr($truppen_array[$j],0,3) == 321) { $fn_OurAltisInit_sqf_geraet .= "[\"B_MRAP_01_hmg_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'fahrer_'.$gebiete[$i]}+=2;}
if (substr($truppen_array[$j],0,3) == 411) { $fn_OurAltisInit_sqf_geraet .= "[\"B_APC_Wheeled_01_cannon_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'crew_'.$gebiete[$i]}+=3;}
if (substr($truppen_array[$j],0,3) == 421) { $fn_OurAltisInit_sqf_geraet .= "[\"B_MBT_01_mlrs_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'crew_'.$gebiete[$i]}+=2;}
if (substr($truppen_array[$j],0,3) == 431) { $fn_OurAltisInit_sqf_geraet .= "[\"B_MBT_01_cannon_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'crew_'.$gebiete[$i]}+=3;}
if (substr($truppen_array[$j],0,3) == 511) { $fn_OurAltisInit_sqf_geraet .= "[\"B_Heli_Transport_01_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'pilot_'.$gebiete[$i]}+=4;}
if (substr($truppen_array[$j],0,3) == 521) { $fn_OurAltisInit_sqf_geraet .= "[\"B_Heli_Attack_01_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'pilot_'.$gebiete[$i]}+=2;}
if (substr($truppen_array[$j],0,3) == 531) { $fn_OurAltisInit_sqf_geraet .= "[\"B_UAV_02_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], "; }
if (substr($truppen_array[$j],0,3) == 212) { $fn_OurAltisInit_sqf_geraet .= "[\"O_Truck_03_covered_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'fahrer_'.$gebiete[$i]}++;}
if (substr($truppen_array[$j],0,3) == 222) { $fn_OurAltisInit_sqf_geraet .= "[\"O_Truck_03_repair_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'fahrer_'.$gebiete[$i]}++;}
if (substr($truppen_array[$j],0,3) == 232) { $fn_OurAltisInit_sqf_geraet .= "[\"O_Truck_03_medical_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'fahrer_'.$gebiete[$i]}++;}
if (substr($truppen_array[$j],0,3) == 242) { $fn_OurAltisInit_sqf_geraet .= "[\"O_Truck_03_fuel_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'fahrer_'.$gebiete[$i]}++;}
if (substr($truppen_array[$j],0,3) == 312) { $fn_OurAltisInit_sqf_geraet .= "[\"O_MRAP_02_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'fahrer_'.$gebiete[$i]}++;}
if (substr($truppen_array[$j],0,3) == 322) { $fn_OurAltisInit_sqf_geraet .= "[\"O_MRAP_02_hmg_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'fahrer_'.$gebiete[$i]}+=2;}
if (substr($truppen_array[$j],0,3) == 412) { $fn_OurAltisInit_sqf_geraet .= "[\"O_APC_Wheeled_02_rcws_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'crew_'.$gebiete[$i]}+=3;}
if (substr($truppen_array[$j],0,3) == 422) { $fn_OurAltisInit_sqf_geraet .= "[\"O_APC_Tracked_02_AA_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'crew_'.$gebiete[$i]}+=2;}
if (substr($truppen_array[$j],0,3) == 432) { $fn_OurAltisInit_sqf_geraet .= "[\"O_MBT_02_cannon_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'crew_'.$gebiete[$i]}+=3;}
if (substr($truppen_array[$j],0,3) == 512) { $fn_OurAltisInit_sqf_geraet .= "[\"O_Heli_Light_02_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'pilot_'.$gebiete[$i]}+=2;}
if (substr($truppen_array[$j],0,3) == 522) { $fn_OurAltisInit_sqf_geraet .= "[\"O_Heli_Attack_02_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], ";
${'pilot_'.$gebiete[$i]}+=2;}
if (substr($truppen_array[$j],0,3) == 532) { $fn_OurAltisInit_sqf_geraet .= "[\"O_UAV_02_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]." ], "; }
}

${'array_fahrer_'.$gebiete[$i]} = array('Fahrer', ${'fahrer_'.$gebiete[$i]}, $gebiete[$i]);
${'array_crew_'.$gebiete[$i]} = array('Crew', ${'crew_'.$gebiete[$i]}, $gebiete[$i]);
${'array_pilot_'.$gebiete[$i]} = array('Pilot', ${'pilot_'.$gebiete[$i]}, $gebiete[$i]);

array_push($add_besatzung, ${'array_fahrer_'.$gebiete[$i]}, ${'array_crew_'.$gebiete[$i]}, ${'array_pilot_'.$gebiete[$i]});

}
$fn_OurAltisInit_sqf_geraet = "[".substr($fn_OurAltisInit_sqf_geraet, 0, -2)."] call FUNC(createVehicles);";






//echo count($add_besatzung);

$key = array_search('Sofia', $add_besatzung[0]);


//Infanterie ["Rifleman", 5, "Conner"]

$gebiete = explode(";;", $mission['gebiete']);
$truppen = explode(";;", $mission['truppen']);
$fn_OurAltisInit_sqf_inf = "";

for ($i=0;$i<count($gebiete);$i++)
{
$truppen_array = explode(";", $truppen[$i]);

$schz=0; $gren=0; $mgsc=0; $atsc=0; $aasc=0; $scsc=0; $aufk=0; $sani=0; $inge=0; $fahr=0; $crew=0; $pilo=0;

//Infanterietypen zählen
for ($j=0;$j<count($truppen_array);$j++)
{
if (substr($truppen_array[$j],0,2) == 11) { $schz++; }
if (substr($truppen_array[$j],0,2) == 12) { $gren++; }
if (substr($truppen_array[$j],0,2) == 13) { $mgsc++; }
if (substr($truppen_array[$j],0,2) == 14) { $atsc++; }
if (substr($truppen_array[$j],0,2) == 15) { $aasc++; }
if (substr($truppen_array[$j],0,2) == 16) { $scsc++; }
if (substr($truppen_array[$j],0,2) == 17) { $aufk++; }
if (substr($truppen_array[$j],0,2) == 18) { $sani++; }
if (substr($truppen_array[$j],0,2) == 19) { $inge++; }
}


//Zusätzliche Besatzung ermitteln
for ($ij=0;$ij<count($add_besatzung);$ij++)
{
if(array_search($gebiete[$i], $add_besatzung[$ij]) == 2 && $add_besatzung[$ij][0] == "Fahrer") {$fahr = $add_besatzung[$ij][1];}
if(array_search($gebiete[$i], $add_besatzung[$ij]) == 2 && $add_besatzung[$ij][0] == "Crew") {$crew = $add_besatzung[$ij][1];}
if(array_search($gebiete[$i], $add_besatzung[$ij]) == 2 && $add_besatzung[$ij][0] == "Pilot") {$pilo = $add_besatzung[$ij][1];}
}


//in ARMA-Code verwandeln
if ($schz > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Rifleman\", ".$schz.", \"".$gebiete[$i]."\"], "; }
if ($gren > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Grenadier\", ".$gren.", \"".$gebiete[$i]."\"], "; }
if ($mgsc > 0) { $fn_OurAltisInit_sqf_inf .= "[\"MG\", ".$mgsc.", \"".$gebiete[$i]."\"], "; }
if ($atsc > 0) { $fn_OurAltisInit_sqf_inf .= "[\"AT\", ".$atsc.", \"".$gebiete[$i]."\"], "; }
if ($aasc > 0) { $fn_OurAltisInit_sqf_inf .= "[\"AA\", ".$aasc.", \"".$gebiete[$i]."\"], "; }
if ($scsc > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Marksman\", ".$scsc.", \"".$gebiete[$i]."\"], "; }
if ($aufk > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Spotter\", ".$aufk.", \"".$gebiete[$i]."\"], "; }
if ($sani > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Medic\", ".$sani.", \"".$gebiete[$i]."\"], "; }
if ($inge > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Engineer\", ".$inge.", \"".$gebiete[$i]."\"], "; }
if ($fahr > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Driver\", ".$fahr.", \"".$gebiete[$i]."\"], "; }
if ($crew > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Crew\", ".$crew.", \"".$gebiete[$i]."\"], "; }
if ($pilo > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Pilot\", ".$pilo.", \"".$gebiete[$i]."\"], "; }
}

$fn_OurAltisInit_sqf_inf = "[".substr($fn_OurAltisInit_sqf_inf, 0, -2)."] call FUNC(configureInfantry);";





$fn_OurAltisInit_sqf_footer = "}; [] call FUNC(initializeGenericMissionPart); nil;";


//onloadnamen: Grenzkonflikt, Territorialkonflikt (mit Geiselnahme, Konvoiterminierung etc.)

$description_ext = "
#include \"config\cfgFunctions.cpp\"
#include \"config\cfgRespawnTemplates.cpp\"
#include \"macros.hpp\"

author=\"OurAltis\";
OnLoadName = \"Territorialkonflikt\";
onLoadMission = \"Operation ".$mission['operation']."\";

//loadScreen = \"bild.jpg\";

respawn = \"BASE\";
respawnDialog = 0;
respawnTemplates[] = {\"OurAltis\"};
respawnDelay = 13;

//allowFunctionsLog = 1;
saving = 0;


class Header {
gameType = SC;
minPlayers = 2;
maxPlayers = 8;
};

disabledAI = 1;
enableTeamSwitch = 0;

// disable all channels but the global text chat
disableChannels[]={{0,false,true},{1,true,false},{1,true,false},{1,true,false},{1,true,false},{1,true,false},{1,true,false}};


//debug stuff
enableDebugConsole = 1;
FUNCTIONS_RECOMPILE
";
}


//ORDNER IN missions ERSTELLEN
$operation_ordner = str_replace(" ","%20",$mission['operation']);
$operation_cycle = str_replace(" ","_",$mission['operation']);

//PROTOTYPEN KOPIEREN
include_once('inc/copy_folder.php');

$statsCopyFolder['bytes'] = 0;
$statsCopyFolder['files'] = 0;

$source = 'missions/_prototyp/';
$dest = 'missions/'.$operation_ordner.'.Altis/';
copyFolder($source, $dest, $statsCopyFolder, true);

$statsCopyFolder['bytes'] = binary_multiples($statsCopyFolder['bytes'], true, false);

//echo "<br><br>".$statsCopyFolder['files'] . ' Dateien kopiert ('.$statsCopyFolder['bytes'].').';
//echo "<br>Ziel: ".$dest;




//fn_OurAltisInit.sqf IN MISSIONS-ORDNER SCHREIBEN
$datei1 = fopen('missions/'.$operation_ordner.'.Altis/scripts/functions/init/fn_OurAltisInit.sqf','w');
fwrite($datei1, $fn_OurAltisInit_sqf_header." ".$fn_OurAltisInit_sqf_bases." ".$fn_OurAltisInit_sqf_wether." ".$fn_OurAltisInit_sqf_inf." ".$fn_OurAltisInit_sqf_geraet." ".$fn_OurAltisInit_sqf_footer);
fclose($datei1);

//description.ext IN MISSIONS-ORDNER SCHREIBEN
$datei2 = fopen('missions/'.$operation_ordner.'.Altis/description.ext','w');
fwrite($datei2, $description_ext);
fclose($datei2);

//BILD KOPIEREN
//$file1 = "missions/_prototyp/alter_bildname.jpg"; // alter Bildname richtet sich nach dem jeweiligen Szenario (Grenzkrieg/Territorialkonflik oder Sitemissions wie Geisel, Konvoi etc)
//$file2 = "missions/".$mission['operation'].".Altis/neuer_bildname.jpg"; // neuer Bildname sollte statisch und immer gleich lauten.
//copy($file1, $file2);




//PBO PACKEN
exec("start /b missions\cpbo.exe -y -p missions\\".$operation_ordner.".Altis missions\\".$operation_ordner.".altis.pbo");
//echo $output;


//PBO über FTP zum GAMESERVER


$server = 'IPIPIPIPIPIP';
$ftp_user_name = 'UN';
$ftp_user_pass = 'PASS';
$dest = "ArmA3_OPT_Fun2_Server\\mpmissions\\".$operation_ordner.".altis.pbo";
$source = "missions\\".$operation_ordner.".altis.pbo";

$connection = ftp_connect($server);
$login = ftp_login($connection, $ftp_user_name, $ftp_user_pass);
if (!$connection || !$login) { die('Connection attempt failed!'); }
ftp_pasv($connection, true);
$upload = ftp_put($connection, $dest, $source, FTP_BINARY);
if (!$upload) { echo 'FTP upload failed!'; }
ftp_close($connection);




//MISSIONS-ORDNER und PBO auf WEBSERVER LÖSCHEN


rmr('missions/'.$operation_ordner.'.Altis');

unlink('missions/'.$operation_ordner.'.altis.pbo');

$missions_cycle .= "class ".$operation_cycle." {template=".$operation_ordner.".Altis; cadetMode=0;};";



mysqli_query($db, "UPDATE status SET server = '".$fortschritt."'");

}
}


// SERVER.CFG SCHREIBEN

$server_cfg = "
// server.cfg

// STEAM
// steamport = 2700;
// steamqueryport = 2701;

// GLOBAL SETTINGS
// War
hostname = \"OurAltis Testserver\";
password = \"".$serverpw_neu."\";
passwordAdmin = \"admin\";
reportingIP = \"arma3pc.master.gamespy.com\";
logFile = \"server_console.log\";
timeStampFormat = \"full\";

// WELCOME MESSAGE
motd[] = {
\" \",
\"OUR ALTIS\",
\"Round 1\",
\" \",
\"http://www.ouraltis.de/\",
\"TS3: ouraltis.de\",
\" \",
\" \",
\"by Recognite, Raven and PhilipJFry\",
\"special thanks to KalleK and Yoshi\",
};
motdInterval = 5;

maxPlayers = 103;
kickDuplicate = 1;
verifySignatures = 0;
equalModRequired = 0;
requiredSecureId = 2;
BattlEye = 0;

// VOTING
voteMissionPlayers = 0;
voteThreshold = 0.9;

// INGAME SETTINGS
disableVoN = 1;
vonCodecQuality = 10;
persistent = 1;

// SCRIPTING ISSUES
onUserConnected = \"\";
onUserDisconnected = \"\";
doubleIdDetected = \"\";

// SIGNATURE VERIFICATION
onUnsignedData = \"\";
onHackedData = \"kick (_this select 0)\";
onDifferentData = \"\";

// MISSIONS CYCLE
class Missions
{
".$missions_cycle."
};
";

//server.cfg IN SERVER_ORDNER schreiben
$datei3 = fopen('missions/opt4_Server.cfg','w');
fwrite($datei3, $server_cfg);
fclose($datei3);


//server.cfg über FTP zum GAMESERVER


$server = 'IPIPIPIPIPIP';
$ftp_user_name = 'UN';
$ftp_user_pass = 'PASS';
$dest = "Serverconfigs\\opt4_Server.cfg";
$source = "missions\\opt4_Server.cfg";

$connection = ftp_connect($server);
$login = ftp_login($connection, $ftp_user_name, $ftp_user_pass);
if (!$connection || !$login) { die('Connection attempt failed!'); }
ftp_pasv($connection, true);
$upload = ftp_put($connection, $dest, $source, FTP_BINARY);
if (!$upload) { echo 'FTP upload failed!'; }
ftp_close($connection);




//server.cfg auf WEBSERVER LÖSCHEN

unlink('missions/opt4_Server.cfg');

}

?>[/src]

Interessant hier sind eigentlich nur die erste 12 Zeilen, die ich von dir übernommen habe.
Außerdem sieht man in den Zeilen 661 das regelmäßige Updaten der DB mit dem Wert des Fortschritts. Das Klappt super.
 
Dann liegt dein Problem wohl wirklich am Session-Handling. PHP verwaltet Sessions standardmäßig in Textdateien auf der Festplatte.
Der session_start()-Aufruf in der serverstart.php öffnet die Textdatei des aktuellen Benutzers zum Lesen/Schreiben. Alle weiteren Aufrufe der table_status.php wollen dann ebenfalls die Session nutzen, allerdings ist die Datei noch durch die serverstart.php blockiert. Das äußert sich so, dass der Request "hängt" bis die Datei wieder freigegeben ist.

Lösung: Den session_start()-Aufruf vor den session_write_close() Aufruf schieben. Dann wird die Session-Datei geöffnet, gelesen, und gleich wieder geschlossen. $_SESSION sollte trotzdem erhalten bleiben, du scheinst ja keine Änderungen mehr daran vorzunehmen.
 
  • Thread Starter Thread Starter
  • #37
Jawoohhhhl! Wie geil. Ich freu mich wirklich sehr darüber, dass es jetzt klappt, wie gewünscht. Eine tolle Idee. Und das (für mich nicht nachvollziehbare): das Skript durchläuft die Schleifen ungefähr doppelt so schnell wie vorher. Ein Test der Missionen brachte auch keine neuen Fehler. Ich bin fasziniert.
 
Zuletzt bearbeitet:
Ist eine Option für dich?

edit: SOrry, hab irgendwie die 2. Seite komplett übersehen
 
Zuletzt bearbeitet:
Ist eine Option für dich?

Das Problem hierbei wäre, der Befehl "blockt" die weitere Ausführung, es wird auf das Ergebnis des Befehl gewartet der mit Exec gestartet wird. ;)

Wobei... sorry Werner, ich glaube du hast gar nicht mal Unrecht, aus dem Manual...:

Hinweis:

Falls Sie diese Funktion benutzen, um ein Programm zu starten und im Hintergrund weiterlaufen lassen möchten, müssen Sie sicherstellen, dass die Ausgabe des Programms in eine Datei oder einen anderen Ausgabestream umgeleitet wird. Anderenfalls wird PHP solange hängen, bis das Programm zu Ende ausgeführt wurde.

Könnte also doch eine Option sein :T
 
Zurück
Oben