php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Scripts > BRAINSTORMING PHP/SQL/HTML/JS/CSS
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


BRAINSTORMING PHP/SQL/HTML/JS/CSS Ihr habt eine Idee, aber keinen genauen Ansatz? Diskutiert mit anderen Usern des Forums über eure Gedankengänge um evtl. hilfreiche Ideen zu bekommen!
Normale Fragen bitte weiterhin in die entsprechenden Foren!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 09-07-2009, 11:18
Wurzel
 Master
Links : Onlinestatus : Wurzel ist offline
Registriert seit: Jul 2002
Ort: double-u-upper-valley
Beiträge: 7.477
Wurzel ist zur Zeit noch ein unbeschriebenes Blatt
Standard filesystem: daten abgleichen

aloah,

ich bin auf der suche nach einer brauchbaren lösung für folgendes problem:

ich erhalte daten von extern (Excel/Access/SQL/csv/etc.pp). diese daten werden extern gepflegt, bearbeitet, aktualisiert. auf diesen vorgang habe ich keinen zugriff, d.h. ich kann ihn nicht beeinflussen. und ich weiss in der regel nicht, ob - und wenn ja, welche - datensätze sich geändert haben.

diese externen daten landen bei mir in einer extra angelegten mysql-db, durchlaufen dann ein script, das den ganzen sums aufbereitet und speziell formatierte textdateien (ASCII) auf die Platte schreibt. diese textdateien sind mit einer anderen software verknüpft (auf die ich keinen einfluss habe), die anhand des dateidatums prüft, ob sich eine datei geändert hat oder nicht. ist das dateidatum verändert, wird die verknüpfung aktualisiert, was unter umständen auswirkungen auf die letztendliche verarbeitung haben kann.

so, mir geht es also darum, NUR die textdateien zu aktualisieren, die sich wirklich geändert haben.

ich hab bislang 2 lösungsansätze:
a) bevor ich den dateiinhalt in die datei schreibe, lese ich dei bestehende datei aus, mache einen stringvergleich und schreibe die daten, wenn ein unterschied besteht.
b) ich speichere in einer eigenen tabelle eine id für den datensatz und einen hash (md5/sha1) des inhaltes, erzeuge im durchlauf einen hash der neuen inhalte, vergleiche den und schreibe die daten, wenn ein unterschied besteht.

(b) finde ich prickelnder, bin mir aber nicht sicher, ob das wirklich bei 300 - 1000 datensätzen hinhaut. aber vielleicht hat ja jemand noch eine andere idee.
__________________
Kissolino.com
Mit Zitat antworten
  #2 (permalink)  
Alt 09-07-2009, 15:13
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Wurzel Beitrag anzeigen
so, mir geht es also darum, NUR die textdateien zu aktualisieren, die sich wirklich geändert haben.
Mir ist gerade die Richtung, in der dich Veränderung interessiert, nicht ganz klar - willst du von dir weggeschriebene Dateien aktualisieren, wenn sich der Datenstand in der DB ändert; oder willst du deine DB updaten, wenn du "neue" Dateiversionen {unter gleichem Namen?) in dein incoming-Verzeichnis hereinbekommst?

Zitat:
(b) finde ich prickelnder, bin mir aber nicht sicher, ob das wirklich bei 300 - 1000 datensätzen hinhaut.
Wie oft soll das laufen, mit wie vielen Dateien, je a 300 - 1000 DS?

Zitat:
ist das dateidatum verändert, wird die verknüpfung aktualisiert, was unter umständen auswirkungen auf die letztendliche verarbeitung haben kann.
Wenn es um von dir zu schreibende Dateien geht - die könntest du vielleicht auch einfach touch-en, nachdem du sie pauschal und ohne aufwendigere Kontrolle einfach neu schreibst - wenn dir eine andere Möglichkeit zur Verfügung steht, festzustellen, ob eine Änderung vorliegt.
(Wenn z.b. die Datensätze in der DB einen Timestamp haben, dann könntest du alle relevanten in die Datei schreiben, und der Datei den höchsten Timestamp per touch verpassen [wenn die verarbeitende Logik das akzeptiert].)
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #3 (permalink)  
Alt 09-07-2009, 16:06
Wurzel
 Master
Links : Onlinestatus : Wurzel ist offline
Registriert seit: Jul 2002
Ort: double-u-upper-valley
Beiträge: 7.477
Wurzel ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen
Mir ist gerade die Richtung, in der dich Veränderung interessiert, nicht ganz klar - willst du von dir weggeschriebene Dateien aktualisieren, wenn sich der Datenstand in der DB ändert; oder willst du deine DB updaten, wenn du "neue" Dateiversionen {unter gleichem Namen?) in dein incoming-Verzeichnis hereinbekommst?
ich MUSS die weggeschriebenen daten im filesystem aktualisieren. d.h. die db-daten kommen von extern, z.B. warenwirtschaft. ich baue im grunde genommen eine art schnittstelle zu einer anderen software, die mit einer db nicht umgehen kann. bestehende dateien werden bei einer aktualisierung immer überschrieben, weil eine andere software die verknüpfte datei benötigt.

Zitat:
Zitat von wahsaga Beitrag anzeigen
Wie oft soll das laufen, mit wie vielen Dateien, je a 300 - 1000 DS?
1 ds = 1 datei ... das kann häufiger laufen. der intervall (stunden, tage, monate) ist dabei unabhängig. es ist auch keine webanwendung, die permanent unter last steht.

Zitat:
Zitat von wahsaga Beitrag anzeigen
Wenn es um von dir zu schreibende Dateien geht - die könntest du vielleicht auch einfach touch-en, nachdem du sie pauschal und ohne aufwendigere Kontrolle einfach neu schreibst - wenn dir eine andere Möglichkeit zur Verfügung steht, festzustellen, ob eine Änderung vorliegt.
(Wenn z.b. die Datensätze in der DB einen Timestamp haben, dann könntest du alle relevanten in die Datei schreiben, und der Datei den höchsten Timestamp per touch verpassen [wenn die verarbeitende Logik das akzeptiert].)
so wie ich das sehe, bringt mich touch nicht weiter.

ich versuche es nochmal zu verdeutlichen:

mein datensatz (ds1) beinhaltet zu beginn "blubb", das wird weggeschrieben als "ds1.txt". beim nächsten durchlauf beinhaltet "ds1" immer noch "blubb" => es wird keine datei geschrieben, der ds wird einfach verworfen. im 3.durchlauf hat jemand gemerkt, das "blubb" falsch geschrieben ist, das muss "blabb" heissen. in dem fall muss muss die datei "ds1.txt" neu geschrieben werden. ein einfacher dateigrößenvergleich bringt mit da nicht nach vorne.

dass sich etwas geändert hat (genau das soll mir das system u.a. mitteilen), weiss ich beim durchlauf aber nicht, dass sich dieser datensatz geändert hat, sondern muss das während der laufzeit ermitteln.

ich hab jetzt mit sha1() und sha1_file() experimentiert (das spart mir den zusätzlich db-zugriff). der vergleich funktioniert und scheint mir momentan die beste lösung zu sein.

ein alternative wäre vielleicht noch, bei einer aktualisierung die datenbank zu duplizieren und gegeneinander abzugleichen und quasi nur die differenz zu bearbeiten.
__________________
Kissolino.com
Mit Zitat antworten
  #4 (permalink)  
Alt 09-07-2009, 16:24
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Wurzel Beitrag anzeigen
dass sich etwas geändert hat (genau das soll mir das system u.a. mitteilen), weiss ich beim durchlauf aber nicht, dass sich dieser datensatz geändert hat, sondern muss das während der laufzeit ermitteln.
Die Datensätze in der DB haben also keinen Timestamp?

Wäre es möglich, eine zusätzliche Spalte dafür einzufügen? Dabei könntest du dir sogar die automatische Aktualisierung von Timestamp-Spalten bei UPDATES zu nutze machen.


DS1 mit Inhalt "blubb" wurde zum Timestamp 2009-07-09 12:01:02 eingetragen.
Dein "Lauf", der Dateien erstellt, lief um 12:30:00, hat die Datei erzeugt.
Der nächste Lauf um 13:00:00 muss nichts machen, weil der Timestamp des DS älter ist als der des letzten Laufes um 12:30:00.
...
DS2 wird mit "blabb" geupdatet, sagen wir "um" 2009-07-09 16:17:43.
Dein nächster Verarbeitungslauf ist um 16:30:00, er weiss das der vorherige Lauf der um 16:00:00 war, selektiert also alle Datensätze mit Timestamp dazwischen - und schreibt für diese neue Dateien.

Ausser den Timestamp an den Datensätzen bei INSERT und UPDATE aktuell zu halten, müsstest du jeweils nur noch den TS des letzten Verarbeitungslaufs speichern - die Auswahl aller Datensätze, die neu geschrieben werden müssen, macht die DB-Query dann für dich.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #5 (permalink)  
Alt 09-07-2009, 16:34
Wurzel
 Master
Links : Onlinestatus : Wurzel ist offline
Registriert seit: Jul 2002
Ort: double-u-upper-valley
Beiträge: 7.477
Wurzel ist zur Zeit noch ein unbeschriebenes Blatt
Standard

an den mysql-timestamp hatte ich auch schon gedacht aber verworfen, da ich immer den kompletten datenbestand bei einer aktualisierung bekomme . obwohl, "replace" wäre eine option, wenn der timestamp davon unberührt bleibt. mal testen.

edith: bin schon ganz gaga. das nützt mir ja nichts, wenn datensätze gelöscht werden.
__________________
Kissolino.com

Geändert von Wurzel (09-07-2009 um 16:44 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 09-07-2009, 16:47
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Wurzel Beitrag anzeigen
an den mysql-timestamp hatte ich auch schon gedacht aber verworfen, da ich immer den kompletten datenbestand bei einer aktualisierung bekomme .
Ach so, das war mir noch nicht so klar geworden.
Zitat:
obwohl, "replace" wäre eine option, wenn der timestamp davon unberührt bleibt. mal testen.
Dazu finde ich im Manual auf Anhieb keinen Hinweis.
Aber da es zu REPLACE für den Fall eines vorhandenen Datensatzes sagt, "the old row is deleted before the new row is inserted", wird dabei sicherlich auch der TS upgedatet.
Und dass REPLACE nur auf den primary key oder einen nique index achtet, dürfte das auf Löschen und neu Eintragen in jedem Fall hinauslaufen, wenn du lediglich eine Datensatz-ID als eindeutige Kennung zur Verfügung haben solltest.


Aber man könnte sich vielleicht trotzdem eine Möglichkeit überlegen, beim Einspielen der Daten entsprechende Maßnahmen zu ergreifen.
Als "was" bekommst du den Datenbestand? CSV, fertige SQL-Statements, ...?
Selbst wenn man jeden Datensatz erst mal selektieren und vergleichen würde, kann ich mir das bei einem Umfang von bis zu 1000 Sätzen immer noch performanter vorstellen, als ständig das Dateisystem zu "belästigen". 1000 DS bedeuten dabei ja auch 1000 zu lesende einzelne Dateien, und das kostet vermutlich immer mehr, als die Datenbank zu fragen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #7 (permalink)  
Alt 09-07-2009, 22:46
Wurzel
 Master
Links : Onlinestatus : Wurzel ist offline
Registriert seit: Jul 2002
Ort: double-u-upper-valley
Beiträge: 7.477
Wurzel ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen
Aber da es zu REPLACE für den Fall eines vorhandenen Datensatzes sagt, "the old row is deleted before the new row is inserted", wird dabei sicherlich auch der TS upgedatet.
tut es.
wie edith aber schon sagte, bei gelöschten ds geht es eh in die hose.

ich bleibe jetzt erstmal bei meinem sha1-hash als "prüfsumme". in verbindung mit einer id als eindeutiger bezeichner für den dateinamen, müsste ich erstmal auf der sicheren seite sein.

ich werde parallel mal mit einem duplikat der ds testen und die beim import in der datenbank gegeneinander laufen lassen. die datenbasis ist übrigens je nach kunde immer unterschiedlich. das kann alles mögliche sein ... von plain text bis ms access.

danke dir erstmal für deine bemühungen.
__________________
Kissolino.com
Mit Zitat antworten
Antwort

Lesezeichen


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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Filesystem workaround zum testen auf windows westberlin PHP Developer Forum 1 11-12-2005 04:23
[SQL allgemein] Filesystem vs BLOB DB - Timinganalyse ringintegral SQL / Datenbanken 3 15-07-2005 21:59
Boot Problem (Filesystem) chansel0049 Linux und Unix 0 29-08-2004 14:14
Filesystem Suche darealJP BRAINSTORMING PHP/SQL/HTML/JS/CSS 1 15-06-2004 11:40
Filesystem presentweb PHP Developer Forum 6 09-05-2002 19:43

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

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:18 Uhr.