Zum Inhalt springen

Timeout beim eingebundenen PHP Script

Erstellt am 17. Mai 2006 · 11 Antworten · letzte Antwort am 17. August 2006

Tags: Frage

cinos22 ·

Hallo!

Ich habe in eine Typo3 (Version 4.0) Seite ein PHP Script eingebunden. Leider läuft das Script durch diverse Datenbankabfragen ca. 100 Sekunden!

Beim Aufruf der Typo3 Seite mit dem eingebundenen Script mit einem Opera Browser läuft es problemlos durch. #giggle#

Wenn ich die gleiche Seite mit dem Internet Explorer aufrufe, bricht es nach ca. 30 Sekunden ohne Fehlermeldung ab. Auch nachfolgenden Content-Elemente werden dann nicht mehr angezeigt. #evil#

Diverse Tests brachten folgenden heraus:

- Script ohne Typo3 mit Opera => OK
- Script ohne Typo3 mit IE => OK
- Script mit Typo3 mit Opera => OK
- Script mit Typo3 mit IE => Abbruch #angry#

Es sieht demnach so aus, das Typo3 irgendwo beim Seitenaufbau nach 30 Sekunden einen Timeout macht. Grundlegende Timeout Einstellungen in PHP und Apache habe ich bereits angepasst; ohne Erfolg.

Hat jemand ne Idee?

Gruss ...

... Christian

woida ·

Ich denke mal, daß sich die meisten MySQL Datenbankabfragen die 100s und länger brauchen durch optimierung der Tabellen und Abfragen die Geschwindigkeit leicht um den Faktor 10 steigern läßt.

Zu deinem (eigentlichen) Problem: Es ist einfach die maximale Ausführungsdauer der PHP Skripte zu niedrig eingestellt.
Wenn du dein Skript unter Typo3 ausführst, braucht natürlich auch Typo3 Zeit, damit sein Code ausgeführt wird.

Grundlegende Timeout Einstellungen in PHP und Apache habe ich bereits angepasst; ohne Erfolg.

Aha. Und was sind grundlegende Einstellungen genau?

cinos22 ·

Ich denke mal, daß sich die meisten MySQL Datenbankabfragen die 100s und länger brauchen durch optimierung der Tabellen und Abfragen die Geschwindigkeit leicht um den Faktor 10 steigern läßt.

Bei einer MySQL Datenbanktabelle sag ich mal ja. Ich greife aber über einen OCI8 Treiber im Read Modus auf eine externe Oracle 8.1.7 Datenbank zurück. Leider kann ich die Tabellen (z.B. Indiez) nicht beeinflussen. Hier mal mein PHP Abfragescript:

$sql = "SELECT INFOR.RELES.DATENFELDER_1, INFOR.RELES.DATENFELDER_2, INFOR.RELES.MONATE_$z, INFOR.RELES.DATENFELDER_3, INFOR.RELES.SATZART FROM INFOR.RELES WHERE (INFOR.RELES.SATZART = 'AEMGRBEZ' or INFOR.RELES.SATZART = 'AEUGRBEZ' or INFOR.RELES.SATZART = 'AAGR1BEZ' OR INFOR.RELES.SATZART = 'UAGR1BEZ') AND INFOR.RELES.MONATE_$z <> '0' order by INFOR.RELES.SATZART"; 

$result = OCI_Parse($con, $sql) or die ("Keine Analyse möglich!");
OCI_Execute($result) or die ("Datenbankabfrage kann nicht ausgeführt werden!");
while ($row = oci_fetch_array ($result, OCI_BOTH)) {
      ....
}

Der Befehl "OCI_Execute" braucht für die Abfrage ca. 90 Sekunden. Er fragt dabei eine Datenbank mit 530.000 Einträge ab und erhält ca. 1200 Ergebnisse. Leider weiss ich nicht, wie ich das SQL Statement noch verbessern kann.

Aha. Und was sind grundlegende Einstellungen genau?

  • PHP - max_execution_time = 120
    PHP - max_input_time = -1
    PHP - memory_limit = 64M
    Apache - Connection: 300 - Keep-Alive: 15

Was mir noch aufgefallen ist, dass es durchaus auch ein Bug vom IE sein kann. Wenn ich die Typo3 Seite mit Script das 1x mal aufrufe, bricht die Ausgabe nach ca. 30 Sekunden ab. Wenn ich dann einen Browserrefresh mache läuft es durch.

Sehe im Moment noch keine Idee, wie ich das Problem lösen kann. Gibts noch ne Möglichkeit das SQL Script zu optimieren?

woida ·

An der Datenbankabfrage wirst du nix optimieren können, da die ja eingentlich ziemlich primitiv ist. Es sind ja nur ein paar Bedinungen drin und keine großen Joins. Die einzige Optimierungsmöglichkeit liegt im Index.

Und da die Datenbank ja extern abgefragt wird, dauerst natürlich noch zusätzlich.

Setz halt einfach deine max_execution_time höher.

cinos22 ·

In der Standardeinstellung der PHP.ini stand bei max_execution_time vorher 30 Sekunden. Ich hatte erst gedacht, dass es daran liegt, aber selbst 120 Sekunden und mehr brachte nichts.

Das Verrückte ist ja, dass es in Opera ohne Problem funktioniert und im Internet Explorer nicht. Mittlerweise vermutet ich den "Bug" auch schon nicht mehr in Typo3, sondern im IE selbst. #paralyzed#

Ich habe auch schon diverse Workarrounds probiert:

z.B. Formularwerte mit $_POST an die gleiche PHP Datei übergeben und dann eine Weiterleitung auf die gleiche PHP Datei mit den Forumlarwerten im $_GET Modus und dann mit diesen Werten das Abfragescript aufrufen.

Aber egal was ich auch versuche, der korrekte Scriptablauf funktioniert im IE nur, wenn ich im Browser einen manuellen Refresh mache.

zarduschti ·

Hey,

ich weiss, dass gehört eigentlich nicht hierher, aber da ich bislang nichts anderes gefunden habe, was annähernd mehr mit meiner Problemstellung zutan hat, wende ich mich mal an euch. Ich möchte ein externes PHP-Skript, dass auf eine eigene MySql - Datenbank zugreift in eine mit Typo3 erstellte Seite einbauen.
Das Skript ist meiner Meinung nach in der Funktion recht umfangreich, d.h. es gibt drei Arbeitsbereiche: 1.Anmeldung/Login/Edit für User / 2.Admin / 3.Ausgabe mit Suchfunktion.
Kann so was funktionieren ? Wenn ja wie!

cinos22 ·

Um kurz zu fassen. Mir fallen zwei Möglichkeiten ein.

1. Extention: Page PHP Content
Einfach die Extention installieren und dann hast Du ein neues Inhaltselement (PHP Script).

2. Typoscript Einbindung
Du bindest im Template (Setup) das hier ein:

tt_content.script = CASE 
tt_content.script { 
  key.field = select_key 
    phpscriptbezeichnung = PHP_SCRIPT_EXT 
    phpscriptbezeichnung.file = fileadmin/.../dateiname.php
}

Anschließend machst Du in der benötigten Seite ein neues Seitenelement vom Typ Script und gibts dort bei Code die Bezeichnung hier "phpscriptbezeichnung" ein.

adriana82 ·

Hallo,
ich hoffe das die Thema noch aktuell ist.... #paralyzed#
Ich möchte auch die zweite Methode benutzen. Aber ich habe noch ein paar Fragen dazu....
Aber zuerst sage ich euch lieber was ich eigentlich möchte.
Ich habe für eine Seite ein PHP Code als Inhalt gehabt (mit Page PHP Content). Mein Problem war und ist das ich den Text die ich mit php ausgegeben habe auf jede Seite vorgekommen ist. Kann ich z.B in mein Template ein Platzhalter machen und dann mit TypoScript definieren was es raus kommen soll? Weil, wenn ich eine Internetseite mit 100 Unterseiten habe ist diese Methode mit Page PHP Content ein bischen umständlich.
Kann man sowas überhaupt machen???? #paralyzed#
Für jede Hilfe bin ich sehr dankbar
LG Adriana

Stoneage ·

@cinos22: Benutz doch die eID Funktion von Typo3 4.0.0. Da wird schon in der index.php verzweigt und viele Typo3 Funktionen werden gar nicht benutzt.

cinos22 ·

@cinos22: Benutz doch die eID Funktion von Typo3 4.0.0. Da wird schon in der index.php verzweigt und viele Typo3 Funktionen werden gar nicht benutzt.

Hi Tetramatrix,

kannste mich kurz aufklären, was genau Du meinst? Finde leider reichlich wenig über eID. DANKE!

basti79 ·

Cinos, bist du dir bewußt, dass manche neueren PHP-Installationen (debian zB) unterschiedliche php.ini verwenden für Kommandozeile und Apache-Plugin?

Außerdem cachen viele Datenbanken vorige queries, selbst wenn sie abgebrochen wurden - es mag also sein, dass du bei einem Refresh einfach das von der ersten Abfrage in der Zwischenzeit errechnete und jetzt gecachete Ergebnis bekommst.

cinos22 ·

Cinos, bist du dir bewußt, dass manche neueren PHP-Installationen (debian zB) unterschiedliche php.ini verwenden für Kommandozeile und Apache-Plugin?

Das kannte ich noch nicht, triff aber bei meiner Konfig nicht zu. 😉

Außerdem cachen viele Datenbanken vorige queries, selbst wenn sie abgebrochen wurden - es mag also sein, dass du bei einem Refresh einfach das von der ersten Abfrage in der Zwischenzeit errechnete und jetzt gecachete Ergebnis bekommst.

Das je nach Optimizer Konfiguration der DB Queries gecached werden, wusste ich, hat aber nichts mit dem "IE Bug" zu tun. Der IE hört einfach mit dem Laden der Seite auf, weil das PHP Script nicht schnell genug (wegen der DB-Abfrage) die Daten schickt. Der IE zeigt als Status "fertig" an, obwohl dies nicht korrekt ist. Mache ich anschließend einen Browserrefresh funktioniert alles, auch wenn die DB-Abfrage mal 10 Minuten dauert.