php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 14-04-2011, 12:42
Bellringer
 Registrierter Benutzer
Links : Onlinestatus : Bellringer ist offline
Registriert seit: Apr 2010
Beiträge: 7
Bellringer befindet sich auf einem aufstrebenden Ast
Question Reverse Proxy Timeout umgehen

Hallo ihr,

nach längerer Zeit mal wieder ein Frage von mir:

Wir haben für einen Kunden ein Analysesystem gebastelt welche eine recht große Datenmenge (zur Zeit 1,7 Mio. Einträge) mittels count und diverser WHERE Bedingungen durchzählt und darstellt. Insgesamt sind das im schlimmsten Fall 270 Abfragen die an MySQL geschickt werden wo eine zwischen einer und sechs Sekunden braucht.

Leider ist das Timeout bei unserem Kunden auf 120sec. gestellt und unser Script benötigt öfters mal etwas länger. (Es handelt sich um eine Analyse die nur sehr selten gemacht werden muss)

Es handelt sich um einen Windowswebserver mit MySQL Datenbank.
Wie das System genauer aufgebaut ist, wurde mir leider nicht verraten - warum auch immer.

Ich hatte nun versucht einfach einen HTML Kommentar zwischen den Abfragen zu senden um diesen Timeout zu umgehen. Leider bin ich nicht soo fit in PHP und wollte mal nachfragen was ihr da machen würdet?

Mein bescheidener Ansatz war dies hier:
Code:
echo "<!-- foobar -->";
flush();
ob_flush();
Für jegliche Tipps / Infos wäre ich sehr dankbar.
Mit Zitat antworten
  #2 (permalink)  
Alt 14-04-2011, 13:17
streuner
 Registrierter Benutzer
Links : Onlinestatus : streuner ist offline
Registriert seit: Aug 2009
Ort: Lüneburg
Beiträge: 623
streuner ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Crossposting: Reverse Proxy Timeout umgehen - php.de
__________________
Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

"Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"
Mit Zitat antworten
  #3 (permalink)  
Alt 14-04-2011, 13:19
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

welche Optimierungsmaßnahmen habt ihr durchgeführt, um diese Abfragerei an sich schon schneller zu machen? Habt ihr die DB sinnvoll indiziert? Habt ihr Abfragen so aufgebaut, dass möglichst Equi-Joins benutzt werden? Habt ihr korrelierte Unterabfragen vermieden und weitestgehend unkorrelierte Unterabfragen oder Joins verwendet? Habt ihr die Datenbanktabellen so vorsortiert, wie sie auch bei der Abfrage hauptsächlich sortiert werden wird?

Man kann die Scriptlaufzeit je nach Provider nicht immer beliebig verlängern. PHP kann das zwar, aber der Provider kann in seiner Hauptkonfiguration trotzdem festlegen, dass z. B. nach 120s Schluss ist, egal wie sehr du mit set_time_limit entgegensteuerst.

Was aber geht: Eine Seite bauen, die eine kleine Portion abarbeitet, in der Session speichert, wie weit sie gekommen ist und sich dann selbst wieder aufruft. Da das mehrere Anfragen sind, gilt das Timeout nur für jede einzelne und in Summe kann so eine Seite durchaus sehr langwierige Arbeiten erledigen. Die Technik ist zwar nicht so schön und man sollte auch überlegen, ob man diese Aufgabe nicht eher als Cronjob erledigen kann und den Benutzer per E-Mail "zurückruft", wenn das Ergebnis fertig ist (vgl. auch browsershots.org), aber es wäre eine Möglichkeit.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #4 (permalink)  
Alt 14-04-2011, 13:36
Bellringer
 Registrierter Benutzer
Links : Onlinestatus : Bellringer ist offline
Registriert seit: Apr 2010
Beiträge: 7
Bellringer befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
welche Optimierungsmaßnahmen habt ihr durchgeführt, um diese Abfragerei an sich schon schneller zu machen? Habt ihr die DB sinnvoll indiziert? Habt ihr Abfragen so aufgebaut, dass möglichst Equi-Joins benutzt werden? Habt ihr korrelierte Unterabfragen vermieden und weitestgehend unkorrelierte Unterabfragen oder Joins verwendet? Habt ihr die Datenbanktabellen so vorsortiert, wie sie auch bei der Abfrage hauptsächlich sortiert werden wird?
Wir haben die einzelnen Felder mit Indizes versehen und mit explain
getestet. Die Abfragen beinhalten keine Joins und auch keine Unterabfragen. Die Datenbanktabelle vorsortiert? Nein, wie ist das gemeint? Die Indizes stellen doch mehr oder weniger vorsortierte Tabelle dar oder nicht?

Zitat:
Man kann die Scriptlaufzeit je nach Provider nicht immer beliebig verlängern. PHP kann das zwar, aber der Provider kann in seiner Hauptkonfiguration trotzdem festlegen, dass z. B. nach 120s Schluss ist, egal wie sehr du mit set_time_limit entgegensteuerst.
Da dies ein rootserver ist, kann unser Kunde bzw sein Dienstleister dieses Tieout setzen wie es gebraucht wird. Hier geht es aber wohl nicht um die Scriptlaufzeit von php sondern um die Einstellungen des ReverseProxys, der nach 120sec ohne etwas zu senden abbricht. Es müsste also nur spätestens alle 120sec etwas gesendet werden wenn ich das richtig verstehe. :-/


Zitat:
Was aber geht: Eine Seite bauen, die eine kleine Portion abarbeitet, in der Session speichert, wie weit sie gekommen ist und sich dann selbst wieder aufruft. Da das mehrere Anfragen sind, gilt das Timeout nur für jede einzelne und in Summe kann so eine Seite durchaus sehr langwierige Arbeiten erledigen. Die Technik ist zwar nicht so schön und man sollte auch überlegen, ob man diese Aufgabe nicht eher als Cronjob erledigen kann und den Benutzer per E-Mail "zurückruft", wenn das Ergebnis fertig ist (vgl. auch browsershots.org), aber es wäre eine Möglichkeit.
In das Thema "in der Session speichern" muss ich mich mal eben einlesen. Einen Cronjob dafür anzulegen scheint auch nicht DIE Lösung zu sein, da der Kunde diverse Dinge filtern kann. Wenn ich alle Möglichkeiten vorab anlege hat der Server regelmäßig eine Menge unnütze Dinge zu tun.

Sorry für das Crossponsting. Werde den Beitrag auf php.de löschen bzw löschen lassen.

Geändert von Bellringer (14-04-2011 um 13:38 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 14-04-2011, 13:47
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Bellringer Beitrag anzeigen
Die Abfragen beinhalten keine Joins
Vielleicht sollten sie das aber tun, vermutlich lässt sich dadurch die Anzahl der Abfragen wesentlich reduzieren.

Zitat:
Zitat von Bellringer Beitrag anzeigen
Die Datenbanktabelle vorsortiert? Nein, wie ist das gemeint?
Lies mal im Handbuch zu ALTER TABLE den Abschnitt über ORDER BY.

Zitat:
Zitat von Bellringer Beitrag anzeigen
Hier geht es aber wohl nicht um die Scriptlaufzeit von php sondern um die Einstellungen des ReverseProxys, der nach 120sec ohne etwas zu senden abbricht. Es müsste also nur spätestens alle 120sec etwas gesendet werden wenn ich das richtig verstehe. :-/
Das ließe sich beheben. Auch wenn du noch keine Ausgabe zusammengeklöppelt hast, weil du noch vorsortierst und pufferst oder ähnliches, kannst du dem Browser Leerzeilen oder HTML-Kommentare schicken (z. B. nach jeder Abfrage) und flushen, um etwas zum Senden zu haben.

Zitat:
Zitat von Bellringer Beitrag anzeigen
Einen Cronjob dafür anzulegen scheint auch nicht DIE Lösung zu sein, da der Kunde diverse Dinge filtern kann.
Das kann er doch tun und diesen Auftrag könnte man dann erstmal mit allen Such- und Filterkriterien speichern. Dann kommt irgendwann der Cronjob vorbei, sieht sich diesen Auftrag an, arbeitet ihn ab, speichert das Ergebnis und schickt dem User eine E-Mail, dass es fertig ist.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #6 (permalink)  
Alt 14-04-2011, 14:06
Bellringer
 Registrierter Benutzer
Links : Onlinestatus : Bellringer ist offline
Registriert seit: Apr 2010
Beiträge: 7
Bellringer befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Vielleicht sollten sie das aber tun, vermutlich lässt sich dadurch die Anzahl der Abfragen wesentlich reduzieren.
Leider nicht. Mit Datenbankabfragen kenn ich mich ganz gut aus.

Zitat:
Lies mal im Handbuch zu ALTER TABLE den Abschnitt über ORDER BY.
Bringt mich leider auch nicht weiter, da die Abfragen verschiedene sortierungen benötigen würde.


Zitat:
Das ließe sich beheben. Auch wenn du noch keine Ausgabe zusammengeklöppelt hast, weil du noch vorsortierst und pufferst oder ähnliches, kannst du dem Browser Leerzeilen oder HTML-Kommentare schicken (z. B. nach jeder Abfrage) und flushen, um etwas zum Senden zu haben.
Genau das funktioniert bei mir irgendwie nicht wirklich.
Siehe Codebeispiel oben. Ich versuche einen HTML Kommentar zu senden und dann mittels flush() an den Browser zu schicken.

Zitat:
Das kann er doch tun und diesen Auftrag könnte man dann erstmal mit allen Such- und Filterkriterien speichern. Dann kommt irgendwann der Cronjob vorbei, sieht sich diesen Auftrag an, arbeitet ihn ab, speichert das Ergebnis und schickt dem User eine E-Mail, dass es fertig ist.
Das wäre dann wohl meine Alternative - dafür müsste ich aber ne Menge ändern und dafür hab ich eigentlich keine Zeit. (...und bezahlt würde es auch nicht)

VIELEN DANK für deine Hilfe schon mal... Hast du vielleicht eine Idee warum das mit dem flush() nicht funktionieren könnte? Hat es evtl damit zu tun, dass es ein WindowsServer ist?
Mit Zitat antworten
  #7 (permalink)  
Alt 14-04-2011, 14:11
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Bellringer Beitrag anzeigen
Siehe Codebeispiel oben. Ich versuche einen HTML Kommentar zu senden und dann mittels flush() an den Browser zu schicken.
Ach na eben, das hatte ich übersehen. Das flush-Problem bei Apache auf Windows ist bekannt, also dürfte das der Grund sein.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!

Geändert von AmicaNoctis (14-04-2011 um 14:15 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 14-04-2011, 14:30
Bellringer
 Registrierter Benutzer
Links : Onlinestatus : Bellringer ist offline
Registriert seit: Apr 2010
Beiträge: 7
Bellringer befindet sich auf einem aufstrebenden Ast
Standard

Dort läuft ein Microsoft-IIS/7.0 - scheint da aber genauso Probleme zu haben...

Naja, ich werde mal eine Runde lesen und schauen ob mir noch eine alternative zum Cronjob o.ä. einfällt. So ein Mist.
Mit Zitat antworten
  #9 (permalink)  
Alt 14-04-2011, 14:31
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Naja, ich hatte noch eine Alternative genannt: Abarbeitungszustand in der Session speichern, kleine Portionen abarbeiten, Seite ruft sich selbst wieder auf.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #10 (permalink)  
Alt 14-04-2011, 14:51
Bellringer
 Registrierter Benutzer
Links : Onlinestatus : Bellringer ist offline
Registriert seit: Apr 2010
Beiträge: 7
Bellringer befindet sich auf einem aufstrebenden Ast
Standard

Stimmt! Danke nochmals...
Ich werde eine Rückmeldung geben wie ich es gemacht habe.
Ich liebe unbezahlte Arbeit.
Mit Zitat antworten
  #11 (permalink)  
Alt 15-04-2011, 13:20
Bellringer
 Registrierter Benutzer
Links : Onlinestatus : Bellringer ist offline
Registriert seit: Apr 2010
Beiträge: 7
Bellringer befindet sich auf einem aufstrebenden Ast
Standard

Nur mal kurz um diesen Thread ordentlich zu beenden:

Um dieses Timeout mit dem Senden eines Kommentares zu verhindern
muss der FastCGI Buffer voll sein, sonst sendet der Win32 Server nichts.

In unserem Fall steht dieser auf 4kb - also klappt es so:
PHP-Code:
ob_start();
echo 
"<!" str_repeat(" ",4096) . ">";
ob_flush();
flush();
ob_end_flush(); 

Sieht zwar nicht schön aus - aber es klappt!

Geändert von Bellringer (15-04-2011 um 14:42 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
flush(), reverse proxy, timeout


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Reverse Engineering auf Mac floorball92 Entwicklungsumgebungen 8 23-12-2009 14:03
Umgehen von HTTP TimeOut durch mehrmaliges Scriptausführen DuRoX PHP Developer Forum 9 09-02-2007 16:11
Reverse Ip Lookup? scriptinstall Jobgesuche 0 19-10-2005 20:15
Reverse mayo PHP Developer Forum 4 20-04-2004 13:56
proxy mit php umgehen! HILFE! freeman PHP Developer Forum 1 02-05-2002 00:57

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:19 Uhr.