Seite 2 von 2 ErsteErste 12
Ergebnis 26 bis 40 von 40

Thema: Zwei php-Skripte parallel (Auslagerung)

  1. #26

    Re: Zwei php-Skripte parallel (Auslagerung)

    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.
    Gruß theSplit
    @ At times we run, most we walk, others we stand; but we never stop. @
    +++ NGB-Statistik Opt-Out/Anonymisierung +++ KISS Ebook Starter [Linux] +++
    +++ Git +++

  2. #27
    Mitglied

    (Threadstarter)


    Registriert seit
    Sep 2013
    Ort
    Exilgullianer
    Beiträge
    168

    Re: Zwei php-Skripte parallel (Auslagerung)

    Danke erstmal für deine Teilnahme am Diskurs Ich werde Cronjob noch einmal prüfen!
    Für diesen Beitrag bedankt sich theSplit

  3. #28

    Re: Zwei php-Skripte parallel (Auslagerung)

    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:
    Code (PHP):
    1. $size = ob_get_length();
    2. header("Content-Length: $size");
    3. header('Connection: close');
    4. set_time_limit(300); // Oder wie lange auch immer dein Script braucht
    5.  
    6. // Eigentlicher Code
    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):
    Code (PHP):
    1. $url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['REQUEST_URI']) . '/erzeugen.php';
    2.  
    3. // V1 - Aufruf durch Server
    4. get_headers($url); // Der Server ruft die erzeugen.php selber auf - Cookies / Sessions werden nicht übernommen
    5.  
    6. // V2 - Aufruf durch Browser
    7. 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.
    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.

  4. #29
    Mitglied

    (Threadstarter)


    Registriert seit
    Sep 2013
    Ort
    Exilgullianer
    Beiträge
    168

    Re: Zwei php-Skripte parallel (Auslagerung)

    Danke für deine Idee. Ich rufe bisher die erzeugen.php per AJAX von der anzeigen.php aus auf.

    Code (JavaScript):
    1. if ($status_abfrage['server'] ==0)
    2. {
    3. echo "
    4. <script language=\"javascript\" >
    5.         xmlhttp=new XMLHttpRequest();
    6.                     xmlhttp.open(\"GET\",\"erzeugen.php\",true);
    7.                     xmlhttp.send();
    8. </script> ";
    9.  
    10. }
    11.  
    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.


    Code (PHP):
    1.  
    2. <?php
    3. if ($status_abfrage['server'] ==0)
    4. {
    5. ?>
    6. <img style="display: none" src="erzeugen.php">
    7. <?php
    8. }
    9. ?>
    10.  
    Das bringts auch nicht. Er lädt und lädt. Mir scheint, das Kappen der Verbindung funktioniert nicht.
    Geändert von nietaL (13.03.17 um 23:46 Uhr)

  5. #30

    Re: Zwei php-Skripte parallel (Auslagerung)

    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
    Code (JavaScript):
    1. xmlhttp.open('GET', 'erzeugen.php?rnd='+Math.random(), true);
    Edit: Nach meinem erzeugen.php-Code kannst du (in der erzeugen.php) nur noch lesend auf $_SESSION zugreifen. Könnte das ein Problem werden?

  6. #31
    Mitglied

    (Threadstarter)


    Registriert seit
    Sep 2013
    Ort
    Exilgullianer
    Beiträge
    168

    Re: Zwei php-Skripte parallel (Auslagerung)

    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.

  7. #32

    Re: Zwei php-Skripte parallel (Auslagerung)

    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?
    Gruß theSplit
    @ At times we run, most we walk, others we stand; but we never stop. @
    +++ NGB-Statistik Opt-Out/Anonymisierung +++ KISS Ebook Starter [Linux] +++
    +++ Git +++

  8. #33
    Mitglied

    (Threadstarter)


    Registriert seit
    Sep 2013
    Ort
    Exilgullianer
    Beiträge
    168

    Re: Zwei php-Skripte parallel (Auslagerung)

    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

  9. #34

    Re: Zwei php-Skripte parallel (Auslagerung)

    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.

  10. #35
    Mitglied

    (Threadstarter)


    Registriert seit
    Sep 2013
    Ort
    Exilgullianer
    Beiträge
    168

    Re: Zwei php-Skripte parallel (Auslagerung)

    Zitat Zitat von Rakorium-M Beitrag anzeigen
    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.
    Code (PHP):
    1. <?php ob_start(); ?>
    2. <!doctype html>
    3. <html>
    4. <head>
    5. <meta charset="utf-8">
    6. <link rel="stylesheet" type="text/css" href="stil.css">
    7.  
    8. <link rel="icon" type="image/x-icon" href="img/fav.png">
    9. <link rel="shortcut icon" type="image/x-icon" href="img/fav.png">
    10. <link type="image/x-icon" href="img/fav.png">
    11.  
    12. <title>OurAltis.de</title>
    13. <script src="js/jquery.js"></script>
    14. </head>
    15.  
    16. <?php
    17. include 'inc/log_check.php';
    18. include 'inc/sprachen.php';
    19.  
    20. $datenbank = "speicher_".$_SESSION['slot'];
    21. include 'inc/db_connect.php';
    22.  
    23.  
    24. $status = mysqli_fetch_array(mysqli_query($db, "SELECT * FROM status"));
    25. if($_SESSION['partei'] == "west") {$eigenpartei = "phase_west"; $gegenpartei = "phase_ost";} elseif ($_SESSION['partei'] == "ost") { $eigenpartei = "phase_ost"; $gegenpartei = "phase_west"; }
    26.  
    27. if ($status[$eigenpartei]  == "P0") { header('Location: desk.php'); }
    28. if ($status[$eigenpartei]  == "P1") { header('Location: table1.php'); }
    29. if ($status[$eigenpartei]  == "R0") { header('Location: table2.php'); }
    30. if ($status[$eigenpartei]  == "R1") { header('Location: table3.php'); }
    31. if ($status[$eigenpartei]  == "S1") { header('Location: table5.php'); }
    32.  
    33.  
    34.  
    35. if($_SESSION['partei'] == '')
    36. {
    37.     echo "<body bgcolor=\"#333333\" style=\"overflow:hidden;\">";
    38. }elseif($_SESSION['partei'] == 'west') {
    39.  
    40.     echo "<body bgcolor=\"#003366\" style=\"overflow:hidden;\">";
    41. }elseif($_SESSION['partei'] == 'ost') {
    42.     echo "<body bgcolor=\"#993333\" style=\"overflow:hidden;\">";
    43. }
    44.  
    45. ?>
    46.  
    47. <script type="text/javascript" src="js/wz_dragdrop.js"></script>
    48.  
    49. <div style="position:absolute; z-index:5;">
    50.     <img src="img/lan_de.jpg" /> <a href="lang.php?lang=0&back=table4" class="link_tablet">deutsch</a>
    51.     <a class="text_tablet">&ensp;|&ensp;</a>
    52.     <img src="img/lan_en.jpg" /> <a href="lang.php?lang=1&back=table4" class="link_tablet">english</a>
    53.     <a class="text_tablet">&ensp;|&ensp;</a>
    54.     <img src="img/lan_fr.jpg" /> <a href="lang.php?lang=2&back=table4" class="link_tablet">français</a>
    55. </div>
    56.  
    57.  
    58. <?php
    59.     if($_SESSION['partei'] == "west") {$flagge = "flagge_west.jpg";}
    60. elseif($_SESSION['partei'] == "ost") {$flagge = "flagge_ost.jpg";}
    61. elseif(!isset($_SESSION['partei']) || $_SESSION['partei'] == "") {$flagge = "ausweis_leer.png";}
    62.  
    63. ?>
    64. <script type="text/javascript" src="js/wz_tooltip.js"></script>
    65.  
    66.  
    67.  
    68. <div style="position: absolute; width:95%; top: 50px; " align="right" ><img src="img/logo_klein2.png"  alt=""/></div>
    69.  
    70. <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>
    71.  
    72.  
    73. <div style="position:absolute; top:20px; left:0px; width:450px; height:300px;"><img id="flagge" src="img/<?php echo $flagge; ?>"></div>
    74.  
    75.  
    76.  
    77.  
    78. <div style="position: relative; border: 0px solid #000; color: #333; margin-left:auto; margin-right:auto; width:920px; top: 50px; " >
    79.  
    80. <script type="text/javascript">
    81.  $(document).ready(function() {
    82.    $("#status_mission").load("table_status4.php");
    83.    var refreshId = setInterval(function()
    84.    {
    85.       $("#status_mission").load('table_status4.php?' + 1*new Date());
    86.    }, 5000);
    87. }); </script>
    88.    
    89. <div id="status_mission" style="position: relative; border: 0px solid #000; color: #333; margin-left:auto; margin-right:auto; width:920px; top: 165px; " ></div>
    90. </div>
    91.  
    92.  
    93. <!-- Altische Zeitung -->
    94. <?php include 'table_zeitung.php'; ?>
    95.  
    96. <script type="text/javascript">
    97. <!--
    98.  
    99. SET_DHTML("altische");
    100.  
    101. //-->
    102.  
    103.  
    104. </script>
    105.  
    106.  
    107.  
    108. <?php
    109.  
    110. $status_abfrage = mysqli_fetch_array(mysqli_query($db, "SELECT * FROM status"));
    111.  
    112.  
    113. if ($status_abfrage['server'] ==0)
    114. {
    115. echo "
    116.  
    117. <script language=\"javascript\" >
    118.         xmlhttp=new XMLHttpRequest();
    119.                     xmlhttp.open(\"GET\",\"serverstart.php?rnd=\"+Math.random(), true);
    120.                     xmlhttp.send();
    121. </script> ";
    122.  
    123. }
    124.  
    125. ?>
    126.  
    127. </body>
    128. </html>
    129.  
    130.  

    statusbalken:
    Code (PHP):
    1. <?php
    2.  
    3.  
    4. include 'inc/log_check.php';
    5. $datenbank = "speicher_".$_SESSION['slot'];
    6. include 'inc/db_connect.php';
    7. include 'inc/sprachen.php';
    8.  
    9.  
    10. $status = mysqli_fetch_array(mysqli_query($db, "SELECT * FROM status"));
    11.  
    12.  
    13.  
    14.  
    15.     ?>
    16.         <a class="formular_titel"><?php echo $T_spielstart[$L]; ?></a>
    17.  
    18.     <table border="0" style="width:100%; color:#FFF; text-align:center;">
    19.     <tr>
    20.     <td>
    21.     <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">&nbsp;</a></div></div>
    22.     </td>
    23.     </tr>
    24.     <tr>
    25.     <td>
    26.     <?php echo $status['server']."%"; ?>
    27.     </td>
    28.     </tr>
    29.     </table>   
    30.  
    31.  
    32. <?php
    33. if($status['server'] == 100)
    34. {
    35. ?>
    36.     <div id="buttons" style="position: relative; border: 0px solid #000; color: #333; margin-left:auto; margin-right:auto; width:920px; top: 130px; " >
    37.         <input type="button" class="btn" value="<?php echo $B_auswerten[$L]; ?>" onClick="">&emsp;&emsp;&emsp;
    38.         <input type="button" class="btn" value="<?php echo $B_abmelden[$L]; ?>" onClick="window.location='logout.php';">
    39.     </div>
    40. <?php
    41. }
    42. ?>
    das ist die hier genannte serverstart.php (erzeugen), die im ersten Skript (anzeigen) in den Zeilen 110-125 per AJAX augerufen wird:
    Code:
    1. <?php
    2. ob_start();
    3. $size = ob_get_length();
    4. header("Content-Length: ".$size);
    5. header('Connection: close');
    6. ob_end_flush();
    7. ob_flush();
    8. flush();
    9. @session_write_close();
    10. set_time_limit(200); // Oder wie lange auch immer dein Script braucht
    11. ignore_user_abort(true);
    12.  
    13.  
    14.  
    15. session_start();
    16.  
    17. include 'inc/db_connect.php';
    18.  
    19.  
    20. //Funktion: rekursives Löschen
    21. function rmr($dir) {
    22.     if (is_dir($dir)) {
    23.         $dircontent=scandir($dir);
    24.         foreach ($dircontent as $c) {
    25.             if ($c!='.' and $c!='..' and is_dir($dir.'/'.$c)) {
    26.             rmr($dir.'/'.$c);
    27.             } else if ($c!='.' and $c!='..') {
    28.             unlink($dir.'/'.$c);
    29.             }
    30.         }
    31.         rmdir($dir);
    32.     } else {
    33.         unlink($dir);
    34.     }
    35. }
    36.  
    37. $datenbank = "speicher_".$_SESSION['slot'];
    38. include 'inc/db_connect.php';
    39.  
    40.  
    41.  
    42.  
    43. //SERVERSTATUS
    44.  
    45. $status_abfrage = mysqli_fetch_array(mysqli_query($db, "SELECT * FROM status"));
    46.  
    47.  
    48.  
    49. if ($status_abfrage['server'] !=0)
    50. {
    51.     exit;
    52. }
    53. else if ($status_abfrage['server'] == 0)
    54. {
    55.     mysqli_query($db, "UPDATE status SET server = '1'");                    //Serverstatus "laufend(9)"
    56.     $zufall = rand(100,999);
    57.     mysqli_query($db, "UPDATE status SET serverpw = '".$zufall."'");        //Serverpasswort erstellen und speichern
    58.     $serverpw_neu = $zufall;
    59.  
    60.  
    61.    
    62.    
    63.     // alle Potentielle Missionen und Reaktionen auswerten 
    64.     // Welche Mission wird wirklich gespielt?
    65.    
    66.     $alle_missionen = mysqli_query($db, "SELECT * FROM missionen");
    67.    
    68.     $mission_zahl = mysqli_num_rows($alle_missionen);  
    69.     $generator_startwert = round(100 / $mission_zahl);      // =100/5=20
    70.     $generator_faktor = 1;
    71.  
    72.    
    73.     while ($mission = mysqli_fetch_array($alle_missionen))
    74.     {
    75.        
    76.         $fortschritt = $generator_startwert * $generator_faktor;
    77.         $generator_faktor++;           
    78.        
    79.         if ($mission['done'] != '1') //standard !='1'
    80.         {
    81.             // KAPITULATION - KAPITULATION (passiert höchstens beim Grenzkrieg)
    82.             if ($mission['reaktion_west'] == "Kapitulation" && $mission['reaktion_ost'] == "Kapitulation")
    83.             {
    84.                 // Status Einsatzkräfte auf "Kein Einsatz"
    85.                 $truppen = mysqli_fetch_array(mysqli_query($db, "SELECT truppen FROM missionen WHERE operation = '".$mission['operation']."'"));
    86.                
    87.                 $truppen = str_replace(";;", ";", $truppen[0]);
    88.                 $IDNR = explode(';', $truppen);
    89.                 $anzahl = count($IDNR); $i = 0;
    90.                
    91.                 while ($i < $anzahl)
    92.                 {  
    93.                     $id = substr($IDNR[$i],-5);
    94.                    
    95.                    
    96.                     mysqli_query($db, "UPDATE armeen SET einsatz = '0' WHERE id = '".$id."'");
    97.                     $i++;
    98.                 }
    99.        
    100.                 // Befehle löschen
    101.                 $befehlsnrr = mysqli_fetch_array(mysqli_query($db, "SELECT befehlsnr FROM missionen WHERE operation = '".$mission['operation']."'"));
    102.                
    103.                 $befehlsnr = explode(';;', $befehlsnrr[0]);
    104.                 $anzahl = count($befehlsnr); $i = 0;
    105.                
    106.                
    107.                 while ($i < $anzahl)
    108.                 {  
    109.                     $result1 = mysqli_query($db, "DELETE FROM befehle WHERE befehlsnr = '".$befehlsnr[$i]."'");
    110.                     $i++;
    111.                 }
    112.                
    113.                
    114.                 // Mission löschen
    115.                 mysqli_query($db, "DELETE FROM missionen WHERE mission_id = '".$mission['mission_id']."'");
    116.             }
    117.            
    118.             // KAPITULATION - KAMPF
    119.             if (($mission['reaktion_west'] == "Kapitulation" && $mission['reaktion_ost'] == "Kampf") || ($mission['reaktion_west'] == "Kampf" && $mission['reaktion_ost'] == "Kapitulation"))
    120.             {
    121.  
    122.                 // Wer hat gesiegt?
    123.                 if ($mission['reaktion_west'] == "Kapitulation") {$sieger = "ost"; $verlierer = "west";} else {$sieger = "west"; $verlierer = "ost";}
    124.                
    125.                 // Alle Teilhaber (Spawnpunkte/Sammelstellen/Feldlager/Basen) einer Mission bündeln
    126.                 $gebiete = mysqli_fetch_array(mysqli_query($db, "SELECT gebiete FROM missionen")); $gebiete = explode(';;', $gebiete[0]);
    127.                 $basen = mysqli_fetch_array(mysqli_query($db, "SELECT basen FROM missionen")); $basen = explode(';;', $basen[0]);
    128.                 $parteien = mysqli_fetch_array(mysqli_query($db, "SELECT parteien FROM missionen")); $parteien = explode(';;', $parteien[0]);
    129.                 $truppen = mysqli_fetch_array(mysqli_query($db, "SELECT truppen FROM missionen")); $truppen = explode(';;', $truppen[0]);
    130.                
    131.        
    132.                 for ($i=0; $i<$teilhaber_anzahl; $i++)                  // erzeugt Array nach Muster: $teilhaber_0 [Lago,1,west,21243234;23212314]
    133.                 {
    134.                     ${'teilhaber_'.$i} = array(
    135.                         "gebiet" => $gebiete[$i],
    136.                         "basis" => $basen[$i],
    137.                         "partei" => $parteien[$i],
    138.                         "truppe" => $truppen[$i],
    139.                     );
    140.                 }
    141.  
    142.                 print_r($teilhaber_0);     
    143.                
    144.                 // alle Einheiten des Aufgebenden löschen
    145.                
    146.                 for ($i=0; $i<$teilhaber_anzahl; $i++)                 
    147.                 {
    148.                     if (${'teilhaber_'.$i}['partei'] == $verlierer)
    149.                     {
    150.                         $IDNR = explode(';', ${'teilhaber_'.$i}['truppe']);
    151.                         $anzahl = count($IDNR); $j = 0;
    152.                        
    153.                         while ($j < $anzahl)
    154.                         {  
    155.                             $id = substr($IDNR[$j],-5);
    156.                             mysqli_query($db, "DELETE FROM armeen WHERE id = '".$id."'");
    157.                             $j++;
    158.                         }
    159.                     }
    160.                 }
    161.                
    162.                 // Einheiten des Siegers in das neue Land verschieben
    163.                 for ($i=0; $i<$teilhaber_anzahl; $i++)                 
    164.                 {
    165.                     if (${'teilhaber_'.$i}['partei'] != $verlierer)
    166.                     {
    167.                         $IDNR = explode(';', ${'teilhaber_'.$i}['truppe']);
    168.                         $anzahl = count($IDNR); $j = 0;
    169.                        
    170.                         while ($j < $anzahl)
    171.                         {  
    172.                             $id = substr($IDNR[$j],-5);
    173.                             mysqli_query($db, "UPDATE armeen SET gebiet = '".$teilhaber_0['gebiet']."' WHERE id = '".$id."'");
    174.                             mysqli_query($db, "UPDATE armeen SET einsatz = '0' WHERE id = '".$id."'");
    175.                             $j++;
    176.                         }
    177.                     }
    178.                 }
    179.        
    180.                
    181.                 // Parteiwechsel im aufgegebenen Gebiet
    182.                 mysqli_query($db, "UPDATE gebiete SET partei = '".$sieger."' WHERE gebiet = '".$teilhaber_0['gebiet']."'");
    183.                
    184.                 // Befehle löschen
    185.                 $befehlsnrr = mysqli_fetch_array(mysqli_query($db, "SELECT befehlsnr FROM missionen WHERE operation = '".$mission['operation']."'"));
    186.                
    187.                 $befehlsnr = explode(';;', $befehlsnrr[0]);
    188.                 $anzahl = count($befehlsnr); $i = 0;
    189.                
    190.                
    191.                 while ($i < $anzahl)
    192.                 {  
    193.                     $result1 = mysqli_query($db, "DELETE FROM befehle WHERE befehlsnr = '".$befehlsnr[$i]."'");
    194.                     $i++;
    195.                 }
    196.        
    197.                 // Mission löschen
    198.                 mysqli_query($db, "DELETE FROM missionen WHERE mission_id = '".$mission['mission_id']."'");
    199.             }
    200.        
    201.        
    202.        
    203.             // FLUCHT - KAMPF
    204.             if (($mission['reaktion_west'] != "Kapitulation" && $mission['reaktion_ost'] != "Kampf") || ($mission['reaktion_west'] != "Kampf" && $mission['reaktion_ost'] != "Kapitulation"))
    205.             {
    206.                
    207.                
    208.                 // Wer hat gesiegt?
    209.                 if ($mission['reaktion_west'] != "Kampf") {$sieger = "ost"; $verlierer = "west";} else {$sieger = "west"; $verlierer = "ost";}
    210.                
    211.                
    212.                
    213.                 // Wohin wird geflüchtet?
    214.                 if($sieger == "west") { $fluchtgebiet = $mission['reaktion_ost']; } else { $fluchtgebiet = $mission['reaktion_west']; }
    215.            
    216.                
    217.                 // Alle Teilhaber (Spawnpunkte/Sammelstellen/Feldlager/Basen) einer Mission bündeln
    218.                 $gebiete = mysqli_fetch_array(mysqli_query($db, "SELECT gebiete FROM missionen")); $gebiete = explode(';;', $gebiete[0]);
    219.                 $basen = mysqli_fetch_array(mysqli_query($db, "SELECT basen FROM missionen")); $basen = explode(';;', $basen[0]);
    220.                 $parteien = mysqli_fetch_array(mysqli_query($db, "SELECT parteien FROM missionen")); $parteien = explode(';;', $parteien[0]);
    221.                 $truppen = mysqli_fetch_array(mysqli_query($db, "SELECT truppen FROM missionen")); $truppen = explode(';;', $truppen[0]);
    222.                
    223.                
    224.                 $teilhaber_anzahl = count($gebiete);
    225.        
    226.                 for ($i=0; $i<$teilhaber_anzahl; $i++)                  // erzeugt Array nach Muster: $teilhaber_0 [Lago,1,west,21243234;23212314]
    227.                 {
    228.                     ${'teilhaber_'.$i} = array(
    229.                         "gebiet" => $gebiete[$i],
    230.                         "basis" => $basen[$i],
    231.                         "partei" => $parteien[$i],
    232.                         "truppe" => $truppen[$i],
    233.                     );
    234.                 }
    235.                        
    236.                
    237.                 // alle Einheiten des Aufgebenden verschieben
    238.                
    239.                 for ($i=0; $i<$teilhaber_anzahl; $i++)                 
    240.                 {
    241.                     if (${'teilhaber_'.$i}['partei'] == $verlierer)
    242.                     {
    243.                         $IDNR = explode(';', ${'teilhaber_'.$i}['truppe']);
    244.                         $anzahl = count($IDNR); $j = 0;
    245.                        
    246.                         while ($j < $anzahl)
    247.                         {  
    248.                             $id = substr($IDNR[$j],-5);
    249.                             mysqli_query($db, "UPDATE armeen SET gebiet = '".$fluchtgebiet."' WHERE id = '".$id."'");
    250.                             mysqli_query($db, "UPDATE armeen SET einsatz = '0' WHERE id = '".$id."'");
    251.                             $j++;
    252.                         }
    253.                     }
    254.                 }
    255.                
    256.                 // Einheiten des Siegers in das neue Land verschieben
    257.                 for ($i=0; $i<$teilhaber_anzahl; $i++)                 
    258.                 {
    259.                     if (${'teilhaber_'.$i}['partei'] != $verlierer)
    260.                     {
    261.                         $IDNR = explode(';', ${'teilhaber_'.$i}['truppe']);
    262.                         $anzahl = count($IDNR); $j = 0;
    263.                        
    264.                         while ($j < $anzahl)
    265.                         {  
    266.                             $id = substr($IDNR[$j],-5);
    267.                             mysqli_query($db, "UPDATE armeen SET gebiet = '".$teilhaber_0['gebiet']."' WHERE id = '".$id."'");
    268.                             mysqli_query($db, "UPDATE armeen SET einsatz = '0' WHERE id = '".$id."'");
    269.                             $j++;
    270.                         }
    271.                     }
    272.                 }
    273.        
    274.                
    275.                 // Parteiwechsel im aufgegebenen Gebiet
    276.                 mysqli_query($db, "UPDATE gebiete SET partei = '".$sieger."' WHERE gebiet = '".$teilhaber_0['gebiet']."'");
    277.                
    278.                 // Befehle löschen
    279.                 $befehlsnrr = mysqli_fetch_array(mysqli_query($db, "SELECT befehlsnr FROM missionen WHERE operation = '".$mission['operation']."'"));
    280.                
    281.                 $befehlsnr = explode(';;', $befehlsnrr[0]);
    282.                 $anzahl = count($befehlsnr); $i = 0;
    283.                
    284.                
    285.                 while ($i < $anzahl)
    286.                 {  
    287.                     $result1 = mysqli_query($db, "DELETE FROM befehle WHERE befehlsnr = '".$befehlsnr[$i]."'");
    288.                     $i++;
    289.                 }
    290.        
    291.                 // Mission löschen
    292.                 mysqli_query($db, "DELETE FROM missionen WHERE mission_id = '".$mission['mission_id']."'");
    293.             }
    294.            
    295.            
    296.            
    297.             // FLUCHT - FLUCHT
    298.            
    299.             // FLUCHT - KAPITULATION
    300.            
    301.             // KAMPF - KAMPF
    302.            
    303.             if ($mission['reaktion_west'] == "Kampf" && $mission['reaktion_ost'] == "Kampf")
    304.             {
    305.    
    306.                 mysqli_query($db, "UPDATE missionen SET done = '1' WHERE mission_id = '".$mission['mission_id']."'");
    307.        
    308.        
    309.                 //fn_OurAltisInit.sqf schreiben
    310.                 //Header
    311.                
    312.                
    313.                 $fn_OurAltisInit_sqf_header = "
    314.                                                 #include \"macros.hpp\"
    315.                                                 GVAR(MarkerAccuracy) = 500;
    316.                                                 if(isServer) then {
    317.        
    318.                                                 GVAR(BaseList) = [];
    319.                                                 GVAR(Infantry) = [];
    320.                                                 GVAR(VehicleListVirtual) = [];
    321.                                                 GVAR(OperationName) = \"".$mission['operation']."\";
    322.                                               ";
    323.        
    324.        
    325.                 //Basen und Feldlager
    326.                
    327.                 $gebiete = explode(";;", $mission['gebiete']);
    328.                 $parteien = explode(";;", $mission['parteien']);
    329.                 $basen = explode(";;", $mission['basen']);
    330.                 $upgrade = explode(";;", $mission['upgrade']);
    331.        
    332.                
    333.                 for ($i=0;$i<count($gebiete);$i++)
    334.                 {
    335.                    
    336.                     // Upgradezahlen von römisch in arabisch umwandeln
    337.                         switch ($upgrade[$i]) {
    338.                             case "I":
    339.                                 $level = "1";
    340.                                 break;
    341.                             case "II":
    342.                                 $level = "2";
    343.                                 break;
    344.                             case "III":
    345.                                 $level = "3";
    346.                                 break;
    347.                             case "IV":
    348.                                 $level = "4";
    349.                                 break;
    350.                             case "V":
    351.                                 $level = "5";
    352.                                 break;
    353.                             case "VI":
    354.                                 $level = "6";
    355.                                 break;
    356.                             default:
    357.                                 $level = "1";
    358.                         }
    359.                    
    360.                    
    361.                    
    362.                     $coords = mysqli_fetch_array(mysqli_query($db, "SELECT * FROM gebiete WHERE gebiet = '".$gebiete[$i]."'"));
    363.                     if ($parteien[$i] == "west") { $parteien[$i] = "blufor"; } else { $parteien[$i] = "east"; }
    364.                     ${'spawn_'.$i} = "[[".$coords['fix1'].",".$coords['fix2']."], ".$parteien[$i].", \"".$gebiete[$i]."\", ".$basen[$i].", ".$level."]";
    365.                 }
    366.                    
    367.                
    368.                 $fn_OurAltisInit_sqf_bases = "";   
    369.                 for ($i=0;$i<count($gebiete);$i++)
    370.                 {
    371.                     $fn_OurAltisInit_sqf_bases =  $fn_OurAltisInit_sqf_bases.${'spawn_'.$i};
    372.                     if($i+1 != count($gebiete)) {$fn_OurAltisInit_sqf_bases = $fn_OurAltisInit_sqf_bases.", ";}
    373.                 }
    374.                
    375.                
    376.                 $fn_OurAltisInit_sqf_bases = "[".$fn_OurAltisInit_sqf_bases."] call FUNC(createBases);";
    377.                
    378.                
    379.                 //Wetter [0,1,0]
    380.                
    381.                 $wetter_teile = str_split($mission['wetter']);
    382.                 $wetter = $wetter_teile[0].",".$wetter_teile[1].",".$wetter_teile[2];      
    383.        
    384.                 $fn_OurAltisInit_sqf_wether = "[".$wetter."] call FUNC(setMissionParameter);";
    385.                
    386.                                
    387.                
    388.                
    389.                
    390.                 //Fahrzeuge ["classname", "ID1", 1, 0, "Conner"]
    391.                
    392.                
    393.                 $gebiete = explode(";;", $mission['gebiete']);
    394.                 $truppen = explode(";;", $mission['truppen']);
    395.                 $fn_OurAltisInit_sqf_geraet = "";
    396.                 $add_besatzung = array();
    397.    
    398.        
    399.                 for ($i=0;$i<count($gebiete);$i++)
    400.                 {
    401.                     $truppen_array = explode(";", $truppen[$i]);
    402.                    
    403.                     ${'fahrer_'.$gebiete[$i]} = 0;
    404.                     ${'crew_'.$gebiete[$i]} = 0;
    405.                     ${'pilot_'.$gebiete[$i]} = 0;
    406.    
    407.                
    408.                     for ($j=0;$j<count($truppen_array);$j++)
    409.                     {
    410.                         $stat = mysqli_fetch_array(mysqli_query($db, "SELECT * FROM armeen WHERE id = '".substr($truppen_array[$j],3,5)."'"));
    411.                         $tank = $stat['tank']/100;
    412.                         $bestand = (100-$stat['bestand'])/100;
    413.                         $besatzung = $stat['besatzung'];
    414.    
    415.                        
    416.                         if (substr($truppen_array[$j],0,3) == 211) { $fn_OurAltisInit_sqf_geraet .= "[\"B_Truck_01_covered_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    417.                                                                      ${'fahrer_'.$gebiete[$i]}++;}
    418.                         if (substr($truppen_array[$j],0,3) == 221) { $fn_OurAltisInit_sqf_geraet .= "[\"B_Truck_01_Repair_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    419.                                                                      ${'fahrer_'.$gebiete[$i]}++;}
    420.                         if (substr($truppen_array[$j],0,3) == 231) { $fn_OurAltisInit_sqf_geraet .= "[\"B_Truck_01_medical_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    421.                                                                      ${'fahrer_'.$gebiete[$i]}++;}
    422.                         if (substr($truppen_array[$j],0,3) == 241) { $fn_OurAltisInit_sqf_geraet .= "[\"B_Truck_01_fuel_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    423.                                                                      ${'fahrer_'.$gebiete[$i]}++;}
    424.                         if (substr($truppen_array[$j],0,3) == 311) { $fn_OurAltisInit_sqf_geraet .= "[\"B_MRAP_01_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    425.                                                                      ${'fahrer_'.$gebiete[$i]}++;}
    426.                         if (substr($truppen_array[$j],0,3) == 321) { $fn_OurAltisInit_sqf_geraet .= "[\"B_MRAP_01_hmg_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    427.                                                                      ${'fahrer_'.$gebiete[$i]}+=2;}
    428.                         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]."  ], ";
    429.                                                                      ${'crew_'.$gebiete[$i]}+=3;}
    430.                         if (substr($truppen_array[$j],0,3) == 421) { $fn_OurAltisInit_sqf_geraet .= "[\"B_MBT_01_mlrs_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    431.                                                                      ${'crew_'.$gebiete[$i]}+=2;}
    432.                         if (substr($truppen_array[$j],0,3) == 431) { $fn_OurAltisInit_sqf_geraet .= "[\"B_MBT_01_cannon_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    433.                                                                      ${'crew_'.$gebiete[$i]}+=3;}
    434.                         if (substr($truppen_array[$j],0,3) == 511) { $fn_OurAltisInit_sqf_geraet .= "[\"B_Heli_Transport_01_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    435.                                                                      ${'pilot_'.$gebiete[$i]}+=4;}
    436.                         if (substr($truppen_array[$j],0,3) == 521) { $fn_OurAltisInit_sqf_geraet .= "[\"B_Heli_Attack_01_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    437.                                                                      ${'pilot_'.$gebiete[$i]}+=2;}
    438.                         if (substr($truppen_array[$j],0,3) == 531) { $fn_OurAltisInit_sqf_geraet .= "[\"B_UAV_02_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], "; }
    439.                         if (substr($truppen_array[$j],0,3) == 212) { $fn_OurAltisInit_sqf_geraet .= "[\"O_Truck_03_covered_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    440.                                                                      ${'fahrer_'.$gebiete[$i]}++;}
    441.                         if (substr($truppen_array[$j],0,3) == 222) { $fn_OurAltisInit_sqf_geraet .= "[\"O_Truck_03_repair_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    442.                                                                      ${'fahrer_'.$gebiete[$i]}++;}
    443.                         if (substr($truppen_array[$j],0,3) == 232) { $fn_OurAltisInit_sqf_geraet .= "[\"O_Truck_03_medical_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    444.                                                                      ${'fahrer_'.$gebiete[$i]}++;}
    445.                         if (substr($truppen_array[$j],0,3) == 242) { $fn_OurAltisInit_sqf_geraet .= "[\"O_Truck_03_fuel_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    446.                                                                      ${'fahrer_'.$gebiete[$i]}++;}
    447.                         if (substr($truppen_array[$j],0,3) == 312) { $fn_OurAltisInit_sqf_geraet .= "[\"O_MRAP_02_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    448.                                                                      ${'fahrer_'.$gebiete[$i]}++;}
    449.                         if (substr($truppen_array[$j],0,3) == 322) { $fn_OurAltisInit_sqf_geraet .= "[\"O_MRAP_02_hmg_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    450.                                                                      ${'fahrer_'.$gebiete[$i]}+=2;}
    451.                         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]."  ], ";
    452.                                                                      ${'crew_'.$gebiete[$i]}+=3;}
    453.                         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]."  ], ";
    454.                                                                      ${'crew_'.$gebiete[$i]}+=2;}
    455.                         if (substr($truppen_array[$j],0,3) == 432) { $fn_OurAltisInit_sqf_geraet .= "[\"O_MBT_02_cannon_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    456.                                                                      ${'crew_'.$gebiete[$i]}+=3;}
    457.                         if (substr($truppen_array[$j],0,3) == 512) { $fn_OurAltisInit_sqf_geraet .= "[\"O_Heli_Light_02_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    458.                                                                      ${'pilot_'.$gebiete[$i]}+=2;}
    459.                         if (substr($truppen_array[$j],0,3) == 522) { $fn_OurAltisInit_sqf_geraet .= "[\"O_Heli_Attack_02_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], ";
    460.                                                                      ${'pilot_'.$gebiete[$i]}+=2;}
    461.                         if (substr($truppen_array[$j],0,3) == 532) { $fn_OurAltisInit_sqf_geraet .= "[\"O_UAV_02_F\", ".$tank.", ".$bestand.", \"".$gebiete[$i]."\", ".$truppen_array[$j]."  ], "; }
    462.                     }
    463.                    
    464.                     ${'array_fahrer_'.$gebiete[$i]} = array('Fahrer', ${'fahrer_'.$gebiete[$i]}, $gebiete[$i]);
    465.                     ${'array_crew_'.$gebiete[$i]} = array('Crew', ${'crew_'.$gebiete[$i]}, $gebiete[$i]);
    466.                     ${'array_pilot_'.$gebiete[$i]} = array('Pilot', ${'pilot_'.$gebiete[$i]}, $gebiete[$i]);
    467.                    
    468.                     array_push($add_besatzung, ${'array_fahrer_'.$gebiete[$i]}, ${'array_crew_'.$gebiete[$i]}, ${'array_pilot_'.$gebiete[$i]});
    469.                    
    470.                 }
    471.                 $fn_OurAltisInit_sqf_geraet = "[".substr($fn_OurAltisInit_sqf_geraet, 0, -2)."] call FUNC(createVehicles);";
    472.                
    473.                
    474.                
    475.                
    476.                
    477.                
    478.                 //echo count($add_besatzung);
    479.                
    480.                 $key = array_search('Sofia', $add_besatzung[0]);
    481.                
    482.                
    483.                 //Infanterie ["Rifleman", 5, "Conner"]     
    484.                                              
    485.                 $gebiete = explode(";;", $mission['gebiete']);
    486.                 $truppen = explode(";;", $mission['truppen']);
    487.                 $fn_OurAltisInit_sqf_inf = "";
    488.        
    489.                 for ($i=0;$i<count($gebiete);$i++)
    490.                 {
    491.                     $truppen_array = explode(";", $truppen[$i]);
    492.                                
    493.                     $schz=0; $gren=0; $mgsc=0; $atsc=0; $aasc=0; $scsc=0; $aufk=0; $sani=0; $inge=0; $fahr=0; $crew=0; $pilo=0;
    494.                    
    495.                     //Infanterietypen zählen
    496.                     for ($j=0;$j<count($truppen_array);$j++)
    497.                     {
    498.                         if (substr($truppen_array[$j],0,2) == 11) { $schz++; }
    499.                         if (substr($truppen_array[$j],0,2) == 12) { $gren++; }
    500.                         if (substr($truppen_array[$j],0,2) == 13) { $mgsc++; }
    501.                         if (substr($truppen_array[$j],0,2) == 14) { $atsc++; }
    502.                         if (substr($truppen_array[$j],0,2) == 15) { $aasc++; }
    503.                         if (substr($truppen_array[$j],0,2) == 16) { $scsc++; }
    504.                         if (substr($truppen_array[$j],0,2) == 17) { $aufk++; }
    505.                         if (substr($truppen_array[$j],0,2) == 18) { $sani++; }
    506.                         if (substr($truppen_array[$j],0,2) == 19) { $inge++; }
    507.                     }
    508.                    
    509.                    
    510.                     //Zusätzliche Besatzung ermitteln
    511.                     for ($ij=0;$ij<count($add_besatzung);$ij++)
    512.                     {
    513.                         if(array_search($gebiete[$i], $add_besatzung[$ij]) == 2 && $add_besatzung[$ij][0] == "Fahrer") {$fahr = $add_besatzung[$ij][1];}
    514.                         if(array_search($gebiete[$i], $add_besatzung[$ij]) == 2 && $add_besatzung[$ij][0] == "Crew") {$crew = $add_besatzung[$ij][1];}
    515.                         if(array_search($gebiete[$i], $add_besatzung[$ij]) == 2 && $add_besatzung[$ij][0] == "Pilot") {$pilo = $add_besatzung[$ij][1];}
    516.                     }
    517.    
    518.                                
    519.                     //in ARMA-Code verwandeln
    520.                     if ($schz > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Rifleman\", ".$schz.", \"".$gebiete[$i]."\"], "; }
    521.                     if ($gren > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Grenadier\", ".$gren.", \"".$gebiete[$i]."\"], "; }
    522.                     if ($mgsc > 0) { $fn_OurAltisInit_sqf_inf .= "[\"MG\", ".$mgsc.", \"".$gebiete[$i]."\"], "; }
    523.                     if ($atsc > 0) { $fn_OurAltisInit_sqf_inf .= "[\"AT\", ".$atsc.", \"".$gebiete[$i]."\"], "; }
    524.                     if ($aasc > 0) { $fn_OurAltisInit_sqf_inf .= "[\"AA\", ".$aasc.", \"".$gebiete[$i]."\"], "; }
    525.                     if ($scsc > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Marksman\", ".$scsc.", \"".$gebiete[$i]."\"], "; }
    526.                     if ($aufk > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Spotter\", ".$aufk.", \"".$gebiete[$i]."\"], "; }
    527.                     if ($sani > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Medic\", ".$sani.", \"".$gebiete[$i]."\"], "; }
    528.                     if ($inge > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Engineer\", ".$inge.", \"".$gebiete[$i]."\"], "; }
    529.                     if ($fahr > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Driver\", ".$fahr.", \"".$gebiete[$i]."\"], "; }
    530.                     if ($crew > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Crew\", ".$crew.", \"".$gebiete[$i]."\"], "; }
    531.                     if ($pilo > 0) { $fn_OurAltisInit_sqf_inf .= "[\"Pilot\", ".$pilo.", \"".$gebiete[$i]."\"], "; }
    532.                 }
    533.        
    534.                 $fn_OurAltisInit_sqf_inf = "[".substr($fn_OurAltisInit_sqf_inf, 0, -2)."] call FUNC(configureInfantry);";
    535.                
    536.    
    537.                
    538.                
    539.                
    540.                 $fn_OurAltisInit_sqf_footer = "}; [] call FUNC(initializeGenericMissionPart); nil;";
    541.                
    542.                
    543.                 //onloadnamen: Grenzkonflikt, Territorialkonflikt (mit Geiselnahme, Konvoiterminierung etc.)
    544.                
    545.                 $description_ext = "
    546.                                     #include \"config\cfgFunctions.cpp\"
    547.                                     #include \"config\cfgRespawnTemplates.cpp\"
    548.                                     #include \"macros.hpp\"
    549.                                    
    550.                                     author=\"OurAltis\";
    551.                                     OnLoadName = \"Territorialkonflikt\";
    552.                                     onLoadMission = \"Operation ".$mission['operation']."\";
    553.                            
    554.                                     //loadScreen = \"bild.jpg\";
    555.                                    
    556.                                     respawn = \"BASE\";
    557.                                     respawnDialog = 0;
    558.                                     respawnTemplates[] = {\"OurAltis\"};
    559.                                     respawnDelay = 13;
    560.                                    
    561.                                     //allowFunctionsLog = 1;
    562.                                     saving = 0;
    563.                                    
    564.                                    
    565.                                     class Header {
    566.                                         gameType = SC;
    567.                                         minPlayers = 2;
    568.                                         maxPlayers = 8;
    569.                                     };
    570.                                    
    571.                                     disabledAI = 1;
    572.                                     enableTeamSwitch = 0;
    573.                                    
    574.                                     // disable all channels but the global text chat
    575.                                     disableChannels[]={{0,false,true},{1,true,false},{1,true,false},{1,true,false},{1,true,false},{1,true,false},{1,true,false}};
    576.                                    
    577.                                    
    578.                                     //debug stuff
    579.                                     enableDebugConsole = 1;
    580.                                     FUNCTIONS_RECOMPILE
    581.                                     ";
    582.             }
    583.            
    584.            
    585.             //ORDNER IN missions ERSTELLEN
    586.             $operation_ordner = str_replace(" ","%20",$mission['operation']);
    587.             $operation_cycle = str_replace(" ","_",$mission['operation']);
    588.          
    589.             //PROTOTYPEN KOPIEREN
    590.             include_once('inc/copy_folder.php');
    591.            
    592.             $statsCopyFolder['bytes'] = 0;
    593.             $statsCopyFolder['files'] = 0;
    594.            
    595.             $source = 'missions/_prototyp/';
    596.             $dest = 'missions/'.$operation_ordner.'.Altis/';
    597.             copyFolder($source, $dest, $statsCopyFolder, true);
    598.            
    599.             $statsCopyFolder['bytes'] = binary_multiples($statsCopyFolder['bytes'], true, false);
    600.            
    601.             //echo "<br><br>".$statsCopyFolder['files'] . ' Dateien kopiert ('.$statsCopyFolder['bytes'].').';
    602.             //echo "<br>Ziel: ".$dest;
    603.            
    604.    
    605.        
    606.            
    607.             //fn_OurAltisInit.sqf IN MISSIONS-ORDNER SCHREIBEN
    608.             $datei1 = fopen('missions/'.$operation_ordner.'.Altis/scripts/functions/init/fn_OurAltisInit.sqf','w');
    609.             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);
    610.             fclose($datei1);
    611.            
    612.             //description.ext IN MISSIONS-ORDNER SCHREIBEN
    613.             $datei2 = fopen('missions/'.$operation_ordner.'.Altis/description.ext','w');
    614.             fwrite($datei2, $description_ext);
    615.             fclose($datei2);
    616.            
    617.             //BILD KOPIEREN
    618.             //$file1 = "missions/_prototyp/alter_bildname.jpg";     // alter Bildname richtet sich nach dem jeweiligen Szenario (Grenzkrieg/Territorialkonflik oder Sitemissions wie Geisel, Konvoi etc)
    619.             //$file2 = "missions/".$mission['operation'].".Altis/neuer_bildname.jpg";   // neuer Bildname sollte statisch und immer gleich lauten.
    620.             //copy($file1, $file2);
    621.    
    622.    
    623.        
    624.            
    625.             //PBO PACKEN
    626.             exec("start /b missions\cpbo.exe -y -p missions\\".$operation_ordner.".Altis missions\\".$operation_ordner.".altis.pbo");
    627.             //echo $output;
    628.            
    629.            
    630.             //PBO über FTP zum GAMESERVER
    631.            
    632.            
    633.             $server = 'IPIPIPIPIPIP';
    634.             $ftp_user_name = 'UN';
    635.             $ftp_user_pass = 'PASS';
    636.             $dest = "ArmA3_OPT_Fun2_Server\\mpmissions\\".$operation_ordner.".altis.pbo";
    637.             $source = "missions\\".$operation_ordner.".altis.pbo";
    638.            
    639.             $connection = ftp_connect($server);
    640.             $login = ftp_login($connection, $ftp_user_name, $ftp_user_pass);
    641.             if (!$connection || !$login) { die('Connection attempt failed!'); }
    642.             ftp_pasv($connection, true);
    643.             $upload = ftp_put($connection, $dest, $source, FTP_BINARY);
    644.             if (!$upload) { echo 'FTP upload failed!'; }
    645.             ftp_close($connection);
    646.            
    647.            
    648.            
    649.            
    650.             //MISSIONS-ORDNER und PBO auf WEBSERVER LÖSCHEN
    651.    
    652.    
    653.             rmr('missions/'.$operation_ordner.'.Altis');
    654.    
    655.             unlink('missions/'.$operation_ordner.'.altis.pbo');
    656.            
    657.             $missions_cycle .= "class ".$operation_cycle." {template=".$operation_ordner.".Altis; cadetMode=0;};";
    658.            
    659.            
    660.            
    661.             mysqli_query($db, "UPDATE status SET server = '".$fortschritt."'");                
    662.    
    663.         }
    664.     }
    665.    
    666.    
    667.     // SERVER.CFG SCHREIBEN
    668.    
    669.     $server_cfg = "
    670.     // server.cfg
    671.    
    672.     // STEAM
    673.     // steamport = 2700;
    674.     // steamqueryport = 2701;
    675.    
    676.     // GLOBAL SETTINGS
    677.     // War
    678.     hostname = \"OurAltis Testserver\";
    679.     password = \"".$serverpw_neu."\";
    680.     passwordAdmin = \"admin\";
    681.     reportingIP = \"arma3pc.master.gamespy.com\";
    682.     logFile = \"server_console.log\";
    683.     timeStampFormat = \"full\";
    684.    
    685.     // WELCOME MESSAGE
    686.     motd[] = {
    687.         \" \",
    688.         \"OUR ALTIS\",
    689.         \"Round 1\",
    690.         \" \",
    691.         \"http://www.ouraltis.de/\",
    692.         \"TS3: ouraltis.de\",
    693.         \" \",
    694.         \" \",
    695.         \"by Recognite, Raven and PhilipJFry\",
    696.         \"special thanks to KalleK and Yoshi\",
    697.     };
    698.     motdInterval = 5;
    699.    
    700.     maxPlayers = 103;
    701.     kickDuplicate = 1;
    702.     verifySignatures = 0;
    703.     equalModRequired = 0;
    704.     requiredSecureId = 2;
    705.     BattlEye = 0;
    706.    
    707.     // VOTING
    708.     voteMissionPlayers = 0;
    709.     voteThreshold = 0.9;
    710.    
    711.     // INGAME SETTINGS
    712.     disableVoN = 1;
    713.     vonCodecQuality = 10;
    714.     persistent = 1;
    715.    
    716.     // SCRIPTING ISSUES
    717.     onUserConnected = \"\";
    718.     onUserDisconnected = \"\";
    719.     doubleIdDetected = \"\";
    720.    
    721.     // SIGNATURE VERIFICATION
    722.     onUnsignedData = \"\";
    723.     onHackedData = \"kick (_this select 0)\";
    724.     onDifferentData = \"\";
    725.    
    726.     // MISSIONS CYCLE
    727.     class Missions
    728.     {
    729.         ".$missions_cycle."
    730.     };
    731.     ";
    732.    
    733.     //server.cfg IN SERVER_ORDNER schreiben
    734.     $datei3 = fopen('missions/opt4_Server.cfg','w');
    735.     fwrite($datei3, $server_cfg);
    736.     fclose($datei3);
    737.    
    738.    
    739.     //server.cfg über FTP zum GAMESERVER
    740.    
    741.    
    742.     $server = 'IPIPIPIPIPIP';
    743.     $ftp_user_name = 'UN';
    744.     $ftp_user_pass = 'PASS';
    745.     $dest = "Serverconfigs\\opt4_Server.cfg";
    746.     $source = "missions\\opt4_Server.cfg";
    747.    
    748.     $connection = ftp_connect($server);
    749.     $login = ftp_login($connection, $ftp_user_name, $ftp_user_pass);
    750.     if (!$connection || !$login) { die('Connection attempt failed!'); }
    751.     ftp_pasv($connection, true);
    752.     $upload = ftp_put($connection, $dest, $source, FTP_BINARY);
    753.     if (!$upload) { echo 'FTP upload failed!'; }
    754.     ftp_close($connection);
    755.    
    756.    
    757.    
    758.    
    759.     //server.cfg auf WEBSERVER LÖSCHEN
    760.    
    761.     unlink('missions/opt4_Server.cfg');
    762.    
    763. }
    764.  
    765. ?>
    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.

  11. #36

    Re: Zwei php-Skripte parallel (Auslagerung)

    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.

  12. #37
    Mitglied

    (Threadstarter)


    Registriert seit
    Sep 2013
    Ort
    Exilgullianer
    Beiträge
    168

    Re: Zwei php-Skripte parallel (Auslagerung)

    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.
    Geändert von nietaL (15.03.17 um 09:31 Uhr)

  13. #38
    Suchtspielmacher Avatar von werner
    Registriert seit
    Jul 2014
    Ort
    127.0.0.1
    Beiträge
    602

    Re: Zwei php-Skripte parallel (Auslagerung)

    Ist exec eine Option für dich?

    edit: SOrry, hab irgendwie die 2. Seite komplett übersehen
    Geändert von werner (15.03.17 um 17:09 Uhr)

  14. #39

    Re: Zwei php-Skripte parallel (Auslagerung)

    Zitat Zitat von werner Beitrag anzeigen
    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
    Gruß theSplit
    @ At times we run, most we walk, others we stand; but we never stop. @
    +++ NGB-Statistik Opt-Out/Anonymisierung +++ KISS Ebook Starter [Linux] +++
    +++ Git +++

  15. #40
    Suchtspielmacher Avatar von werner
    Registriert seit
    Jul 2014
    Ort
    127.0.0.1
    Beiträge
    602

    Re: Zwei php-Skripte parallel (Auslagerung)

    Hier der Thread ist auch ganz interessant zu dem Thema
    Für diesen Beitrag bedankt sich theSplit

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •