Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] CPU-Usage-Time / Pause einbauen, aber wie?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] CPU-Usage-Time / Pause einbauen, aber wie?

    Ich habe auf einem Webspace eine sehr große Anzahl von Bilddateien einer Webcam. Diese werden mit untem stehendem archiv.php Script 24 Stunden zur Auswahl angeboten. (Script ist nicht schön, aber funktioniert). Es befinden sich immer rund 8.640 Bilder (10 Sekunden / 24 Stunden) auf dem Webspace.

    Problem

    Strato / 1&1 beschränken die CPU-Usage-Time eines PHP Scripts, wenn es ununterbrochen läuft. Das gleiche Script läuft bei 1&1 etwas länger als bei Strato, wird aber auch dort ohne Fehlermeldung einfach beendet.

    Ich habe an verschiedenen Stellen des Scripts versucht nach einer gewissen Anzahl von Durchläufen der while Schleife einen Sleep = 1 einzubauen, leider ohne jeden Effekt. Auch der Versuch nur jedes 6. Bild zur Auswahl anzubieten - dazu habe ich den Echo Befehl in eine if Schleife mit Zähler gelegt, änderte nichts.

    Wie / wo müßte man in diesem Script eine Pause einbauen, damit es nach z.B. 20 Sekunden CPU Usage Time mal eine Sekunde nichts macht, und letztlich damit durchläuft?

    PHP-Code:
    <?php

    $datein 
    = array();
    $handle=opendir('.');

    echo 
    "

    <HTML><HEAD>
    <meta http-equiv='refresh' content='900; URL=archiv.php'>
    <meta http-equiv='Cache-Control' content='no-cache, must-revalidate, no-store'>
    <meta http-equiv='Pragma' content='no-cache'>
    <meta http-equiv='Last-Modified' content='Tue, 14 Oct 2003 09:02:20 GMT'>
    <meta http-equiv='Expires' content='Tue, 14 Oct 2003 09:02:20 GMT'>
    <TITLE>Webcam Archiv</TITLE>
    </HEAD>
    <style type=\"text/css\">
    a:link { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: white; }
    a:visited {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: white; }
    a:hover { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: white; }
    a:active { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: white; }
    a:focus {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: white; }
    </style><BODY BGCOLOR=\"#343B41\" style=\"font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: white\">

    "
    ;

    while (
    $datei readdir ($handle))
    {
       if (
    $datei != "." && $datei != ".." && $datei != "anzeige.php" &&
           
    $datei != "archiv.php" && $datei != "webcam.jpg" && $datei != "php.ini")
       {
          
    $datein[$datei] = filemtime($datei);
       }
    }
    closedir($handle);


    natsort($datein);

    $datein array_reverse($datein);

    foreach (
    $datein as $key => $value)

    {

    $str $key;
    $jahrsubstr($str54);
    $monatsubstr($str92);
    $tagsubstr($str112);
    $stundesubstr($str132);
    $minutesubstr($str152);
    $sekundesubstr($str172);
    $zeitpunkt $tag "." $monat " - " $stunde ":" $minute ":" $sekunde;

    // ---- Ab hier Notloesung, weil ich sonst nicht weiß wie ich an den index komme

    $files glob("*.jpg");

    foreach (
    $files as $index => $file)

    {

    If (
    $file == $key)

    {

    $indexnummer $index;

    }

    }

    // ---- Bis hier Notloesung, weil ich sonst nicht weiß wie ich an den index komme

    echo "

    <a href = \"anzeige.php?index=
    $indexnummer\">$zeitpunkt</a>

    "
    ;

    }



    echo 
    "

    </body></html>

    "
    ;

    ?>

  • #2
    Ich versteh nicht ganz was du machen willst... einfach nur die Bilder aus einem Verzeichnis auslesen und ausgeben? Das Script läuft ja nicht ununterbrochen, sondern wahrscheinlich einfach nur zu lange/verbraucht zu viel Speicher. Vielleicht kannst du die 3 Schleifen auftrudeln, so dass du nur noch eine hast

    Kommentar


    • #3
      das ist eine eher schlechte Idee - bau es lieber mit Pagination / Paginierung ...

      Zeige eine bestimmte Anzahl Bilder auf der Seite an (meinetwegen die Bilder innerhalb von 10 Minuten oder innerhalb einer halben Stunde) und zusätlich Navigationselemente zum Vor- und Zurück-Blättern.

      Es ist generell aus Sicht von php nicht wünschenswert, wenn dein Script rund um die Uhr läuft. Dein Problem dürfte da die maximale Ausführungszeit sein (meist so 30 Sekunden, gibt aber auch kürzere Einstellungen bei einigen Hostern) - Also musst du einfach die Anzahl der Bilder einschränken, damit es schnell geht. Von der Datenbank-Seite her kannst du das mit Limit umsetzen

      Kommentar


      • #4
        Das Script listet die Bilder auf, die angezeigt werden können.

        Es liegen Bilder der letzten 24 Stunden vor, die Ausgabe der Links bricht aber weit vorher ab ..

        Kommentar


        • #5
          Ououou jetzt versteh ich. Das heißt, du liest bei jedem deiner 8640 Bilder das komplette Bilderverzeichnis aus und gehst da noch einmal jedes Bild durch und überprüfst ob es dasselbe ist!? Das könnte bei einem Monat Laufzeit 241920 Bilder sein. Das heißt er überprüft in dem Fall 8640* 241920 Bilder bei jedem Seitenaufruf? Das will ich gar nicht ausrechnen...

          Entweder du löst das mittels Datenbank oder du übergibst keine index-Nummer sondern einfach den Bildnamen der anzeige.php

          Auf jeden Fall solltest du aber, wie eagle275 schon sagte, eine Paginierung benutzen

          Kommentar


          • #6
            Bilder mit einem Alter über 24 Stunden werden automatisch gelöscht. (Übernimmt ein Cronjob, anderes Script). Mehr wie 8640 Bilder werden es nicht.

            Eine Auswahl - Vor, Zurück, erfolgt nachdem man den Einstiegszeitpunkt über die Linkseite gewählt hat.

            Kommentar


            • #7
              Auch wenn sie nach nach 24 Stunden gelöscht werden, sind es immernoch 8640*8640 Bilder die pro Aufruf ausgelesen werden. Lass dem Benutzer doch einfach mittels select inputs o.Ä. auswählen, wo er einsteigen will. Dann wählst du einfach das Bild aus, was am nächsten an dem Zeitpunkt liegt. Oder du liest nur das letzte (zeitlich gesehen) Bild aus und weißt ja dank deines 10 Sekunden Taktes, das alle anderen Bilder 10 Sekunden in der Vergangenheit liegen. So listest du sie dann einfach auf, ohne sie alle einzeln auslesen zu müssen.

              Kommentar


              • #8
                Als Notlösung habe ich daran schon gedacht. Vielleicht gibt es aber doch eine Lösung die Auflistung in der momentanen Form durchlaufen zu lassen .. ??

                Kommentar


                • #9
                  Also laut manual erhalten sowohl natsort als auch array_reverse die keys (bei array_reserve muss noch ein Parameter gesetzt werden). Ist die Sortierreihenfolge von filemtime und dem Dateinamen denn unterschiedlich? Auf den ersten Blick sollte sich auch der Dateiname so sortieren lassen, dass das neuste Bild oben steht. Dann sollte das funktionieren (ungetestet und nur als Idee) :

                  PHP-Code:

                  $datein 
                  = array(); 
                  $handle opendir('.');

                  while (
                  $datei readdir ($handle))
                  {
                     if (
                  $datei != "." && $datei != ".." && $datei != "anzeige.php" &&
                         
                  $datei != "archiv.php" && $datei != "webcam.jpg" && $datei != "php.ini")
                     {
                        
                  $datein[] = $datei;
                     }
                  }
                  closedir($handle);

                  natsort($datein);
                  $datein array_reverse($dateintrue); // Parameter um die Schlüssel zu erhalten

                  foreach ($datein as $key => $value)
                  {

                  $str $value;
                  $jahrsubstr($str54);
                  $monatsubstr($str92);
                  $tagsubstr($str112);
                  $stundesubstr($str132);
                  $minutesubstr($str152);
                  $sekundesubstr($str172);
                  $zeitpunkt $tag "." $monat " - " $stunde ":" $minute ":" $sekunde;

                  $indexnummer $key;

                  echo 
                  "

                  <a href = \"anzeige.php?index=
                  $indexnummer\">$zeitpunkt</a>

                  "
                  ;

                  }



                  echo 
                  "

                  </body></html>

                  "
                  ;

                  ?> 

                  Kommentar


                  • #10
                    Vielen Dank. Ich teste das sobald möglich und poste das Ergebnis hier.

                    Kommentar


                    • #11
                      Müsste da nicht glob vollständig reichen?

                      PHP-Code:
                      $files=glob('*.jpg');
                      $filesFlip=array_flip($files);
                      unset(
                      $filesFlip['webcam.jpg']);
                      $files=array_reverse(array_flip($filesFlip));
                      foreach(
                      $files as $indexnummer=>$str)
                      {
                        
                      $jahrsubstr($str54);
                        
                      $monatsubstr($str92);
                        
                      $tagsubstr($str112);
                        
                      $stundesubstr($str132);
                        
                      $minutesubstr($str152);
                        
                      $sekundesubstr($str172);
                        
                      $zeitpunkt $tag "." $monat " - " $stunde ":" $minute ":" $sekunde;

                        echo 
                      "<a href = \"anzeige.php?index=$indexnummer\">$zeitpunkt</a>";

                      ?

                      Gruß Jens

                      Kommentar


                      • #12
                        trotzdem könnten 8640 Bilder zuviel selbst für eine Foreach-Schleife sein ... wenn dazu das Bild selbst noch ausgegeben wird .....daher Paginierung!

                        Kommentar


                        • #13
                          Die Foreach-Schleife ist da weniger das Problem, als die I/O-Zeiten vom FS. Versuch einfach nur mal ein ls auf so einem Verzeichnis und das dauert schon ewig. Das Problem lässt sich aber auch mit Seiten nicht lösen - auch für die müsstest Du nämlich einmal alle Einträge im Verzeichnis ermitteln.

                          Ggf. und je nach Dateinamen kann es aber sein, dass man die Namen auch rechnerisch ermitteln kann und sich das ganze Auslesen klemmen kann. Das würde wirklich was bringen.

                          Gruß Jens

                          Kommentar


                          • #14
                            Paginierung im Notfall )

                            Danke für die beiden Scriptvarianten. Ergebniss poste ich dann hier.

                            Kommentar


                            • #15
                              @mquadrat & @Jens Clasen

                              Vielen Dank Euch beiden!! Beide Scripte laufen die 24 Stunden durch. Von der Geschwindigkeit kann ich bei Euren Scripten keinen Unterschied feststellen - als Info für Euch. Das Problem scheint wirklich die IO FS gewesen zu sein. Beide Scripte laufen in ca. 17 Sekunden bei mir durch und listen alle Bilder im Verzeichnis auf.

                              SUPER ) Ich verneige mich vor Euch PHP Gurus )

                              Vielen herzlichen Dank und einen schönen Abend an Euch beide


                              Edit - Ergänzung:
                              Zitat von Jens Clasen Beitrag anzeigen
                              Ggf. und je nach Dateinamen kann es aber sein, dass man die Namen auch rechnerisch ermitteln kann und sich das ganze Auslesen klemmen kann. Das würde wirklich was bringen.
                              Errechnen hätte ich die Namen leider nicht können. Die Cam ist über UMTS angebunden, und der 10 Sekunden Abstand pro Bild ist nur ein ungefährer Wert - je nachdem wie die UMTS Verbindung gerade ist.

                              Edit 2 - Gerade erst bemerkt

                              Bei beiden Scripten stimmt die Indexnummer nicht mehr mit der Zeit überein.

                              15 Uhr ist jetzt mitten in der Nacht wenn das Bild ausgewählt ist??

                              *grübel*

                              Kommentar

                              Lädt...
                              X