2017-01-04 3 views
0

Ich betreibe eine Webanwendung, die auf Seiten basiert, die in IIS von php-cgi.exe geladen werden.Gibt es eine effizientere Möglichkeit, ein COM-Objekt aus PHP in IIS zu instanziieren?

Ich kann eine .NET-Bibliothek ausgesetzt COM erstellen, einen TLB erzeugen und registrieren sie:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\TlbExp.exe" RomCom.dll 
c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /u RomCom.dll 
c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase RomCom.dll /tlb:RomCom.tlb 

... und die Mitglieder der Klasse von PHP thusly zugreifen:

$commie = new COM("RomCom.LettersClass"); 
print_r($commie->X); 

jedoch Wenn Sie auf diese Weise instanziiert werden, benötigt die Bibliothek, die das COM-Objekt enthält, einige Zeit, um sie innerhalb jeder PHP-Ausführung zu laden - ich kann sagen, dass diese Zeile in microtime() um etwa 0,2 Sekunden On My Machine ™ dauert. Da nachfolgende instantiations innerhalb jeder PHP Ausführung sind viel weniger kostspielig, gehe ich davon aus, dass diese Kosten entweder aufgrund der Lookup der COM-Bibliothek ist, oder auf ein paar Sachen, die passiert, wenn die Bibliothek in die Umgebung PHP geladen wird

Gibt es eine Möglichkeit, die PHP-Umgebung oder möglicherweise IIS zu konfigurieren, um das (wiederholte) Laden dieses COM-Objekts zu beschleunigen?

Bonus Frage: stelle ich die richtige Frage, oder gibt es eine bessere Möglichkeit, in .NET-Code von PHP aufzurufen? Ich habe über die NetPhp Bibliothek gelesen, aber mein Verständnis ist, dass es die COM Klasse unter der Haube verwendet und so würde die gleiche Leistung Strafe unterliegen.

+1

"COM-Objekte"? Im Jahr 2017? Ernst? – arkascha

+0

Ja, ich weiß. Zögern Sie nicht, auf die Bonusfrage zu antworten. –

Antwort

1

200ms scheint ziemlich hoch für das Laden der CLR, sollten Sie auch einige CPU-Profilierung zu bestimmen, was dauert so lange dauern. Sie können einen beträchtlichen Nutzen daraus ziehen, dass Sie Ihre Assembly zusammenstellen, oder indem Sie ein teures Objekt faul initialisieren. Du wirst es nicht wissen, wenn du nicht schaust. Sie können auch Ihre Recyclingzeit erhöhen, um die Anzahl der Ladungen zu minimieren.

Dies ist ein guter Kandidat für Serviced Components oder einen Out-of-Process-Server. In beiden Fällen wird der .NET-COM-Server in einem anderen Prozess ausgeführt, der länger dauert als der aufrufende Prozess php-cgi.

Serviced Components in VB.NET hat einen guten Überblick und kann leicht in C# übersetzt werden. Es gibt auch a sample in .Net 2 auf MSDN. In beiden Fällen können Sie die Transaktionsdaten einfach ignorieren.

Die modernere Route wäre ein lokaler WCF- oder MVC-Webservice. Unabhängig davon, ob Sie mit COM oder Web Services arbeiten, sollten Sie eine ungefähr gleichwertige Leistung erzielen. Es hängt davon ab, was Sie am besten bei der Entwicklung und Fehlerbehebung tun.

Verwandte Themen