2013-04-11 7 views
17

Wie der Titel schon sagt, habe ich ein Matlab-Code für isoliert gesprochenen Worte Anerkennung und ich möchte in der Lage sein, dieses Projekt mit einem anderen mit für einen bestimmten Zweck PHP machte einen zu integrieren. Ich habe nicht früher mit einem solchen Problem beschäftigt, mit anderen Worten, es ist das erste Mal für mich, wenn ich PHP und Matlab integrieren muss, so dass ich wirklich nicht weiß, wo ich anfangen soll und wie. Ich habe ein paar Artikel gelesen, aber ich konnte es nicht gültig machen.laufen Matlab-Code von PHP

Ich habe PHP 5.4.9, Matlab r2012a und Windows 7 OS. die Matlab Projektdateien können auf github

gesehen werden Jede Hilfe würde sehr geschätzt werden.

+0

Wenn Sie MATLAB nicht auf dem Server installieren möchten, können Sie SaturnAPI verwenden, das eine REST-Schnittstelle für HTTP-Aufrufe und Datenübertragungen bereitstellt. https://saturnapi.com – FullStack

Antwort

19

Sie haben ein paar Möglichkeiten:

  • ist MATLAB auf dem Server installiert, auf dem die PHP-Anwendung bereitgestellt werden würde (nicht Ihre Umgebung aktuellen Entwicklung)? Wenn ja, können Sie es direkt wie jedes andere Programm (maltab -r "...") mit dem Befehl in PHP aufrufen. Hier sind einige Ressourcen (stellen Sie sicher, auch als auch die verknüpften Fragen Kasse):

    Andere haben kommentiert, wie Eingang passieren/Ausgabe zwischen PHP und dein MATLAB-Skript. Zum Beispiel könnten Sie Ihre Design MATLAB-Funktion den Pfad der WAV-Datei als Eingabe, Verarbeitung erhalten sie und speichern Sie alle resultierende Bild auf der Festplatte:

    function myFunc(filename) 
        [y,Fs] = audioread(filename); 
        img = my_process_func(y,FS); 
        imwrite(img, 'out.png'); 
    end 
    

    die sich von PHP als aufgerufen wird:

    % of course you have to make sure "myFunc" is available on the MATLAB path. 
    % think: "addpath(..)" or just "cd(..)" into the directory first 
    matlab -wait -nodisplay -r "myFunc('audio.wav'); quit;" 
    

    Sie könnte dann das Ausgabebild in der PHP-App lesen.

  • Falls nicht, welche einsatzbezogenen Toolboxen stehen Ihnen zur Verfügung? MATLAB Compiler und verwandte Toolboxen wie MATLAB Builder NE und MATLAB Builder JA.

    Diese kompilieren Ihr Programm in eine ausführbare/.NET Assembly/JAR-Datei, und alle von ihnen erfordern die frei verfügbare MCR Runtime installiert werden. Mit anderen Worten, die ausführbaren Dateien müssen keine vollständige MATLAB-Installation auf dem Zielrechner haben, sondern nur die MCR-Laufzeit.

    Sie würden die ausführbare Datei auf die gleiche Weise wie zuvor ausführen.

    Ein anderes Produkt ist die MATLAB Coder, die Ihren MATLAB-Code in C++ - Programm konvertiert. Wenn es kompiliert wird, kann es ohne externe Anforderung ausgeführt werden.

    Ein neues Produkt von Mathworks ist MATLAB Production Server. Persönlich weiß ich nichts darüber :)

  • Noch eine andere Option ist die Verwendung von TCP/IP für die Kommunikation zwischen PHP und MATLAB. Ein Server würde auf der MATLAB-Seite laufen, wobei die Socket-Programmierung als C MEX-Datei oder eine Java-Klasse geschrieben würde. Siehe:

    Der Kunde ist Ihre PHP-Anwendung. Die Idee dahinter ist, dass MATLAB auf Verbindungen lauscht, was auch immer von einem Client eingegeben wird, eval, und das Ergebnis zurückgibt. Dies ist komplizierter als die anderen Optionen, da Sie mit Serialisierung und anderen Dingen wie Parallelität umgehen müssen. Der Vorteil ist, dass MATLAB auf einem separaten Server ausgeführt werden kann, sogar auf mehreren Servern in der Cloud (siehe this post).

Also zuerst entscheiden, was am besten Ihr Projekt nähern, dann wäre es einfacher, bestimmte Fragen zu beantworten .. Einfach immer die Dokumentation konsultieren, werden MATLAB-Toolbox sehr gut dokumentiert und sind in der Regel viele Beispiele. Hier sind ein paar mehr Ressourcen spezifisch für MATLAB Compiler Produkte Familie:

Beachten Sie, dass sie auf ASP.NET und Java JSP/Servlet-Anwendungen konzentrieren. In Ihrem Fall würde die PHP-Anwendung mit einer mittleren Schicht kommunizieren, die einen Webdienst unter Verwendung einer der beiden oben genannten Optionen ausführt (oder einfach eine CGI-ähnliche Seite entwerfen, auf der einfache ausführbare Dateien laufen, die mit dem MATLAB-Compiler erstellt wurden)

HTH

+0

+1 für solch eine großartige Beschreibung. Was ich versuchte, ist Matlab-Builder JA zu verwenden. so kompilieren als eine jar-Datei war meine erste Option, mit zu beginnen. Aber wie üblich habe ich keine volle Kontrolle über den Deployment Server. aw, mit Java mit PHP sollte kein Problem sein. Ich muss nur einige Sicherheitsprobleme berücksichtigen. Vielen Dank für Ihre Antwort. Ich werde es akzeptieren. aber bitte, wenn Sie irgendwelche andere Informationen haben, die Sie vielleicht mit mir über Matlab-> JAR-> PHP teilen möchten (** Spracheingabe - Zeichenkette und Bildausgabe **) Ich werde es sehr schätzen. Danke. –

+0

@mamdouhalramadan: Es gibt derzeit [eine andere offene Frage] (http://stackoverflow.com/q/15967157/97160) über PHP/MATLAB-Integration, die für Sie von Interesse sein könnte. Speziell Sam Roberts hat einige gute Ratschläge, wie man den MCR-Startup-Overhead reduzieren kann. – Amro

3

Ein schneller Hack wäre, Ihren Matlab-Code in eine executable file zu kompilieren, dann PHP shell_exec() verwenden.

Der schwierige Teil wäre Ihren Matlab-Code wird die Anpassung (sorry, ich habe es nicht gelesen) in der Weise, dass:

  1. Es wird seine Eingabe in Kommandozeilen-Schnittstelle Stil erhalten (wie char Zeichenfolgen);
  2. Es wird seine Ergebnisse als Text zur Standardausgabe (Datei ID # 1 in Matlab) ausgeben.

Dann alles was man braucht ist die Matlab Ausgabe zurück in PHP zu analysieren ...

+0

Vielen Dank für Ihre Antwort, das Problem ist, dass die Eingabe ist ein '. Wav 'Format und die Ausgabe ist ein Bild und String ... wäre das gültig? –

+0

Wenn ich die ausführbare Matlab-Methode ausprobieren würde, würde ich den Pfad + filename.wav als Argument an die Matlab-Programmdatei übergeben, und das Programm würde 2 Zeichenfolgen ausgeben (zum Beispiel durch eine neue Zeile getrennt): Eines wäre die Zeichenfolge Sie brauchen, und der andere wäre der Pfad + Dateiname.png. –

+1

Noch eine Sache --- hier ist ein weiterer Stackoverflow-Eintrag, der sich mit der Übergabe von Argumenten an Matlab-Executables beschäftigt: http://stackoverflow.com/questions/3335505/how-can-i-pass-command-line-arguments-to-a-standalone -matlab-executable-running –

4

OP Um mit System-Befehle ausführen, von einer PHP-Webseite, ist my post here relevant (siehe unten kopiert).

Wir machen genau das die ganze Zeit. Ich nenne sie Voodoo-Seiten. Hier einige Arbeitscode:

<?php 
$command="uptime"; $output; $retval; $errors=""; 
exec ($command , &$output, &$retval ); 
echo $output[0]."\n"; 
unset($output); 
?> 

Und die Ausgabe auf der Webseite bedient:

13:40:19 up 22 days, 23:14, 0 users, load average: 0.04, 0.02, 0.00 

Und die zusätzliche Anmerkung ich in den Kommentaren unten hinzugefügt: Relative vs absolute Pfade kann ein Schmerz sein ... $command muss möglicherweise /usr/bin/uptime oder eine andere /usr/bin/ls /home/chris/ftp sein. Normalerweise befindet sich das Arbeitsverzeichnis der Skripts in dem Dateisystem, in dem sie sich befinden. MATLAB ist ein Windows-Programm, ja? Meine Erfahrung ist, dass Sie absolute Pfade für das Programm benötigen und alle Dateien, die als Argumente übergeben werden, Beispiel: $command="c:\\matlab\\matlab.exe c:\\www\\somefile.wav" Und dann einfache Anführungszeichen für alberne NTFS-Namen, TAB-Befehlszeilenabschluss funktioniert gut für Beispiele. Oder benutze den richtigen 8.3 Namen mit dem ~ darin.

+0

Danke, aber immer noch meine Frage ist auf Kopfgeld gesetzt, weil ich eine ausführlichere Antwort brauche. Schätze wirklich deine Hilfe. aber wenn du dir den Matlab-Code ansehen kannst, wirst du sehen, dass es auf diese Weise nicht möglich ist, –

+0

Matlab, ich weiß es nicht. Wenn Sie erreichen können, was Sie über Terminal-Befehl (wie die folgenden Antworten) erreichen möchten, dann dachte ich, meine Antwort würde mit dem leichteren Teil des Problems helfen. –

+0

es geht nicht darum, es über Terminalbefehle zu haben. Ja, das könnte ein guter Weg sein. Aber was ich suche, ist viel mehr als ein Programm auszuführen, weil ich mit dem Matlab-Code interagieren muss.Ich kann den Java Builder und/oder jedes andere Feature von Matlab verwenden, um eine vollständige Kontrolle zu haben, aber ich muss wissen, was alle Schritte sind, da es kein allgemeines Problem ist. Ich fürchte, dass ich eine Wendung machen sollte um es zu machen. Aber was ist das für eine Wendung? –

3

meine Antwort wäre in zwei Teile:

1- wie Matlab Skript von Terminal laufen? - Ich werde einige Beispiele geben über Matlab-Skript von Terminal

matlab -nojvm -nodesktop -r "run <the-script>.m" 
matlab -nojvm -nodesktop -r "<the-script>" 
matlab -nojvm -nodesktop -r "run <the/path>/<the-script>.m" 

matlab in Windows ausgeführt wird, müssen in Ihrer Umgebung Pfad sein.how to ?

wenn Sie Ihr Skript Java kompilieren:

java -jar yourjarfile.jar 

2-, wie Terminal-Befehl von PHP ausführen? Ich denke, die obigen Antworten sind gut, keine Notwendigkeit, sie zu wiederholen.

mehr Noten:

  1. Uhr für Ihre Sicherheit, könnten Sie xss ed leicht
  2. abstrakten Code sein und verbessern params & Ausgabe-Datenbank führen Sie den Code in Parallelen oder WS-Manager zu speichern , könnten Sie den REST-Service erstellen.
  3. Komponententest.
  4. Verwenden Sie Linux, es ist viel mächtiger.