Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeitüberschreitung :-(

Einklappen

Neue Werbung 2019

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

  • Zeitüberschreitung :-(

    Hi,

    ich suche mir mit folgendem Code alle *.htm Dateien eines Ordners und lass den Dateinamen, einen Kommentar zw. !!!!(.*)!!!! und den Title-Tag auslesen.

    Klappt soweit wunderbar, nur in dem Ordner sind knapp 200 *.htm-Dateien und das ist wohl zu viel. Die Ausgabe stoppt nach ~160 Dateien
    Code:
    $nr= 0;
    
    $handle=opendir ($path);
    $path_files = array();
    
    while(($datei = readdir($handle)) !== false) {
    if (preg_match('/^\w+\.htm$/', $datei)) {
    $path_files[] = $datei;
        }
    }
    
    closedir($handle);
    sort($path_files);
    
    foreach ($path_files as $datei) {
    
    unset($filestring);
    $filestring = file_get_contents($datei);
    
    echo "<tr>";
    echo "<td class=\"text\" width=\"4%\">".++$nr."</td>";
    echo "<td class=\"text\" width=\"32%\">
    <a class=\"link\" href=\"$datei\" target=\"_blank\">$datei</a></td>";
    
    echo "<td class=\"verantw\" width=\"32%\">";
    if (eregi ("!!!!(.*)!!!!", $filestring, $verantwortlicher)) echo $verantwortlicher[1];
    else echo '';
    echo "</td>";
    
    echo "<td class=\"text\" width=\"32%\">";
    if (eregi ("<title>(.*)</title>", $filestring, $titel)) echo $titel[1];
    else echo '';
    echo "</td>";
    
    echo "</tr>";
    }
    Wie muss ich obigen Code ändern, damit ich nicht der "Zeitüberschreitung" zum Opfer falle?

    Danke

  • #2
    mit
    Code:
    set_time_limit(0);
    kannst du diese Limitierung deaktivieren. Das geht abe rnicht, wenn dein Server im SAFE-Mode läuft, was bei vielen Anbietern der fall ist.

    Ansonsten hilft nur Script optimieren, dass es nicht so lange braucht.

    Kommentar


    • #3
      Zitat von Thice
      mit
      Code:
      set_time_limit(0);
      kannst du diese Limitierung deaktivieren. Das geht abe rnicht, wenn dein Server im SAFE-Mode läuft, was bei vielen Anbietern der fall ist.
      Hm, safe_mode ist off aber die Ausgabe stoppt trotzdem!?

      Ansonsten hilft nur Script optimieren, dass es nicht so lange braucht.
      Jo, aber wie :wink:

      Kommentar


      • #4
        Du solltest deine while-Schleife ein bischen verändern:
        Code:
        while(($datei = readdir($handle)) !== false)
         {
          if ($datei != "." AND $datei != ".." AND is_dir($datei) == false)
           {
            if (preg_match('/^\w+\.htm$/', $datei))
             {
              $path_files[] = $datei;
             }
           }
         }
        Das verhindert das er . und .. und die Verzeichnise ausliest.
        Du solltest auch nicht die ganze Datei einlesen, sondern nur die ersten Zeilen. Aus
        Code:
        unset($filestring);
        $filestring = file_get_contents($datei);
        wird demnach
        Code:
        $filestring = "";
        $fp = fopen($datei, "r");
        for ($i = 0; $i < 5; $i++)
         {
          $filestring .= fgets($fp, 4096);
         }
        fclose($fp);
        Für 5 musst du die Zeile angeben, wo der Kommentar bzw. <title> steht. Bis zu dieser Zeile wird die Seite nur ausgelesen, was das Skript vor allem bei großen Dateien viel schneller machen müsste.
        mfg RudiS

        Kommentar


        • #5
          Dank' Dir vielmals RudiS

          Kommentar


          • #6
            Zitat von RudiS
            Code:
            while(($datei = readdir($handle)) !== false)
             {
              if ($datei != "." AND $datei != ".." AND is_dir($datei) == false)
               {
                if (preg_match('/^\w+\.htm$/', $datei))
                 {
                  $path_files[] = $datei;
                 }
               }
             }
            Mach das draus: (sieht schöner aus)
            Code:
            while($datei = readdir($handle))
            {
              if (($datei != ".") && ($datei != "..") && (!is_dir($datei)) && (preg_match('/^\w+\.htm$/', $datei)))
              {
                $path_files[] = $datei;
              }
            }

            Kommentar


            • #7
              Stimmt..... Thx

              Kommentar


              • #8
                Jetzt hätte ich noch eine Bitte

                Die Sortierung mit obigen Code erfolgt ja nach dem Dateinamen. Was muss ich abändern, damit ich auch eine Sortierung nach dem VERANTWORTLICHEN erreichen kann?

                Kommentar


                • #9
                  Nun du musst vor der Ausgabe die eingelesenen Daten nochmal in ein Array schreiben und dieses dann sortieren.
                  mfg RudiS

                  Kommentar


                  • #10
                    Hi RudiS,

                    habs jetzt testweise so:
                    Code:
                    <?php
                    $handle = opendir('.'); 
                    $title_tags = array(); 
                    $verantw = array(); 
                    $file = array(); 
                    
                    while ($file = readdir($handle)) { 
                        if (substr($file, -4) == '.htm') { 
                            $files[] = $file;
                            $html = file_get_contents('./' . $file); 
                            preg_match_all('/!!!!(.*)!!!!/', $html, $matches); 
                            if (isset($matches[1][0])) { 
                                $verantw[] = $matches[1][0]; 
                            } 
                            preg_match_all('!<title>([^<]+)</title>!i', $html, $matches); 
                            if (isset($matches[1][0])) { 
                                $title_tags[] = $matches[1][0]; 
                            } 
                        } 
                    } 
                    
                    sort($verantw); 
                    
                    $nr= 0;
                    $max = count($verantw); 
                    
                    for ($i = 0; $i < $max; $i++) { 
                    echo "<tr>";
                    echo "<td class=\"text\" width=\"4%\">".++$nr."</td>";
                    
                    echo "<td class=\"text\" width=\"28%\">
                    <a class=\"link\" href=\"".$files[$i]."\" target=\"_blank\">".$files[$i]."</a></td>";
                    
                    echo "<td class=\"verantw\" width=\"25%\">";
                    if ($verantw[$i]) echo $verantw[$i];
                    else echo '';
                    echo "</td>";
                    
                    echo "<td class=\"text\" width=\"35%\">";
                    if ($title_tags[$i]) echo $title_tags[$i];
                    else echo '';
                    echo "</td>";
                    
                    echo "</tr>";
                    } 
                    ?>
                    Jetzt wird zwar $verantw sortiert ausgegeben, aber $title und $file passen dann nicht mehr zum $verantw

                    Was mach ich falsch?

                    Kommentar


                    • #11
                      Nimm doch ein mehrdimensionales Array:
                      Code:
                      $daten = array();
                      $daten['file'] = array();
                      $daten['title_tags'] = array();
                      $daten['verantwortlicher'] = array();
                      Wenn du es dann sortierst müsste es gehen.
                      mfg RudiS

                      Kommentar


                      • #12
                        So?
                        Code:
                        $handle = opendir('.'); 
                        $daten = array(); 
                        $daten['files'] = array(); 
                        $daten['title_tags'] = array(); 
                        $daten['verantw'] = array();
                        
                        
                        while ($file = readdir($handle)) { 
                            if (substr($file, -4) == '.htm') { 
                                $daten['files'] = $file;
                                $html = file_get_contents('./' . $file); 
                                preg_match_all('/!!!!(.*)!!!!/', $html, $matches); 
                                if (isset($matches[1][0])) { 
                                    $daten['verantw'] = $matches[1][0]; 
                                } 
                                preg_match_all('!<title>([^<]+)</title>!i', $html, $matches); 
                                if (isset($matches[1][0])) { 
                                    $daten['title_tags'] = $matches[1][0]; 
                                } 
                            } 
                        } 
                        
                        sort($daten['verantw']); 
                        
                        $nr= 0;
                        $max = count($daten['verantw']); 
                        for ($i = 0; $i < $max; $i++) { 
                        echo "<tr>";
                        echo "<td class=\"text\" width=\"4%\">".++$nr."</td>";
                        
                        echo "<td class=\"text\" width=\"28%\">
                        <a class=\"link\" href=\"".$daten['$files']['$i']."\" target=\"_blank\">
                        ".$daten['$files']['$i']."</a></td>";
                        
                        echo "<td class=\"verantw\" width=\"25%\">";
                        if ($daten['$verantw']['$i']) echo $daten['$verantw']['$i'];
                        else echo '';
                        echo "</td>";
                        
                        echo "<td class=\"text\" width=\"35%\">";
                        if ($daten['$verantw']['$i']) echo $daten['$verantw']['$i'];
                        else echo '';
                        echo "</td>";
                        (funktioniert leider so (noch) nicht)

                        Kommentar


                        • #13
                          Wenn du etwas an ein Array anhängen willst musst du das so machen:
                          Code:
                          $daten['title_tags'][] = 'text';
                          Dann wird ein neues Element erstellt.

                          Kommentar


                          • #14
                            Ok, so klappt es jetzt wieder mit der Ausgabe....

                            Aber das Problem mit der Sortierung bleibt. Mit u.g. Code wird zwar die Spalte der Verantwortlichen richtig sortiert, aber es passt eben die $file und der $title nicht mehr dazu
                            Code:
                            $handle = opendir('.'); 
                            $daten 	  				= array(); 
                            $daten['files']   		= array(); 
                            $daten['title_tags'] 	= array(); 
                            $daten['verantw'] 		= array();
                            
                            
                            while ($file = readdir($handle)) { 
                                if (substr($file, -4) == '.htm') { 
                                    $daten['files'][] = $file;
                                    $html = file_get_contents('./' . $file); 
                                    preg_match_all('/!!!!(.*)!!!!/', $html, $matches); 
                                    if (isset($matches[1][0])) { 
                                        $daten['verantw'][] = $matches[1][0]; 
                                    } 
                                    preg_match_all('!<title>([^<]+)</title>!i', $html, $matches); 
                                    if (isset($matches[1][0])) { 
                                        $daten['title_tags'][] = $matches[1][0]; 
                                    } 
                                } 
                            } 
                            
                            sort($daten['verantw']); 
                            
                            $nr  = 0;
                            $max = count($daten['verantw']); 
                            for ($i = 0; $i < $max; $i++) { 
                            	echo "<tr>";
                            	echo "<td class=\"text\" width=\"4%\">".++$nr."</td>";
                            
                            	echo "<td class=\"text\" width=\"28%\">
                            <a class=\"link\" href=\"".$daten['files'][$i]."\" target=\"_blank\">
                            ".$daten['files'][$i]."</a></td>";
                            
                            	echo "<td class=\"verantw\" width=\"25%\">";
                            		 if ($daten['verantw'][$i]) echo $daten['verantw'][$i];
                            		 else echo '';
                            		 echo "</td>";
                            
                            	echo "<td class=\"text\" width=\"35%\">";
                            		 if ($daten['title_tags'][$i]) echo $daten['title_tags'][$i];
                            		 else echo '';
                            		 echo "</td>";
                            ...

                            Kommentar


                            • #15
                              Wenn du jetzt nur
                              Code:
                              sort($daten);
                              nimmst, müsste es eigentlich gehen.
                              mfg RudiS

                              Kommentar

                              Lädt...
                              X