• 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
  • 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.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
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.
 

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • 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.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
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.
 

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • 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.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
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. ;)
 

Rakorium-M

NGBler

Registriert
14 Juli 2013
Beiträge
413
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 pcntl_fork - 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.
 

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • 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:

Rakorium-M

NGBler

Registriert
14 Juli 2013
Beiträge
413
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?
 

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • 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.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
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?
 

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • 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
 

Rakorium-M

NGBler

Registriert
14 Juli 2013
Beiträge
413
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 php-resque. 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.
 

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • 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.
 

Rakorium-M

NGBler

Registriert
14 Juli 2013
Beiträge
413
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.
 

nietaL

NGBler

Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
  • 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:

werner

Suchtspielmacher (ehm.)

Registriert
20 Juli 2014
Beiträge
743
Ort
Mannheim
Ist exec eine Option für dich?

edit: SOrry, hab irgendwie die 2. Seite komplett übersehen
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
Ist exec 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
 
Oben