Jag har sett många förfrågningar på sistone om hur man kör PHP i Node.js. Vissa förfrågningar har berott på att folk inte vet hur man gör samma saker i Node.js som de gör enkelt i PHP, och andra förfrågningar har berott på att de måste samarbeta med andra team som bara programmerar i PHP.
I varje fall har jag sett svaret, att det inte går att göra. Vilket är sakligt felaktigt. Eftersom du kan köra PHP på kommandoraden och Node.js enkelt kan exekvera program via kommandoraden är det mycket möjligt.
Vad är fördelarna?
- Lätt samarbete mellan team med olika kunskaper
- PHP är riktigt bra på att slänga ihop snabba skript
- Ingen anledning att köra flera servrar om både Node.js och PHP behövs
Vilka nackdelar finns det?
- Mer möjligheter till säkerhetsöverträdelser
- Inte särskilt bra prestanda
- Lätt att skjuta sig själv i foten
- Om du redan kan PHP och lär dig node, kommer du förmodligen att ha en tendens att programmera de ”svåra” sakerna i PHP och därmed inte lära dig node-sättet att göra det på.
Självklart finns det förmodligen fler nackdelar och fördelar, men låt oss höra om dem i kommentarerna 😉
I grund och botten är den här artikeln ett steg 1. Det är inte en komplett lösning. Det är bara för att visa att det kan göras och hur.
Låt oss komma igång
Jag hoppar över att berätta hur man installerar Node. Det finns massor av handledningar om det.
Det första du behöver göra är att installera PHP (om du inte redan har gjort det).
Följ bara standardinstruktionerna på http://php.net/manual/en/install.php så borde det gå bra.
I det här exemplet använder jag dessutom Express. Du behöver inte använda Express för att köra PHP i Node.js, men låt oss gå med det för tillfället.
npm install express – save
Nu tar vi en titt på webserver.js som kommer att vara den första filen i vårt projekt.
Som du kan se har vi gjort en ganska enkel webbserver. Om du har arbetat med Express tidigare vet du redan vad det mesta av exemplet gör.
Det du inte har sett tidigare är kravet på ”execphp.js” som är där vi kommer att göra PHP-parsningen.
Vi definierar också en rutt som tar emot alla *.php-förfrågningar och kör dem genom execPHP-klassen.
Note: Change the variable execPHP.phpFolder to wherever you want to put your own php files.
Nu tar vi en titt på ”execphp.js” som blir den andra filen i vårt projekt.
Som du kan se innehåller den här filen en klass, ExecPHP, med en enda metod, parseFile. Denna metod tar i princip en fil, utför kommandoraden PHP och anropar den överlämnade callbacken med resultatet.
Note: Change the variable this.phpPath to wherever you have PHP installed.
Nu ska vi göra en enkel PHP-fil. Jag har kallat den ”test.php” och lagt den i mappen ”phpfiles” (den du redigerade i webserver.js).
Som du kan se är detta ett mycket enkelt exempel.
Nu kör vi webbservern.
node – use_strict webserver.js
Och besök http://localhost:3000/test.php i vår webbläsare.
Woohoo, förhoppningsvis bör du få resultatet av php-filen.
Hello worldA simple counter:
0
1
2
3
4
5
6
7
8
9
Vissa ytterligare problem lämnar vi som övningar för läsaren.
Om du bara använder det här skriptet utan att redigera det kommer du snabbt att stöta på begränsningar. Till exempel är $_GET, $_REQUEST etc. inte inställda. Om du vill använda detta skulle du förmodligen låta Node.js skriva en falsk PHP som ställer in variablerna till vad du vill att de ska vara, och behandla det före själva filen.
Generellt sett bra idéer för framtida utveckling:
- Gör execPHP till en express-middleware i sig själv.
- Sanitisera filnamnet för att se till att folk inte skriver saker som ../../../../evilfile.php för att komma åt saker de inte borde.
- Hantera $_GET, $_SERVER, $_REQUEST, .etc. automatiskt i execPHP-klassen, så att dessa kommer att vara tillgängliga i php-skriptet.
Skrivet av Martin Mouritzen.