Jeg har set en masse forespørgsler på det seneste om, hvordan man kører PHP i Node.js. Nogle forespørgsler har været fordi folk ikke ved hvordan de skal gøre de samme ting i Node.js som de gør nemt i PHP, og andre forespørgsler har været fordi de skal arbejde sammen med andre hold, der kun programmerer i PHP.

I alle tilfælde har jeg set svaret, at det ikke kan lade sig gøre. Hvilket er faktuelt ukorrekt. Da du kan køre PHP på kommandolinjen, og Node.js nemt kan eksekvere programmer via kommandolinjen, er det i høj grad muligt.

Hvad er fordelene?

  • Let samarbejde på tværs af teams med forskellig viden
  • PHP er rigtig god til at smide hurtige scripts sammen
  • Ingen grund til at køre flere servere, hvis der er brug for både Node.js og PHP

Hvilke ulemper er der?

  • Mere muligheder for sikkerhedsbrister
  • Men ikke særlig god ydeevne
  • Let at skyde sig selv i foden
  • Hvis du allerede kender PHP og er ved at lære node, vil du sandsynligvis have en tendens til at programmere de “svære” ting i PHP, og dermed ikke lære node-måden at gøre det på.

Selvfølgelig er der sikkert flere ulemper og fordele, men lad os høre om dem i kommentarerne 😉

Grundlæggende er denne artikel et trin 1. Det er ikke en komplet løsning. Det er bare for at vise, at det kan lade sig gøre og hvordan.

Lad os komme i gang

Jeg springer over at fortælle hvordan man installerer Node. Der er masser af tutorials om det.

Det første du skal gøre er at installere PHP (hvis du ikke allerede har gjort det).
Følg blot standardinstruktionerne på http://php.net/manual/en/install.php, så skulle det være fint.

Og i dette eksempel bruger jeg Express. Du behøver ikke at bruge Express for at køre PHP i Node.js, men lad os gå med det for nu.

npm install express – save

Nu tager vi et kig på webserver.js, som bliver den første fil i vores projekt.

Som du kan se, har vi lavet en ret simpel webserver. Hvis du har arbejdet med Express før, ved du allerede, hvad det meste af eksemplet gør.

Det, du ikke har set før, er requireing af “execphp.js”, som er der, hvor vi vil foretage PHP-parsningen.

Vi definerer også en rute, der modtager alle *.php-forespørgsler, og kører dem gennem execPHP-klassen.

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

Nu tager vi et kig på “execphp.js”, som vil være den anden fil i vores projekt.

Som du kan se, indeholder denne fil en klasse, ExecPHP, med en enkelt metode, parseFile. Denne metode tager grundlæggende en fil, udfører kommandolinjen PHP og kalder den overgivne callback med resultatet.

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

Nu skal vi lave en simpel PHP-fil. Jeg har kaldt den “test.php” og lagt den i mappen “phpfiles” (den, du redigerede i webserver.js).

Som du kan se, er dette et meget simpelt eksempel.

Nu skal vi køre webserveren.

node – use_strict webserver.js

Og besøg http://localhost:3000/test.php i vores browser.

Woohoo, forhåbentlig skulle du få resultatet af php-filen.

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

Nogle yderligere problemer vil vi lade som øvelser for læseren.

Hvis du bare bruger dette script uden at redigere det, vil du hurtigt støde på begrænsninger. F.eks. er $_GET, $_REQUEST osv. ikke sat. Hvis du ville bruge dette, ville du sandsynligvis få Node.js til at skrive noget falsk PHP, der sætter variabler til det, du ønsker, at de skal være, og behandle det før selve filen.

Generelt gode ideer til fremtidig udvikling:

  • Gør execPHP til en express-middleware selv.
  • Sanitiser filnavnet for at sikre, at folk ikke skriver ting som ../../../../evilfile.php for at få adgang til ting, de ikke burde.
  • Håndter $_GET, $_SERVER, $_REQUEST, .osv. automatisk i execPHP-klassen, så disse vil være tilgængelige i php-scripterne.

Skrevet af Martin Mouritzen.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.