DotNet in PHP

JeyB

Mitglied
Hallo zusammen,

ich besitze eine dll, welche ich mit C# programmiert habe.Zudem habe ich in Visual Studio die Eigenschaft "Com visible" aktiviert. Nun möchte ich Funktionen von dieser dll aus einem PHP Skript heraus aufrufen. Dazu hatte ich ein bisschen gegoogelt und bin auf die PHP Klasse "DOTNET" gestoßen, mit der ich .Net assemblies laden kann, indem ich beim instanziieren der Klasse DOTNET dem Konstruktor den vollständigen Namen des assembly, welches sich im globalen assembly cache befinden muss, angeben. Als zweiten Parameter erwartet der Konstruktor den vollständigen Klassennamen der dll, die instanziiert werden soll. Das ganze funktioniert auch wunderbar. Das einzige Problem was ich jetzt noch habe ist, dass ich die Klasse nur beim ersten Aufruf erfolgreich instanziieren kann. Mache ich nun einen "Refresh" der Seite, dann crasht der Apache Server und startet sich neu. Anschließend geht es wieder und beim zweiten mal nicht. Ich vermute, dass die geladene Speicherressource (DLL) nicht korrekt freigegeben wird. Das selbe Problem wurde auch schon hier diskutiert. Eine Lösungsmöglichkeit wäre laut dem Beitrag, das apache modul zu deaktivieren und dafür php-cgi zu verwenden. Leider konnte ich dazu noch keine passende Anleitung bzgl. Windows finden. Kann mir jemand zu diesem Problem helfen? Wäre für jede Antwort dankbar.

PHP:
<?php
	try
	{
		$lDotNet = new DOTNET("System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null", "System.Windows.Forms.Form") or die("not created");
		die("created");
	}
	catch(Exception $lEx)
	{
		echo "Error occured:<br>".$lEx->GetMessage();
	}

?>

Gruß, JeyB
 
Zuletzt bearbeitet:
Prinzipiell wird PHP als CGI genauso wie auf Linux/Unix konfiguriert. Als Binary müsstest du dann die php.exe verwenden. Eine Beschreibung wie das geht siehst du hier: http://www.php-faq.de/q-install-apache-cgi.html

Grundsätzlich ist aber davon abzuraten, sowas als Workarround zu verwenden. Du weißt nicht, was das als Nebeneffekt produziert. Das anscheinend fehlerhafte Releasen der DLL-Resourcen wird dadurch meiner Meinung nach nur umgangen und nicht beseitigt.
 
Danke für die schnelle Antwort.
Diese Konfiguration hatte ich auch schon in der httpd.conf vorgenommen. Als ich danach den Apache Server über xampp gestartet hatte, erschien immer noch der gleiche Fehler. Hat vielleicht sonst noch jemand das gleiche Problem gehabt und konnte es irgendwie lösen? Wäre für jede weitere Antwort dankbar.
 
Ich weiß nicht, die die Konfiguration deiner Installation aufgebaut ist. Im conf-Verzeichnis einfach mal nach Dateien mit Inhalt LoadModule suchen. Die Konfiguration müsste ungefähr so lauten:

Code:
LoadModule php5_module "modules/php5apache2_2.dll"

AddType application/x-httpd-php .php

Die beiden Zeilen müssen nicht zwangsläufig zusammen da stehen. Kommentiere am besten beide aus (# davor schreiben) und starte den Apache-Dienst neu. Dann sollte deine CGI-Konfiguration auch zum tragen kommen.
 
Das php5 Modul wird bei mir in der httpd-xampp.conf Datei geladen.

Habe jetzt folgendes in der httpd-xampp.conf eingestellt:

Code:
ScriptAlias /php/ "D:/xampp/php/"
Action application/x-httpd-php "/php/php-cgi.exe"
#LoadModule php5_module "D:/xampp/apache/bin/php5apache2.dll"
#AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml .phpt

Nachdem ich den Apache Server über den xampp control panel gestartet habe, erscheint der php-cgi Prozess allerdings nicht in der Prozessliste. Sollte der dort nicht zu sehen sein?
 
Nein. Beim CGI wird php.exe mit dem Script ausgeführt und anschließend das Binary wieder aus dem Speicher gelöscht. Daher ist CGI auch etwas langsamer als wenn PHP als Modul läuft.

Gehen deine PHP-Scripts noch?
 
Hallo Saftmeister,

vielen Dank für deine Hilfe, es funktioniert jetzt. Habe Anhand dieser Anleitung http://www.dmxzone.com/go?6471 die httpd.conf angepasst und anschließend so wie du sagtest die Zeile

Code:
#LoadModule php5_module modules/php5apache2_2.dll

mit # auskommentiert. Diese Zeile befand sich allerdings nicht in der httpd.conf sondern in der Datei httpd-xampp.conf, welche sich unter dem Verzeichnis extra befand. Jetzt stürzt der Apache Server nicht mehr ab und das .Net Objekt wird immer sauber neu instanziiert.

Gruß, JeyB
 
Gerne. Allerdings habe ich da mal etwas nach gegraben: Das Problem existiert schon seit einiger Zeit (http://bugs.php.net/bug.php?id=41577).

Es ist offensichtlich ein SEGFAULT (Access Violation), wenn man PHP als Modul laufen lässt. Das würde ich auf keinen Fall produktiv verwenden, zum rum spielen ok...
 
Zurück