Mysql Datenbankabfrage sekuendlich und Ausgabe in Textdatei speichern

son gohan

Erfahrenes Mitglied
Hallo,

ich wollte euch fragen wie aufwendig das waere und mit welcher Technik koennte man das machen, das jede Sekunde eine Abfrage an eine Mysql Datenbank gemacht wird, welche auf einem Webserver liegt und die Rueckgabe der Abfrage dann immer in eine Textdatei speichern. Die Textdatei auch in ein beliebigen Pfad abspeichern lassen.

Also die Idee ist bestimmt einfach, Mysql Datenbank abfragen und Rueckgabe in Textdatei speichern. Und das halt jede Sekunde.
 
Hi

Ein PHP-Programm unabhängig von Apache dauerhaft laufen lassen,
dass eben die Abfrage und Dateibeschreibung macht und danach immer 1sec sleept.

Eventuell ist eine PHP-Installation am Server, die nur als Apachemodul ausgelegt ist,
dann gehts nicht (bzw. der Zustand muss geändert werden)
Damit das Ganze etwas stabiler wird wäre es gut, wenn beim Serverneustart
das Programm gleich mitgestartet wird (wenn man Zugriff auf das Zeug hat)

Aber das Vorhaben klingt irgendwie verdächtig nach "Wird Probleme machen".
Was soll mit der Textdatei dann noch so passieren?

edit: Merk grad, dass nirgends von PHP die Rede ist.
Ist PHP am Server gemeint oder irgendwas Anderes?
 
Hi,

die Daten sind in einer Mysql Datenbank und PHP ist auch vorhanden.

Im Moment benutze ich Windows Wininet functionen die ich in ein Programm importiere. Das Programm laeuft lokal auf meinem PC und bietet die Moeglichkeit kleine Hilfsscript zu bauen.

So ein Script habe ich mir gebaut und dort habe ich die Wininet Funktionen importiert. Mit den Funktionen von Wininet rufe ich eine PHP Seite auf, die PHP Seite ruft die Datenbank auf und gibt die Daten aus und meine Funktionen speichern dann die Ausgabe der PHP Seite in eine String und diesen String mit den Daten lese ich wieder ein mein Hilfprogramm ein.

Aber irgendwie stuertzt mein Hilfprogramm zu oft ab, ich denke das liegt an Ueberlastung.

Deswegen will ich jetzt eine Loesung finden wie ich diese Datenbankabfragen anders mache, aber die Rueckgabe der Datanbankabfragen kann ich in eine Textdatei speichern welche mein Hilfsprogramm wieder benutzen kann.

So koennte ich das Hilfsprogramm gut auslasten und es stuerzt nicht mehr ab denke ich. Weil ja der schweirigste Teil das staendige abfragen nach neuen Daten in der Datenbank dann extern gemacht wird, wie findest du die Idee?
 
Ich glaube die Ueberbelastung entsteht eher beim Hilfsprogramm, weil ich in dieses die Wininet Funktionen importiere und dann jede Sekunde eine Internet Abfrage damit mache.

Man muss sich das so vorstellen, beispielweise du hast Exel das ist das Programm und du baust fuer Exel ein Script ein Hilfsprogramm das fuer dich irgendeine Aufgabe erleichtern soll.

Und fuer dieses Hilfsprogramm benutzt du jetzt auch Zusatzfunktionen von Wininet und dann stuerzt Exel manchmal ab.

So aehnlich ist das bei mir und ich vemute das es am ehesten daran liegt weil ich einfach DLL Funktion imprtiere.

Ich denke wenn ich ein anderes zusaetzliches Programm schreibe das die Daten aus der Datenbank holft und dann als Textdatei in ein Order abspeichert, dann kann ich mit dem Programm diese Textdatei einfach auslesen und habe auch meine benotigten Daten und ich verschone so das Programm etwas, weil es nicht mehr selbst diese Abfargen zur Datenbank ueber das Internet machen muss.

Ich habe mal hier ein Beispiel von meiner gebauten HTTP GET Funktion, diese Funktio ist aus verschiedenen Winiet Funktionen konstruiert:

PHP:
bool HttpGET(string strUrl, string& strWebPage)
{
  int hSession = InternetOpenA(AGENT, INTERNET_OPEN_TYPE_DIRECT, "0", "0", 0);

  int hReq = InternetOpenUrlA(hSession, strUrl, "0", 0,
        INTERNET_FLAG_NO_CACHE_WRITE |
        INTERNET_FLAG_PRAGMA_NOCACHE |
        INTERNET_FLAG_RELOAD, 0);

  if (hReq == 0) {
    return(false);
  }

  int     lReturn[]  = {1};
  string  sBuffer    = "";

  while (TRUE) {
    if (InternetReadFile(hReq, sBuffer, BUFSIZ, lReturn) <= 0 || lReturn[0] == 0) {
      break;
    }
    strWebPage = StringConcatenate(strWebPage, StringSubstr(sBuffer, 0, lReturn[0]));
  }

  InternetCloseHandle(hReq);
  InternetCloseHandle(hSession);

  return (true);
}

hier ist noch ein import Befehl mit dem ich die benotigten Funktionen aus Wininet in mein Programm importiere:

PHP:
#import "wininet.dll"

#define INTERNET_OPEN_TYPE_DIRECT       0
#define INTERNET_OPEN_TYPE_PRECONFIG    1
#define INTERNET_OPEN_TYPE_PROXY        3

// Had to cut the following two defines because of silly MQL4 identifier limits

#define _IGNORE_REDIRECT_TO_HTTP        0x00008000
#define _IGNORE_REDIRECT_TO_HTTPS       0x00004000

#define INTERNET_FLAG_KEEP_CONNECTION   0x00400000
#define INTERNET_FLAG_NO_AUTO_REDIRECT  0x00200000
#define INTERNET_FLAG_NO_COOKIES        0x00080000
#define INTERNET_FLAG_RELOAD            0x80000000
#define INTERNET_FLAG_NO_CACHE_WRITE    0x04000000
#define INTERNET_FLAG_DONT_CACHE        0x04000000
#define INTERNET_FLAG_PRAGMA_NOCACHE    0x00000100
#define INTERNET_FLAG_NO_UI             0x00000200

#define HTTP_ADDREQ_FLAG_ADD            0x20000000
#define HTTP_ADDREQ_FLAG_REPLACE        0x80000000

#define INTERNET_SERVICE_HTTP           3
#define INTERNET_DEFAULT_HTTP_PORT      80

#define ICU_ESCAPE                      0x80000000
#define ICU_USERNAME                    0x40000000
#define ICU_NO_ENCODE                   0x20000000
#define ICU_DECODE                      0x10000000
#define ICU_NO_META                     0x08000000
#define ICU_ENCODE_PERCENT              0x00001000
#define ICU_ENCODE_SPACES_ONLY          0x04000000
#define ICU_BROWSER_MODE                0x02000000

#define AGENT                           "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461)"
#define BUFSIZ                          128

#define REQUEST_FILE                    "_req.txt"

////////////// PROTOTYPES

bool InternetCanonicalizeUrlA(string lpszUrl, string lpszBuffer, int& lpdwBufferLength[], int dwFlags);

int InternetOpenA(string sAgent, int lAccessType, string sProxyName="", string sProxyBypass="", int lFlags=0);

int InternetOpenUrlA(int hInternetSession, string sUrl, string sHeaders="", int lHeadersLength=0, int lFlags=0,
   int lContext=0);

int InternetReadFile(int hFile, string sBuffer, int lNumBytesToRead, int& lNumberOfBytesRead[]);

int InternetCloseHandle(int hInet);

int InternetConnectA(int handle, string host, int port, string user, string pass, int service, int flags, int context);

bool HttpSendRequestA(int handle, string headers, int headersLen, int& optional[], int optionalLen);

bool HttpAddRequestHeadersA(int handle, string headers, int headersLen, int modifiers);

int HttpOpenRequestA(int hConnect, string lpszVerb, string lpszObjectName, string lpszVersion,
 string lpszReferer, string& lplpszAcceptTypes[], int dwFlags, int dwContext);

#import


Ich denke wenn ich das alles auslagere und die Abfrage ins Internet mit einem externen Programm mache das alles in eine Textdatei speichert, dann kann ich diese Textdatei zum auslesen anbieten und entlaste somit das ganze.
 
Ich glaube die Ueberbelastung entsteht eher beim Hilfsprogramm, weil ich in dieses die Wininet Funktionen importiere und dann jede Sekunde eine Internet Abfrage damit mache.
Das mein ich ja; du hast nur ziemlich sicher Fehler im Hilfsprogramm.
Komplett egal ob da was überlastet oder nicht, da sollte nichts abstürzen.

Ich denke wenn ich ein anderes zusaetzliches Programm schreibe das die Daten aus der Datenbank holft und dann als Textdatei in ein Order abspeichert, dann kann ich mit dem Programm diese Textdatei einfach auslesen und habe auch meine benotigten Daten und ich verschone so das Programm etwas, weil es nicht mehr selbst diese Abfargen zur Datenbank ueber das Internet machen muss.
Im Gegenteil machst du dir damit nur noch mehr Probleme.
Mehrfacher, eventuell gleichzeitiger Zugriff auf eine Datei ist immer ein Problem.
Angefangen mit dem Öffnen, weiter über den Umstand
dass du eventuell unvollständige Zeilen rausliest
(ohne zu erkennen dass da was fehlt),
weil die Zeile einfach noch nicht fertig geschrieben ist
usw.

Zum Code:
Warum zeigst du irgendein Beispiel statt deinem Programm?
Und das Beispiel schaut schon seltsam aus.
der ganze untere Codeblock zB.. Für sowas gibt es Header.
Womit kompilierst du das?

Den oberen Code hab ich mir noch nicht detailliert angeschaut,
aber rein nach Gefühl fehlt da was an Fehlerbehandlung.
 
Das Codebeispiel das ich gezeigt habe ist original aus meinem Programm, dort kann man sehen wie die HTTP GET Funktion aufgebaut ist.

Im Programm selber benutze ich dann diese HTTP GET Funktion indem ich sie halt einmal pro Sekunde aufrufen lasse, das heist einmal pro Sekunde wird das alles bearbeitet was in der Funktion steht.

Ich habe auch einige Test gemacht wie schnell mein Programm laeuft mit und ohne HTTP GET Aufruf, sobald die HTTP GET Funktion aufgerufen wird wird das Programm richtig langsam, das bedeutet fuer mich das diese Funktion am meisten Resourcen verbraucht und ein auslagern das gelegentlich abstuerzen bestimmt gut verhindern kann.

Das Programm reagiert halt von natuer aus wirklich sensibel wenn man dll dateien importiert, wie gut jetzt der import und Aufbau meiner HTTP GET FUnktion ist, kann ich vielleicht nicht so gut einschaetzen, dazu fehlt mir etwas C++ Erfahrung, aber wuerde denn nicht mein Programm immer falsch funktionieren und abstuerzen wenn ein Fehler im Aufbau drine ist? Weil im Moment ist es so das es immer eine Zeit lang laeuft, aber dann irgendwann abstuertzt und ich vermute deswegen kein Programmierfehler sonder ueberbelastung.

Die Hersteller vom Programm haben mir auch gesagt das selbst programmierte Hilfsprogramme so ein "Timeout" Fehler verursachen koennen bei Ueberbelastung, wenn das vorkommt muss man immer das Programm komplett ausschalten und neu starten.
 
Ich hab keine Ahnung, was genau daneben geht, aber das kann man rausfinden.
bzw. du kannst es rausfinden.
Ich bleib dabei, dass Abstürze vermeidbar sind.
Auch wenn irgendwas überlastet sollte das Programm in der Lage sein,
irgendwie darauf zu reagieren (anders als abstürzen).
Solang der Programmierer das eben programmiert hat...

Auch die Langsamkeit ist vermeidbar, Stichwort Threads.

Warum ist es überhaupt nötig, jede (!) Sekunde irgendein HTTP-Etwas zu übertragen?
Wenn irgendwie vermeidbar, weg damit
(das ist ein versteckter Hinweis auf "Erklär doch mal, was das ist")

Haben die Hersteller auch genauere Angaben zum Timeout (wann genau, wie lang...)?
Bzw. warum sagst du uns nicht einmal den Namen von diesem Finanzprogramm,
ist doch nicht geheim, oder? Damit finden wir (Forenuser) viellicht mehr Infos zum Technischen.

Eins noch: Wenn das Finanzprogramm "sensibel" ist (leicht abstürzt?)
und bei Pluginfehlern, an denen das Plugin nicht schuld ist, wegstirbt,
dann ist das auch schlecht programmiert.
(dass das Programm hängt, wenn ein Plugin hängt, ist noch verständlich.
Aber dass das Programm noch immer hängt, wenn das Plugin wieder geht...)
 
ich habe hier ein video gemacht bei dem man sehen kann wie das benutzen der HTTP GET Funktion das Finanzprogramm sehr langsam macht und wie schnell es laeuft, wenn ich die HTTP GET Funktion raus nehme: http://www.youtube.com/watch?v=XYh9pAjNRlw

Man kann im Video eindeutig sehen das es direkt viel schneller laeuft wenn man die HTTP GET Funktion ausklammert.

Vom Gefuehl her glaube ich das die Leute dieses Finanzprogramm einfach von natur aus wohlmoeglich mit Absicht sehr senisbel gegen DLL Funktionen import gebaut haben. Weil ich auch schon seit einigen jahren fuer dieses Finanzprogramm Scripte baue und da waren auch schon viel aufwendigere Sachen dabei die nicht so zum Absturz und verlangsamen fuehren, aber diese Scripte habe ich immer nur mit den funktionen gebaut die das finanzprogramm selbst anbietet, es hat halt eine eigene programmiersprache im angebot, die von der syntax her ein wenig wie C++ aussieht.

Also als Absturz ist hier eigentlich nur eine Blockade vom Finanzprogramm gemeint, es blockiert das Script einfach und gibt als Fehlermeldung Timeout und man muss das Finanzprogramm dann neu starten, dann laeuft es wieder und nach einiger Zeit kommt wieder so eine Meldung.

Strategisch gesehen ist sowas aergerlich, wenn du beispielweise nicht zu hause bist und gar nichts davon mitbekommen hast das dein Script ausgeknockt wurde und die Kurse im Finanzmarkt bewegn sich ohne dich, weil dein Handelsscript ja ausgenockt wurde und du nichts davon mitbekommen hast.

Eine richtig gute Loesung wurde bisher noch nirgendwo in Foren gezeigt fuer dieses Timeout Problem. Nur Leute die sich halt selbst gut auskennen mit Programmieren koennen da wohl Loesungen finden.

Ich habe deswegen gedacht wenn ich jetzt einfach die Daten in eine Textdatei speicher und mit den Textlese Funktionen die vom Finanzprogramm angeboten werden die Daten einlese, dann wird es bestimmt nicht irgendwie blockieren, weil dieses blockieren kommt echt fast nur bei benutzen von DLL Funktionen zu stande, aber beim Benutzen der eigenen programmiersprache vom Finanzprogramm kommt es im prinzip nie zu Timeouts.
 
Vom Gefuehl her glaube ich das die Leute dieses Finanzprogramm einfach von natur aus wohlmoeglich mit Absicht sehr senisbel gegen DLL Funktionen import gebaut haben.
Und warum haben sie dann überhaupt die Möglichkeit gegeben,
DLLs reinzuladen? Wenn sie das nicht wollen wäre es von Anfang an nicht möglich.

Dazu, dass die programmeigene Scriptsprache immer funktioniert, nur deine DLL nicht:
Wieder mal: Programmierfehler.

Ich habe deswegen gedacht wenn ich jetzt einfach die Daten in eine Textdatei speicher...
...wird es garantiert nicht einfacher.
Eine Datei zu lesen, die laufend beschrieben wird,
und auch verlässlich die neu dazugekommenen Daten (Zeilen etc.)
richtig und vollständig rauslesen wollen ist bestenfalls tricky.
Eine Datei ist keine Datenbank
(bei der viel Arbeit drinsteckt, genau mit solchen konkurrierenden Sachen gut umzugehen)

Eine richtig gute Loesung wurde bisher noch nirgendwo in Foren gezeigt
Ja wie denn auch?
Man hat keinen kompletten Plugincode, keinen Programmnamen für techn. Infos,
keine Infos die man aus Debugging gewinnt, keine Infos was da überhaupt übertragen wird
und was auf der Gegenseite für ein Ding ist, ggf. keine Snifferdaten,
keine Angabe zum Compiler, kein ...usw.
Nur einen seltsamen Programmausschnitt,
der laut eigenen Aussagen von irgendwo her zusammenkopiert wurde.
=1%
=Nichts.

Aber ich wiederhole mich...
 
Zurück