|
| Gast |
Geschrieben am: Fr 23.09.2005, 17:10
|
|
Unregistered |
Hallo,
mittels $text = file_get_contents('gedcom.txt'); kann man ja eine ganze Datei in eine Variable speichern. Gut so. Nur was ist, wenn die Text-Datei 2 MByte oder sogar 10 MByte gross ist? Und ist es "normal", dass manchmal (oder auch ziemlich oft) bei einem 600 KByte großen File, wo er jede Zeile nach und nach durchgeht mittels for-Schleife, manchmal einfach 5 Minuten oder so bei einer Zeile verweilt? Woran könnte das liegen? Nach jedem Zeilendurchlauf wird per echo-Befehl etwas ausgegeben, könnte das was damit zu tun haben, dass immer erst wieder was an den Browser übertragen werden muss und dass das irgendwas überlastet? Es gibt ja noch die Variante immer nur eine Zeile einer Datei einzulesen. Wäre dies nicht besser bei 5 MByte großen Dateien? Und würde es dann nicht schneller gehen? Friedrich |
![]() |
|
| Sascha Ahlers |
#2 Geschrieben am: Fr 23.09.2005, 17:29 (+00:18)
|
||||
![]() AyomRank 8 Gruppe: Experten Entwicklung Beiträge: 1708 Mitglied seit: 27.12.2004 |
Hallo.
Als normal würde ich dieses verhalten nicht empfinden, vermutlich könnte dabei irgendein Zeichen Probleme bereiten, je nachdem, wie Du diese Datei Zeilenweise ausliest. Auch wird normalerweise erst nach Ablauf des PHP-Scriptes die Ausgabe an den Browser übermittelt, es sei denn, die Standardkonfiguration der php.ini wurde geändert oder Du verwendest die Funktion flush() um eine vorzeitige Ausgabe zu erzwingen. Eigentlich sollte PHP auch keine großen Schwierigkeiten damit haben Dateien von 10 MB auszulesen und abzuarbeiten.
Ja, es gibt Varianten um eine Datei stückchenweise einzulesen, doch denke ich nicht, dass diese umbedingt schneller sein werden, als wenn man die Datei gleich komplett einliest, dies hängt aber natürlich auch von den Verwendungszweck ab (z.B. wenn das Script nicht unbedingt die ganze Datei einlesen braucht). Ich denke file_get_contents() bzw. ein fopen() in verbindung mit einen fread(), welches die Datei dann gleich ganz ausliest, sind wohl die besten Methoden um eine Datei schnell komplett auszulesen (ansonsten einfach mal eine Preformence-Kontrolle machen bei den unterschiedlichen Methoden). Um genauere Aussagen machen zu können, müsste ich aber schon den Code sehen können. MfG Sascha Ahlers -------------------- Joseph Joubert: "Der Verstand kann uns sagen, was wir unterlassen sollen. - Aber das Herz kann uns sagen, was wir tun müssen."
Sicherheit beim Programmieren: Top 10 application vulnerabilities in 2007 |
||||
![]() |
| Gast |
#3 Geschrieben am: Fr 23.09.2005, 17:33 (+00:04)
|
|
Unregistered |
Hallo,
>> Auch wird normalerweise erst nach Ablauf des PHP-Scriptes die Ausgabe an den Browser übermittelt, es sei denn, die Standardkonfiguration der php.ini wurde geändert oder Du verwendest die Funktion flush() um eine vorzeitige Ausgabe zu erzwingen. Mitten in der For-Schleife gibt er einfach per echo-Befehl etwas aus. Und deshalb muss ja immer wieder etwas an den Browser übergeben werden. Gerade funktioniert es wieder richtig gut. Liegt es dann vielleicht an den Server? Denn dort geht er ja immer das Skript durch. Friedrich |
![]() |
|
| Sascha Ahlers |
#4 Geschrieben am: Fr 23.09.2005, 18:28 (+00:54)
|
||
![]() AyomRank 8 Gruppe: Experten Entwicklung Beiträge: 1708 Mitglied seit: 27.12.2004 |
Es kann natürlich am Server liegen, doch kann dies genauso entsprechend durch das Script mit beeinflusst werden. Um dies sicher sagen zu können, müsste ich mehr Einzelheiten kennen, aber es wäre durchaus denkbar. Der letzte Provider bei dem ich (noch) Webspace habe, hat z. B. riesige Probleme mit der MySQL Datenbank was entweder am Server liegt oder einfach an der Last, die dort drauf ist. Wogegen der Provider natürlich nichts macht, trotz mehrerer Hinweise. MfG Sascha Ahlers PS: Der Provider wird ab nächsten Monat deswegen auch Geschichte sein (zumind. bei mir) -------------------- Joseph Joubert: "Der Verstand kann uns sagen, was wir unterlassen sollen. - Aber das Herz kann uns sagen, was wir tun müssen."
Sicherheit beim Programmieren: Top 10 application vulnerabilities in 2007 |
||
![]() |
| Gast |
#5 Geschrieben am: Sa 24.09.2005, 11:39 (+17:10)
|
|
Unregistered |
Hallo!
nach meiner Meinung liegt es gar nicht an der Programmierung, da es mal da mal da abbricht. Hier eine Testdatei: http://www.adamio.com/test.txt Meine Idee: Da die Datei richtig lang ist braucht das Skript auch einige viele Minuten. Könnte es dann sein, dass der Anbieter nach soundsovielen Minuten ein Skript, was die ganze Zeit durchlaufen wird, einfach abbricht, weil es ja auch ein fehlerhaftes Skript sein könnte, was dann ewig laufen würde in einer Schleife? Wenn dem so sein sollte, was kann ich tun, damit der Server weiß, dass noch alles in Ordnung ist? Hilft es denn, eine Sekunde Pause immer zu machen (gibt es ja einen PHP-Befehl), oder interessiert das den Server nicht? Friedrich |
![]() |
|
| Sascha Ahlers |
#6 Geschrieben am: Sa 24.09.2005, 12:06 (+00:27)
|
![]() AyomRank 8 Gruppe: Experten Entwicklung Beiträge: 1708 Mitglied seit: 27.12.2004 |
Normalerweise bricht der Server die Ausführung eines Scriptes nach 30 Sekunden einfach ab, es sein denn, der Wert "max_execution_time" wurde verändert (ob innerhalb der php.ini, per Webserver Konfiguration oder im Script selber), doch selbst dann sollte das Script nach einer gewissen Zeit abbrechen, solange der Wert nicht auf "0" gesetzt wurde.
Eine Pause wird den Server kaum interessieren, die Verzögerung ist eigentlich nur für gewisse Sonderfälle vorgesehen, welche meistens außerhalb der Web-Programmierung. Ich glaube auch nicht, dass diese Pause bei deinen Problem einen Sinn ergibt. Klar, braucht das Script etwas länger wenn die Datei länger ist, besonders wenn das Script innerhalb einer Schleife arbeitet. Und natürlich kommt es auf die Befehlsanzahl innerhalb der Schleife an. Aber letzendlich sollen ja auch Datenbanken diese Zugriffzeiten minimieren. Vielleicht wäre ja eine Berkeley DB [1] sinnvoller als eine reine Textdatei. ;-) Oder gleich auf MySQL oder PostgreSQL zurückgreifen. Doch gehe ich ja auch an große Dateien ran und habe diese Probleme bisher nie gehabt. MfG Sascha Ahlers [1] PHP.net: Berkeley DB -------------------- Joseph Joubert: "Der Verstand kann uns sagen, was wir unterlassen sollen. - Aber das Herz kann uns sagen, was wir tun müssen."
Sicherheit beim Programmieren: Top 10 application vulnerabilities in 2007 |
![]() |
| Gast |
#7 Geschrieben am: Sa 24.09.2005, 12:28 (+00:22)
|
|
Unregistered |
Hallo!
Die erste Idee kann es nicht sein: "Legt die Zeit in Sekunden fest, die ein Script laufen darf. Ist diese Zeit abgelaufen, wird ein Fehler zurückgegeben." Denn am Ende wird kein Fehler ausgegeben, sondern es wird einfach nichts mehr gemacht. Fest steht, dass es nicht an einer bestimmten Stelle abbricht, also liegt es nicht mit den Daten zusammen, die übertragen werden sollen. Friedrich |
![]() |
|
| Sascha Ahlers |
#8 Geschrieben am: Sa 24.09.2005, 13:29 (+01:01)
|
||
![]() AyomRank 8 Gruppe: Experten Entwicklung Beiträge: 1708 Mitglied seit: 27.12.2004 |
Ja, ein Fehler wird zurückgegen, es heißt aber noch lange nicht, dass dieser direkt ausgegeben wird. Nebenbei war dies nur eine Erklärung, keine Idee. ;-) MfG Sascha Ahlers -------------------- Joseph Joubert: "Der Verstand kann uns sagen, was wir unterlassen sollen. - Aber das Herz kann uns sagen, was wir tun müssen."
Sicherheit beim Programmieren: Top 10 application vulnerabilities in 2007 |
||
![]() |
| Metaman |
#9 Geschrieben am: Sa 24.09.2005, 21:12 (+07:42)
|
||
|
AyomRank 5 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 361 Mitglied seit: 18.10.2004 |
wie wäre es mit einer leicht anderen richtung... mach aus dieser Datei wenn möglich doch eine .php und schreib an den Anfang einfach <? echo' und ans ende ' ?> uund lade dies dann mit include oder mit
-------------------- |
||
![]() |
| bull |
#10 Geschrieben am: Sa 24.09.2005, 21:28 (+00:15)
|
|
AyomRank 5 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 259 Mitglied seit: 18.08.2004 |
PHP hat auch ein Speicherlimit. Man bedenke dies.
Wäre aber wirklich vorteilhaft, wenn man ein Stück von dem "Code" sehen könnte. Insbesondere die Schleife. Da kann man gerade in PHP sehr schnell ein sehr langsames Skript produzieren |
![]() |
| Sascha Ahlers |
#11 Geschrieben am: Sa 24.09.2005, 22:39 (+01:10)
|
||
![]() AyomRank 8 Gruppe: Experten Entwicklung Beiträge: 1708 Mitglied seit: 27.12.2004 |
Die kurzen PHP-Tags würde ich nach Möglichkeit versuchen zu meiden. Desweiteren was möchtest Du mit diesem eher unsinnigen Code erreichen? - In dem Bezug gibt es bessere Methoden, die auch binär-sicher sind (z.B. file_get_contents, file oder fread). @Friedrich: Na ja, wie bull treffend sagt, ohne den Code kann Dir nur schwer weitergeholfen werden. Nur als Anmerkung nochmal kurz, wenn nach Ablauf der maximalen Ausführzeit keine Warnmeldung kommt, wird Sie auch nicht bei überschreiten des Speicherlimit erscheinen. MfG Sascha Ahlers -------------------- Joseph Joubert: "Der Verstand kann uns sagen, was wir unterlassen sollen. - Aber das Herz kann uns sagen, was wir tun müssen."
Sicherheit beim Programmieren: Top 10 application vulnerabilities in 2007 |
||
![]() |
| Gast |
#12 Geschrieben am: So 25.09.2005, 10:53 (+12:13)
|
||
|
Unregistered |
Hallo, ich habe versucht, den Code auf das Wichtigste zu kürzen:
Übrigens besitzt die einzufügende Datei beinahe 15000 Zeilen. Es geht um das Einfügen von einer GEDCOM-Datei (für Ahnenforschung). Pro Zeile steht eine Informationen. Fängt eine Zeile mit 0 an wird zum Beispiel ein neuer Vorfahre angefangen, 1 und 2 etc. beziehen sich dann darauf. Die Schleife geht meiner Meinung nach nicht kleiner. Was mir jetzt aber noch als Idee aufgekommen ist (über Nacht): Er soll einfach nur die ersten 1000 Zeilen abarbeiten und dann lädt er per Location-Befehl die gleiche Datei, allerdings fängt er jetzt bei Zeile 1000 an zu arbeiten. Damit würde das Abarbeiten sozusagen kurz unterbrochen werden und der Server dürfte es nicht als Endlosschleife interpretieren. Oder? Friedrich |
||
![]() |
|
| Sascha Ahlers |
#13 Geschrieben am: So 25.09.2005, 11:18 (+00:25)
|
![]() AyomRank 8 Gruppe: Experten Entwicklung Beiträge: 1708 Mitglied seit: 27.12.2004 |
Das sind schon mehr Informationen, ich schaue mir nachher mal den Code etwas genauer an, doch hört sich das für mich so an, dass Du wohl doch besser eine richtige Datenbank verwenden solltest.
Also auch mal so aus interesse, was sind den die Gründe dafür, dass Du die Werte in eine Textdatei speicherst als gleich in eine Datenbank (andere Programme, keine Datenbank, nicht die entsprechenden PHP Module, etc.)? MfG Sascha Ahlers -------------------- Joseph Joubert: "Der Verstand kann uns sagen, was wir unterlassen sollen. - Aber das Herz kann uns sagen, was wir tun müssen."
Sicherheit beim Programmieren: Top 10 application vulnerabilities in 2007 |
![]() |
| Sascha Ahlers |
#14 Geschrieben am: So 25.09.2005, 13:46 (+02:27)
|
||
![]() AyomRank 8 Gruppe: Experten Entwicklung Beiträge: 1708 Mitglied seit: 27.12.2004 |
Ich sehe schon, warum Du Dir diese Mühe machst, wäre es aber nicht trotzdem Sinnvoll diese Daten in eine Datenbank zu speichern. Via Script einmal komplett einlesen bzw. auch wieder in eine Datei speichern? - Zumindestens bei so großen Datenmengen. MfG Sascha Ahlers -------------------- Joseph Joubert: "Der Verstand kann uns sagen, was wir unterlassen sollen. - Aber das Herz kann uns sagen, was wir tun müssen."
Sicherheit beim Programmieren: Top 10 application vulnerabilities in 2007 |
||
![]() |
| Gast |
#15 Geschrieben am: So 25.09.2005, 18:22 (+04:35)
|
|
Unregistered |
Hallo,
nun, die Textdatei wird ja sousagen übergeben per Upload-Formular. Du meinst, dass ich danach den ganzen Inhalt in der Datenbank sofort speichern sollte, oder die Informationen in einer Textdatei auf dem Server hinterlegen sollte? Aber das Ding dann ist ja wieder: Ich möchte all die Informationen in meine eigene Datenbank eingefügt sehen, dass heißt, dass ich jede Zeile auslesen muss und nachsehe, in welches Feld ich die Information speichern soll. Würde es denn Vorteile bringen, erst eine Textdatei auf dem Server zu erstellen, als sofort alles in einem String zu speichern und abzuarbeiten? Meiner Meinung nach wäre das am Ende das Gleiche, oder? Was hällst du von der Idee, dass man die ersten 100 Zeilen abarbeitet, er sich merkt, wo er gerade ist und dann per Location die Datei wieder aufruft? Friedrich |
![]() |
|
| Sascha Ahlers |
#16 Geschrieben am: So 25.09.2005, 18:31 (+00:08)
|
||||
![]() AyomRank 8 Gruppe: Experten Entwicklung Beiträge: 1708 Mitglied seit: 27.12.2004 |
Da müsstest Du mir mal erklären, was Du genau vor hast. Ich weiß nun, dass Du die Datei abarbeiten musst, welche Du über einen Upload bekommst und diese für ein Programm ist, welches wohl von Microsoft ist. Nebenbei war das nur ein Vorschlag von mir, denn 15 MB große Dateien müssen ja auch von irgendwo her kommen.
Das wäre eine Möglichkeit, würde ich aber versuchen zu vermeiden, auch ist mir selber nur eine Anwendung bekannt, die so arbeitet und diese ist eher für Webdesigner gedacht und nicht für den 08/15 Benutzer. MfG Sascha Ahlers -------------------- Joseph Joubert: "Der Verstand kann uns sagen, was wir unterlassen sollen. - Aber das Herz kann uns sagen, was wir tun müssen."
Sicherheit beim Programmieren: Top 10 application vulnerabilities in 2007 |
||||
![]() |
| Gast |
#17 Geschrieben am: So 25.09.2005, 18:37 (+00:06)
|
||
|
Unregistered |
Hallo, ich programmiere die Seite Adamio.com. Für Familienforscher gibt es das Format GEDCOM, das von vielen Programmen unterstützt wird. Damit kann man die Vorfahrendaten von Programm zu Programm übertragen. Auf Adamio.com soll dies auch funktionieren. Familienforscher sollen ihre bereits erforschten Vorfahren eintragen können. Das geht über ein Upload-Formular (wo sie eine Gedcom-Datei auswählen, die mit einem anderen Ahnenforschungsprogramm erstellt wurde). All die Daten in der Datei möchte ich nun in meiner Adamio.com-Datenbank speichern, damit später andere Forscher nach gleichen Vorfahren suchen können.
Bei dieser Idee müsste ich zuerst eine Textdatei mit all den Daten auf dem Server erstellen. Würde in der Programmierung vielleicht etwas komplizierter sein. Was würde dagegen sprechen? Friedrich |
||
![]() |
|
| bull |
#18 Geschrieben am: Mo 26.09.2005, 07:03 (+12:26)
|
||||||
|
AyomRank 5 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 259 Mitglied seit: 18.08.2004 |
Meß mal wie lange der "Code" (traue mich kaum, es so zu bezeichnen) braucht.
<Zu messender Abschnitt>
Bevorzugt zu messender Abschnitt:
und sag uns was rauskommt. Einen mehrere Hundert kB langen String in ein Array mit mehreren tausend Elementen umzuwandeln verbraucht Speicher und ist langsam. Für das, was hier benötigt wird, könnte strtok auch eine (schnellere) Alternative sein. |
||||||
![]() |
| Gast |
#19 Geschrieben am: Mo 26.09.2005, 13:10 (+06:06)
|
|
Unregistered |
Hallo,
das Uploaden dauert nicht allzu lange bei einer 200 KByte Text-Datei, selbst mit einer 1 MByte Datei funktioniert es bestens. Das aufsplitten dauert auch nicht lange, was lange dauert ist natürlich die For-Schleife, wo jede Zeile ausgelesen wird. Nur denke ich, dass das normal ist. Interessant, was ich jetzt herausgefunden habe: Das Abarbeiten einer riesigen Datei hat rund 2 Minuten gedauert, was ja eingentlich nicht gehen dürfte, wenn der Abbruch bereits nach 30 Sekunden Ausführungszeit gestartet wird. Friedrich |
![]() |
|
| Sascha Ahlers |
#20 Geschrieben am: Mo 26.09.2005, 16:32 (+03:22)
|
||||||
![]() AyomRank 8 Gruppe: Experten Entwicklung Beiträge: 1708 Mitglied seit: 27.12.2004 |
Reine Bearbeitungszeit ohne die Upload-Zeit oder zusammen mit der Upload-Zeit? - Das gilt hier auch mit zu beachten. Nebenbei ersetzt mal den Quatsch:
mit:
Besonders weil dein Code beim zählen der Zeilenanzahl auch Fehler unterläufen können, je nachdem welche Ende die einzelnen Zeilen haben. Bei dir passiert ungefährt das, wenn 4 Zeilencode geschreiben sind (einige mögliche Varianten):
MfG Sascha Ahlers -------------------- Joseph Joubert: "Der Verstand kann uns sagen, was wir unterlassen sollen. - Aber das Herz kann uns sagen, was wir tun müssen."
Sicherheit beim Programmieren: Top 10 application vulnerabilities in 2007 |
||||||
![]() |
Thema wird von 0 Benutzer(n) gelesen (0 Gäste und 0 anonyme Benutzer)
0 Mitglieder:
Trackback-Url: http://www.ayom.com/track/t/8450
Seiten: (2) [1] 2 |
![]() ![]() ![]() |
| Themen Titel | Autor | Views | Antworten | Letzte Aktion |
| 7 oder 19% Ust. auf Datei-Downloads ? | claudinchen | 253 | 6 | Mo 1.12.2008, 22:04 |
| Falsche Index-Datei indexiert | Hannes_W | 221 | 6 | Fr 7.11.2008, 08:25 |
| Link zu einer Datei auf dem Server setzen | sylvia73 | 136 | 1 | Mo 15.09.2008, 19:39 |
| MDB-Datei auslesen | sylvia73 | 479 | 5 | Mo 8.09.2008, 23:17 |
| Php-Variable in einer Javascript-Datei | Jan_cmp | 348 | 3 | Fr 25.07.2008, 17:34 |
| XML in eine php Datei | kekskruemel | 472 | 8 | So 13.07.2008, 12:25 |
| Ms dos Datei in Text-Datei umwandeln | sylvia73 | 190 | 3 | Mi 2.07.2008, 15:44 |
| Formular autom. in DB speichern | radarin | 330 | 4 | So 8.06.2008, 03:07 |
| DLL-Datei für Ereignismeldungen | das_siemens | 116 | 0 | Fr 6.06.2008, 07:24 |
| Sicherheit: Datei auf Veränderung prüfen! | halbesbit | 284 | 9 | So 1.06.2008, 08:31 |
Anzeige - [Hier werben / Mediadaten]















