Ik heb de laatste tijd veel verzoeken gezien over hoe je PHP in Node.js kunt draaien. Sommige verzoeken zijn gedaan omdat mensen niet weten hoe ze dezelfde dingen in Node.js moeten doen als ze gemakkelijk in PHP doen, en andere verzoeken zijn gedaan omdat ze moeten samenwerken met andere teams die alleen in PHP programmeren.

In alle gevallen heb ik het antwoord gezien, dat het niet kan. Wat feitelijk onjuist is. Aangezien je PHP op de command line kunt draaien, en Node.js makkelijk programma’s via de command line kan uitvoeren, is het heel goed mogelijk.

Wat zijn de voordelen?

  • Eenvoudige samenwerking tussen teams met verschillende kennis
  • PHP is echt goed in het in elkaar gooien van snelle scripts
  • Het is niet nodig om meerdere servers te draaien als zowel Node.js als PHP nodig zijn

Wat zijn de nadelen?

  • Meer mogelijkheden voor beveiligingsinbreuken
  • Niet erg goede prestaties
  • Makkelijk om jezelf in de voet te schieten
  • Als je PHP al kent en node leert, zul je waarschijnlijk de neiging hebben om de “moeilijke” dingen in PHP te programmeren, waardoor je niet de node manier leert om het te doen.

Natuurlijk zijn er waarschijnlijk meer nadelen en voordelen, maar laat die maar horen in de comments 😉

Basically is dit artikel een stap 1. Het is geen complete oplossing. Het is alleen bedoeld om te laten zien dat het kan en hoe.

Let’s get started

Ik zal overslaan te vertellen hoe je Node installeert. Daar zijn veel tutorials over te vinden.

Het eerste wat je moet doen is PHP installeren (als je dat nog niet gedaan hebt).
Volg gewoon de standaard instructies op http://php.net/manual/en/install.php en het komt goed.

Ook gebruik ik in dit voorbeeld Express. Je hoeft Express niet te gebruiken om PHP in Node.js te draaien, maar laten we het er voor nu op houden.

npm install express – save

Laten we nu eens kijken naar webserver.js, dat het eerste bestand in ons project zal zijn.

Zoals u kunt zien, hebben we een vrij eenvoudige webserver gemaakt. Als u eerder met Express hebt gewerkt, weet u al wat het grootste deel van het voorbeeld doet.

De dingen die u nog niet eerder hebt gezien, zijn de vereisten van de “execphp.js”, waar we de PHP-parsing zullen uitvoeren.

We definiëren ook een route die alle *.php verzoeken ontvangt en deze door de execPHP klasse laat lopen.

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

Naar “execphp.js”, het tweede bestand in ons project.

Zoals u kunt zien bevat dit bestand een klasse, ExecPHP, met een enkele methode, parseFile. Deze methode neemt in principe een bestand, voert de opdrachtregel PHP uit en roept de doorgegeven callback op met het resultaat.

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

Nu laten we een eenvoudig PHP-bestand maken. Ik heb dit “test.php” genoemd en het in de map “phpfiles” gezet (de map die u in webserver.js hebt bewerkt).

Zoals u kunt zien is dit een heel eenvoudig voorbeeld.

Nu laten we de webserver draaien.

node – use_strict webserver.js

En bezoek http://localhost:3000/test.php in onze browser.

Woohoo, hopelijk zou je het resultaat van het php bestand moeten krijgen.

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

Enige verdere problemen, laten we als oefeningen voor de lezer.

Als je dit script gewoon gebruikt zonder het te bewerken, loop je al snel tegen beperkingen aan. Bijvoorbeeld $_GET, $_REQUEST, enz. is niet ingesteld. Als je dit zou willen gebruiken, zou je waarschijnlijk Node.js wat nep PHP moeten laten schrijven om variabelen in te stellen op wat jij wilt, en dat voor het bestand zelf verwerken.

Algemeen goede ideeën voor verdere ontwikkeling:

  • Maak van de execPHP zelf een express-middleware.
  • Sanitizeer de bestandsnaam om er zeker van te zijn dat mensen geen dingen als ../../../evilfile.php schrijven om toegang te krijgen tot dingen die ze niet zouden mogen.
  • Handle $_GET, $_SERVER, $_REQUEST, .etc. automatisch in de execPHP klasse, zodat deze beschikbaar zijn in de php scripts.

Geschreven door Martin Mouritzen.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.