In letzter Zeit habe ich viele Anfragen gesehen, wie man PHP in Node.js laufen lassen kann. Einige Anfragen kamen, weil die Leute nicht wissen, wie sie die gleichen Dinge in Node.js tun können, wie sie es in PHP einfach tun, und andere Anfragen kamen, weil sie mit anderen Teams zusammenarbeiten müssen, die nur in PHP programmieren.

In jedem Fall habe ich die Antwort gesehen, dass es nicht getan werden kann. Was sachlich nicht korrekt ist. Da man PHP auf der Kommandozeile ausführen kann, und Node.js kann problemlos Programme über die Kommandozeile ausführen, ist es sehr wohl möglich.

Was sind die Vorteile?

  • Einfache Zusammenarbeit zwischen Teams mit unterschiedlichem Wissen
  • PHP ist wirklich gut darin, schnelle Skripte zusammenzustellen
  • Es müssen nicht mehrere Server betrieben werden, wenn sowohl Node.js als auch PHP benötigt werden

Was sind die Nachteile?

  • Mehr Möglichkeiten für Sicherheitslücken
  • Nicht sehr gute Leistung
  • Einfach, sich selbst in den Fuß zu schießen
  • Wenn man bereits PHP kennt und Node lernt, wird man wahrscheinlich dazu neigen, die „harten“ Dinge in PHP zu programmieren und so nicht die Node-Methode zu lernen.

Natürlich gibt es wahrscheinlich noch mehr Nachteile und Vorteile, aber lasst uns in den Kommentaren davon hören 😉

Grundsätzlich ist dieser Artikel ein Schritt 1. Es ist keine vollständige Lösung. Er soll nur zeigen, dass es möglich ist und wie.

Lasst uns anfangen

Ich überspringe es, euch zu erzählen, wie man Node installiert. Es gibt viele Tutorials darüber.

Als erstes musst du PHP installieren (wenn du es nicht schon getan hast).
Befolge einfach die Standardanweisungen auf http://php.net/manual/en/install.php und du solltest keine Probleme haben.

Auch verwende ich in diesem Beispiel Express. Sie müssen Express nicht verwenden, um PHP in Node.js laufen zu lassen, aber wir nehmen es für den Moment.

npm install express – save

Werfen wir nun einen Blick auf webserver.js, die die erste Datei in unserem Projekt sein wird.

Wie Sie sehen, haben wir einen ziemlich einfachen Webserver erstellt. Wenn Sie schon einmal mit Express gearbeitet haben, wissen Sie bereits, was das Beispiel macht.

Das, was Sie noch nicht gesehen haben, ist die Anforderung der Datei „execphp.js“, in der wir das PHP-Parsing durchführen werden.

Wir definieren auch eine Route, die alle *.php-Anfragen empfängt und sie durch die execPHP-Klasse laufen lässt.

Note: Change the variable execPHP.phpFolder to wherever you want to put your own php files.

Werfen wir nun einen Blick auf „execphp.js“, die zweite Datei in unserem Projekt.

Wie Sie sehen können, enthält diese Datei eine Klasse, ExecPHP, mit einer einzigen Methode, parseFile. Diese Methode nimmt eine Datei, führt die PHP-Befehlszeile aus und ruft den übergebenen Callback mit dem Ergebnis auf.

Note: Change the variable this.phpPath to wherever you have PHP installed.

Nun wollen wir eine einfache PHP-Datei erstellen. Ich habe sie „test.php“ genannt und in den Ordner „phpfiles“ gelegt (den Sie in webserver.js bearbeitet haben).

Wie Sie sehen können, ist dies ein sehr einfaches Beispiel.

Nun lassen wir den Webserver laufen.

node – use_strict webserver.js

Und besuchen Sie http://localhost:3000/test.php in unserem Browser.

Woohoo, hoffentlich sollten Sie das Ergebnis der php-Datei erhalten.

Hello worldA simple counter:
0
1
2
3
4
5
6
7
8
9

Einige weitere Probleme lassen wir als Übungen für den Leser stehen.

Wenn Sie dieses Skript einfach verwenden, ohne es zu bearbeiten, werden Sie schnell an Grenzen stoßen. Zum Beispiel ist $_GET, $_REQUEST, etc. nicht gesetzt. Wenn man das verwenden wollte, müsste man wahrscheinlich Node.js dazu bringen, ein paar gefälschte PHP-Variablen zu schreiben, die auf das gesetzt werden, was man will, und das vor der eigentlichen Datei zu verarbeiten.

Generell gute Ideen für die weitere Entwicklung:

  • Machen Sie die execPHP selbst zu einer Express-Middleware.
  • Sanitize the filename to make sure people aren’t writing stuff like ../../../evilfile.php to access stuff they shouldn’t.
  • Handle $_GET, $_SERVER, $_REQUEST, .etc. automatically in the execPHP class, so those will be available in the php scripts.

Written by Martin Mouritzen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.