PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP: String an C#-Programm übergeben


Expandable
2005-11-22, 18:33:20
Hallo allerseits,

ich schreibe ein Programm für Feuerwehren, zur besseren Kommunikation und übersicht während eines Einsatzes/Katastrophenfalles.

Dieses Programm - das war eine der Anforderungen - ist webbasierend, also rein in PHP geschrieben. Es ist also so organisiert, dass auf einem Server der Wache Apache + MySQL + PHP läuft, und darauf eben das Programm. Alle Clients greifen dann eben per Netzwerk auf den Server zu (und das sind einige, deswegen wollte man nicht auf jedem PC ein extra Programm installieren und updaten müssen. Die webbasierende Lösung hat das Problem umgangen...).

Nun ist es natürlich so, dass Feuerwehrleute extremst paranoide Menschen sind (und natürlich völlig zu recht) und das Netzwerk zusammenberechen könnte im Katastrophenfall. Bzw. schlimmer wird's noch, wenn der Einsatzleiter vor Ort (ÖEL) über das Internet/UMTS-Netz an den Server auf der Wache angebunden ist.

Fällt die Verbindung aus, hat der ÖEL KEINERLEI Daten mehr. Das kann natürlich nicht sein. Also ist geplant, dass im ELW (Fahrzeug des ÖEL) ebenfalls Apache + MySQL + PHP installiert wird.

Nun soll das so ablaufen: Auf dem Laptop des ÖEL ist praktisch immer eine Kopie der Datenbank des Hauptservers auf der Wache. Falls nun die Verbindung abbricht, übernimmt einfach der lokale Datenbankserver. Soweit ja kein großartiges Problem.

Problematisch ist bislang nur (zumindest wir ich mir das zur Zeit vorstelle), wie das mit dem Datenabgleich ist. Bei dem Programm gibt es viele laufende Nummern, Protokolle über Datenänderungen etc., die alle festgehalten werden müssen.

Wenn also jemand (auf der Wache oder der ÖEL) Daten einfügt, muss das nun auf zwei Servern gespeichert werden. Da haben wir schon das Problem mit PHP: Er versucht ja nun erstmal ewig, 'ne Verbindung zum Hauptserver herzustellen. Ist die Verbindung down, geht das Skript solange nicht weiter, bis PHP merkt, dass die Verbindung down ist (hoffe das ist verständlich). Also müsste man den Verbindungsstatus irgendwie extern überwachen. Auch noch möglich.

Komplett kompliziert wird's aber, wenn die Verbindung mal down war längere Zeit und dann wieder steht. Jetzt müssen ja eine Unmenge an Daten aktualisiert werden - sowohl auf dem Haupt- als auch auf dem Backupserver. Noch komplizierter wird's, wenn's mehr als zwei Server sind... es können ja auch mehrere ELWs im Einsatz sein, jeder mit seinem eigenen Backupserver. Also muss man z.B. 5 Datenbanken (Hauptserver + 4 Backupserver) nach einem Verbindungsabbruch wieder unter einen Hut bringen.

Jeder, der sich mit PHP auskennt, wird wohl erahnen, dass sowas mit PHP wohl nicht so gut zu lösen ist. Deswegen dachte ich mir, dass ein C/C++/C#-Programm den gesamten Datenabgleich übernimmt. Das einizige, was dieses Programm bräuchte, wäre Zugriff auf die lokale Datenbank sowie eine Verbindung zum Hauptserver. Ein extra Fenster würde über den aktuellen Verbindungsstatus, etc. informieren, Protokolle führen, etc.

Aus oben genannten Gründen soll das PHP-Skript jetzt nur noch Daten aus der lokalen Datenbank auslesen. Das Eintragen/Updaten von Daten im Hauptserver und die Angleichung der lokalen Datenbank an die Hauptdb soll das C#-Programm übernehmen. Falls der Benutzer also Daten einfügt, müsste PHP einen Insert/Update-MySQL-Query-String an das C#-Programm liefern. Was dann damit passiert, kann dem PHP-Programm wurscht sein, dass C#-Programm wäre dann so geschrieben, dass es die Daten auf jeden Fall in irgendeine Datenbank einträgt und nichts verloren geht.

Also noch mal kurz, zum besseren Überblick, wie ich mir das vorstelle:
PHP führt nur SELECTS aus, und zwar immer nur auf der lokalen Datenbank des ÖEL-Servers (bzw. auf dem Hauptrechner eben auf dem Hauptrechner). Das C#-Programm ist dafür verantwortlich, neue bzw. aktualisierte Daten auf SÄMTLICHEN Servern (also Hauptserver, und "Client-Server") einzutragen und die Datenbanken aktuell zu halten.

Ich hoffe das war so verständlich :)

Deswegen meine Fragen:

Wie übergibt man, bzw. kann man überhaupt, aus einem PHP-Programm einen String an ein C#-Programm übergeben? Geht das irgendwie über SOAP? Ach ja: Das ganze sollte unter Linux (Apache) und Windows (Apache/IIS) funktionieren - müsste also unter Mono (Apache unter Linux und Windows) bzw. .NET (IIS oder Apache unter Windows) laufen... ich weiß, das macht's nicht gerade einfacher :)

Erscheint euch dieses Konzept sinnvoll (wie die Daten abgeglichen werden, also was hat Priorität, etc., soll hier nicht das Problem sein... das sollen sich die von der Feuerwehr überlegen, ist mir nämlich egal... die sollen Richtlinien festlegen und dann isses so wie's is)?

Wie würden die einzelnen C#-Programme der einzelnen Master/Client-Server miteinander kommunizieren? Per (extra geschriebenem) TCP/IP-Interface? Oder auch über den "Umweg" von Apache irgendwie als HTTP-Request? (falls das möglich ist, hätte den Vorteil, dass das wohl grundsätzlich eher funktionieren wird, als was selbstgeschriebenes, denn in der Client/Serverprogrammierung kenne ich mich nicht so gut aus).

Bin für jede Hilfe (in Form von Anregungen, Kommentaren, Gedanken, und Links zu technischen Artikeln, die helfen würden) dankbar!

grakaman
2005-11-22, 19:37:27
Das ganze finde ich irgendwie recht wirr :| Also du verwendest MySql, Apache, PHP, damit du weniger warten musst, aber wegen eventuellen Ausfall läuft es dann doch auf allen Clients?! Da du ja imo auch sonst mit .NET arbeitest, mein Vorschlag: Vergiss zumindest Apache und PHP. Für den sicheren Transport würde ich die MSMQ verwenden und die Clients sind dann über ein VPN verbunden. Sollte das Netz disconnecten oder gar das NB abschmieren, sind die Daten in der MSMQ sicher und können beim nächsten connect mit dem Netzwerk wieder weiterverarbeitet werden. Auf der anderen Seite könntest du auch einfach Replikation verwenden, aber da weiß ich nicht, was da MySql kann. Und wenn das wirklich kritische Daten sind, würde ich von MySql sowieso abstand nehmen. Was die Updatefähigkeit betrifft, so ist das ja nun kein Problem das in .NET zu realisieren (es gibt auch fertige Komponenten wie den den Updater Application Block). Ich würde hier trotzdem auf keinen Fall eine Webanwendung verwenden, sondern eine Windowsanwendung. Mit Webanwendungen ist es ja auch schon unmöglich eine vernünftige Ereignisorientierte Kommunikation unter den Clients und Servern herzustellen. Da diese Anwendung aber relativ wichtig zu sein scheint, würde ich für weitere Hilfe unbedingt noch mal in folgender NG nachfragen: microsoft.public.de.german.entwickler.dotnet.csharp

Lokutus01
2005-11-22, 19:40:38
Ich würde es in diese Richtung machen:
Nur ein Datenbankserver, und dieser läuft zentral.

Die lokalen Instanzen des Webservers haben eine Klasse, welche das "Dokument" und die Logik implementieren.

Eine weitere Klasse implementiert das Handling der Datenverbindung. Falls nun Requests kommen schaut diese erst einmal, ob eine Verbindung existiert.
Falls ja, wird normal gearbeitet. Zudem gibt es eine Funktionalität "Synchronisieren", welche einen Download aller Dokumente als XML-Dokumente anbietet.
Falls keine Verbindung möglich ist, kann auf Basis dieser XMLs gearbeitet werden.
Wenn nun Updates/Inserts laufen, werden neue XMLs angelegt, gelöscht (via Flag) oder geändert.

Bei einer Neusynchronisation würden die Ändernungen gegengefahren und im zentralen Archiv verbucht (oder eben nicht).

Pflicht ist es natürlich die Dokumente zu versionisieren, wenn andere Ölies kommen.

So würde ich es machen.

Grüße, Andreas

PS Die Frage ist allerdings, ob es sinnvoll PHP für den Offline-Fall zu nutzen, aber es geht natürlich ohne Probleme

Lokutus01
2005-11-22, 19:42:40
Anmerkung zu letztem Post: Wenn C# mit PHP reden muss und Performance nicht die große Rolle spielt, dann ist Webservice die richtige Wahl, da es einfach zu implementieren ist.

Was ich i.ü. nicht empfehle, ist Datenbanken gegenseitig zu synchronisieren, bzw. dies selbst zu implementieren (geht natürlich): Selbst große IT-Firmen machen da Fehler.

Marscel
2005-11-22, 20:09:34
Ich find es doch recht groß, so ein Projekt auf einen Programmierer?

Auf jedem mobilen Gerät ein eine PHP Runtime, eine Datenbank und einen Webserver zu installieren und jeden Client mit einer Datenbank arbeiten zu lassen, deren Änderungen im offline-Fall nicht sofort zum zentralen Webserver und allen Clienten und andersherum übertragen werden können, halte ich definitiv für ineffizient/fehleranfällig.

Eine Server-Client-Anwendung, die nicht in Form eines PHP Scripts, sondern eines Programms basiert, ist da wesentlich besser.

Jeder Client sendet einen Eintrag an den Server, versehen mit einem Timestamp. Der Server speichert diesen in einer DB und sendet an jeden Clienten den neuen Eintrag, der dort in Form eines Logs gespeichert und jederzeit abrufbar ist. Wenn die Verbindung nicht zustande kommt und etwas abgeschickt werden soll, wird der Eintrag solange zwischengelagert, bis die Verbindung wieder steht, worauf der Server hin den Eintrag mit der Markierung "verspätet" wieder an alle Clienten sendet. Geht einem Clienten der Log oder die small-DB verloren, lässt sich jederzeit vom Server der DB Inhalt wieder abrufen.

Ich stelle mir das gerade wie einen etwas erweiterten IRC Server vor (wenn ich deine Absicht richtig verstanden habe).

Das wäre meine Schemata im ersten Gedanken.

Ich habs mal kurz skizziert: http://www.pcreact.de/feuerwehr.png

Expandable
2005-11-22, 22:24:25
Danke für eure Anregungen.

Ich merke schon, Brainstorming mit anderen Leuten, die was davon verstehen, tut mir gut ;)

Nur noch mal zum besseren Verständnis der Situation: Bei einem Katastrophenfall gibt es praktisch zwei getrennte "Führungsstäbe": Einmal auf der Wache, die FüGK, also die Amtsleiter etc., die die Entscheidungen fällen (z.B. soll evakuiert werden? Muss die Bevölkerung gewarnt werden, etc.), die Öffentlichkeitsarbeit machen, sich mit anderen Organisationen wie Rotes Kreuz, Bundeswehr, Polizei, Presse, etc. koordinieren. Die hängen alle direkt im Netz und können so problemlos auf den Hauptserver zugreifen. Dass das interne Netz ausfällt ist unwahrscheinlich, wäre aber auch kein allzu großes Problem, da immer Ausdrucke vorliegen.

Der Knackpunkt ist jetzt die ÖEL: Hier ist entweder ein einzelner Schlepptop, oder ein Netzwerk von Schlepptops, die ebenfalls mit dem Programm arbeiten: Vorteil: Die FüGK weiß sofort, was beim örtlichen Einsatzleiter (der also entscheidet, was wie und womit gelöscht wird, etc.) vor sich geht und kann daraufhin fundierte Entscheidungen treffen. Ohne das Programm muss man das per Funk/Fax/Telefon machen, und das funktioniert nicht immer wirklich gut.

Nun ist die ÖEL ja per UMTS meist an das Netz der Feuerwehr angebunden (das UMTS-Netz ist in Augsburg sehr gut ausgebaut bereits). Fällt das UMTS-Netz aus (was ja durchaus sein kann bei größeren Katastrophen), sitzt der ÖEL also ohne Informationen dar, was besonders schlimm ist, weil er ja auf die Kräfte-Übersicht, also welche Einheit wo mit wieviel Mann ist, angewiesen ist.

Deswegen sollte also auf einem Laptop der ÖEL (falls es mehrere sind) noch mal das Programm (Apache, PHP, MySQL, etc.) drauf. Also nicht auf JEDEM Client-PC, sondern nur noch zusätzlich auf einem (oder mehreren, falls man zusätzliche Sicherheit will bzw. bei größeren Feuerwehren oder warum ach immer).

Dumm, dass ich das im Eingangspost nicht gemacht habe, aber eine Demo-Version des Programms könnt ihr euch unter demo.control-online.net ansehen. Ach ja: Benötigt IE6 oder FireFox 1.0 bzw. 1.5 mit aktivierten Cookies und JavaScript. Falls ihr das blöd findet, mir egal, ohne JavaScript wäre das viel zu unpraktikabel. Und deutsche Behörden haben den IE eh meist mit Standardkonfiguration drauf. Also kein Problem.

Wie ihr da auch seht: Das Programm ist schon extrem umfangreich und aufwendig, wobei diese Version sogar schon etwas älter ist und die aktuelle Version noch wesentlich mehr kann. Ein komplettes Neuschreiben kommt daher nicht in Frage, auch, wenn mir das lieber wäre, so ein Programm in einer "richtigen" Programmiersprache zu schreiben.

Das Programm funktioniert soweit wirklich gut und erfüllt genau seine Anforderungen. Das einzige Problem ist nun, möglichst OHNE großen Aufwand diese Sicherheitssache mit Backup-Servern etc. zu implementieren.

grakaman
2005-11-23, 09:26:39
Wie ihr da auch seht: Das Programm ist schon extrem umfangreich und aufwendig, wobei diese Version sogar schon etwas älter ist und die aktuelle Version noch wesentlich mehr kann. Ein komplettes Neuschreiben kommt daher nicht in Frage, auch, wenn mir das lieber wäre, so ein Programm in einer "richtigen" Programmiersprache zu schreiben.


Wenn es also nur noch um die Synchronisation der Datenbestände geht, würde ich echt schauen, was dein DBMS an Replikationsmöglichkeiten bietet. Ggf. zu einem neuen DBMS wechseln, die MSDE gibt es z.B. kostenlos, auch für den produktiven Einsatz.