Ausgabe eines großen Arrays

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

  • Ausgabe eines großen Arrays

    Hallo Forum,

    heute ist meine Premiere, mein erster Eintrag.

    Hier mein Problem:
    Ich mache eine DB-Abfrage per ODBC. Das Ergebnis besteht aus 6500 Zeilen mit jeweils 10 Spalten aus einer MSSQL-DB.
    Ich durchlaufe die Abfrage mit einer WHILE-Schleife und lasse mir alle Zeilen ausgeben. Nach ca. 2000 Zeilen ist der Aufbau der Webseite beendet. Allerdings ohne die Schleife komplett abzuarbeiten.
    Wenn ich mir dann den Quelltext anzeigen lasse, hört die Seite mitten im Code einfach auf.
    Weis jemand warum?

    Ich verwende folgendes:
    Windows Server 2008 R2 mit PHP 4.4.9
    MSSQL 2008 per ODBC

    Meine Vermutung ist eine Einstellung in der PHP.ini oder des IIS.
    Ich habe bereits das memory_limit in der PHP.ini auf -1 (noLimit) gesetzt, ohne Erfolg.

    Hier mein code:
    [FONT=Courier New]$exec = odbc_exec($connect, $sql);

    while ($row = odbc_fetch_array($exec)){
    print_r($row);
    }
    [/FONT]
    Vielen Dank schon mal für die Hilfe.
    Gruß Jörg

  • #2
    Hast du das error_reporting an?

    Wie lange dauert es, bis du diese ca. 2000 Zeilen angezeigt bekommst?
    Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
    Schön - etwas Geschichte kann ja nicht schaden.
    Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

    Kommentar


    • #3
      Error-Reporting ist an.
      Der Siteaufbau dauert ca. 2Sekunden.

      Es wird kein Error angezeigt da die Seite nich zu ende gerendert wird.
      Wenn ich in der Ausgabe eine Spalte weglasse, werden mehr Datenzeilen als vorher angezeigt. Ich vermute, dass die eingestellte Größe einer Webseite im IIS 7.5 überschritten wird.
      Nur wo kann ich das einstellen?

      Gruß Jörg

      Kommentar


      • #4
        Findet sich in den Error-Logs des IIS, von PHP oder vom DB-Server etwas?

        Einen volllaufenden Speicher würde ich ohnehin ausschließen, da du mit _fetch_array() immer nur einen Datensatz aus dem Result holst und damit jedesmal $row überschreibst.
        Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
        Schön - etwas Geschichte kann ja nicht schaden.
        Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

        Kommentar


        • #5
          Hier die Zeile des IIS-Log:
          [FONT=Courier New]2012-03-21 12:16:09 10.91.84.23 POST /gbg/relevantCustomer/result.php - 80 - 10.81.80.68 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.1;+Trident/4.0;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50727;+InfoPath.1;+.NET+CLR+3.0.4506.2152;+.NET+CLR+3.5.30729) 200 0 0 1390[/FONT]

          Gruß Jörg

          Kommentar


          • #6
            Zitat von jtraser Beitrag anzeigen
            Hier die Zeile des IIS-Log:
            [FONT=Courier New]2012-03-21 12:16:09 10.91.84.23 POST /gbg/relevantCustomer/result.php - 80 - 10.81.80.68 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.1;+Trident/4.0;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50727;+InfoPath.1;+.NET+CLR+3.0.4506.2152;+.NET+CLR+3.5.30729) 200 0 0 1390[/FONT]

            Gruß Jörg
            Das schaut nach einem (HTTP-)Access-Log-Eintrag aus. Error-Log-Einträge enthalten Fehlermeldungen, Warnungen usw.

            Aber der HTTP-Status-Code 200 sagt zumindest, dass das Script bis zum Ende durchgelaufen sein muss ...
            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

            Kommentar


            • #7
              Der 200er-Status heißt IMHO nicht unbedingt, dass PHP ohne Fehler oder sonst etwas durchgelaufen ist - zumindest bei Apache/PHP kommt eigentlich immer ein 200er zurück, auch wenn PHP einen Fehler meldet. Nur wenn etwas vollkommen schief läuft und PHP gar nicht starten kann oder sowas in der Richtung wird ein 500er ausgegeben.

              Die Angabe "1390" wundert mich irgendwie - ich würde vermuten dass das die zu übertragenden Bytes sein sollen - aber das passt mal gar nicht damit zusammen, dass da doch ca. 2000 Datensätze rauskommen - selbst mit gzip.
              Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
              Schön - etwas Geschichte kann ja nicht schaden.
              Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

              Kommentar


              • #8
                ich hab nochmal gesucht.
                Kein Eintrag in sämtlichen Errorlogs. Sorry.

                Gruß Jörg

                Kommentar


                • #9
                  Zitat von jtraser Beitrag anzeigen
                  ich hab nochmal gesucht.
                  Kein Eintrag in sämtlichen Errorlogs. Sorry.
                  Dann bricht dein Script irgendwo selbst mittels exit() oder return ab. Aber das halte ich für wenig wahrscheinlich.

                  Wenn du wirklich keine andere Möglichkeit siehst, den Fehler aufzuspüren, hilft nur, an den (möglichst) richtigen Stellen Debug-Ausgaben zu machen und die Stelle einzukreisen, wo das Script "abbricht".
                  Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                  Kommentar


                  • #10
                    Das PHP-Script verursacht keinen Abbruch. Es hört einfach auf zu parsen.
                    Ich hatte scho geschrieben: Wenn ich in der Ausgabe eine Spalte weglasse, werden mehr Datenzeilen als vorher angezeigt.

                    Kommentar


                    • #11
                      Zitat von jtraser Beitrag anzeigen
                      Das PHP-Script verursacht keinen Abbruch.
                      [ ] Du hast die Anführungszeichen gesehen, die ich um das Wort "abbricht" gesetzt habe?

                      Es hört einfach auf zu parsen.
                      Bahnhof ...?

                      Der PHP-Interpreter parst das Script nicht mehr?
                      Das Script parst was nicht mehr?
                      Das Code-Teilstück, welches du veröffentlicht hast, "parst" nichts. Es holt nur wiederholt Daten und schreibt sie in den Ausgabekanal.

                      Ich hatte scho geschrieben: Wenn ich in der Ausgabe eine Spalte weglasse, werden mehr Datenzeilen als vorher angezeigt.
                      Das habe ich gelesen, aber es ergäbe wenig Sinn, in der (voreingestellten) Webserver-Konfiguration die Ausgabe auf einen Wert von weniger als 2 KBytes zu limitieren.

                      Wenn ich mir dann den Quelltext anzeigen lasse, hört die Seite mitten im Code einfach auf.
                      Weis jemand warum?
                      Weil das Script an dieser Stelle aufhört, Daten in den Ausgabekanal zu schreiben. Nur wenn dies immer an der gleichen Stelle (gleiche Anzahl ausgegebener Bytes, siehe dein Access-Log) geschieht und der Server nicht den HTTP-Status-Code 200 sendet, könnte das auf ein fest eingestelltes Byte-Limit hindeuten.
                      Zuletzt geändert von fireweasel; 23.03.2012, 23:53.
                      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                      Kommentar


                      • #12
                        Ich würde jetzt mal folgendes probieren:

                        Kommentiere mal die Ausgabe des $row-Arrays aus und schreib einen Zähler in die Schleife rein, den du am Ende ausgibst.
                        Wenn es zu einer Ausgabe kommt und der Zähler bei den erwarteten 6000 steht, dann sollte man sich die Webserver-Konfiguration nochmal genauer ansehen.

                        Sollte es zu keiner Ausgabe kommen, würd ich als nächstes den Zähler schon bei jedem Schleifendurchlauf mal ausgeben lassen. Landet er dann wieder nur bei den ca. 2000 die du immer zurückbekommst, sollte man sich die Datenbank selbst bzw. die Anbindung der DB an PHP (ODBC-Treiber) mal näher ansehen, was es da alles zu konfigurieren usw. gibt. Evtl. ist die Datenmenge die der Datenbankserver an PHP übergibt irgendwo limitiert.
                        Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                        Schön - etwas Geschichte kann ja nicht schaden.
                        Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                        Kommentar


                        • #13
                          Hallo,

                          1. Das Datenarray ist mit 6335 Zeilen und 10 Spalten befüllt. Das bekomme ich auch angezeigt.
                          2. Wenn ich nur einen Zähler in der Schleife mitlaufen lasse. Bekomme ich alle Zählerstände bis zum Ende angezeigt.
                          3. Wenn ich nun wieder das Array durchlaufe, bekomme ich alle Zeilen angezeigt wenn ich maximal acht Spalten ausgebe. Bei allen 10 Spalten sind es immer nur 5550 Zeilen. Dann bricht das Script ab.

                          Ich bin langsam am Verzweifeln.
                          Gruß Jörg

                          Kommentar


                          • #14
                            Erscheint eine Ausgabe des Zählerstandes (nach der while-Schleife) wenn du alles (alle 10 Spalten) ausgeben lässt?

                            Um irgendeine Ursache mit der DB endgültig ausschließen zu können, würd ich mal die DB weglassen. Füll einfach mal ein Array mit den Werten einer typischen Datenbankzeile - lasse dieses Array nun in einer Schleife auch wieder ca. 7000 mal ausgeben. Läuft das Script durch, oder bricht es wieder nach x Durchläufen ab?

                            Mal so ganz nebenbei:
                            PHP 4.4.9? Schon mal ein Update in Erwägung gezogen?
                            Zuletzt geändert von Quetschi; 26.03.2012, 10:32.
                            Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                            Schön - etwas Geschichte kann ja nicht schaden.
                            Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                            Kommentar


                            • #15
                              Hallo,

                              hier mein Qelltext:
                              [FONT=Courier New]<body>
                              <?php
                              $data = array();[/FONT]

                              [FONT=Courier New]for ($d = 0; $d < 10; $d++){[/FONT]
                              [FONT=Courier New] $data[$d] = 'Spalte'.$d;[/FONT]
                              [FONT=Courier New]}[/FONT]

                              [FONT=Courier New]for ($i = 0; $i < 6500; $i++){[/FONT]
                              [FONT=Courier New] echo $i.":";[/FONT]
                              [FONT=Courier New] for ($d = 0; $d < 10; $d++){[/FONT]
                              [FONT=Courier New] echo $data[$d];[/FONT]
                              [FONT=Courier New] }[/FONT]
                              [FONT=Courier New] echo "<br>"."\n";[/FONT]
                              [FONT=Courier New]}[/FONT]
                              [FONT=Courier New]?>
                              <h2>Fertig</h2>
                              </body>[/FONT]
                              Das Ergebnis ist, dass das Script bei Zeile 5461:Spalte0 einfach endet. "Fertig" wird nicht mehr ausgegeben.

                              Gruß Jörg

                              P.S.: Update ist leider nicht. Es handelt sich um eine Anwendung mit ca. 200 Seiten à 1000 Zeilen Code.

                              Kommentar

                              Lädt...
                              X