Az utóbbi időben sok kérést láttam, hogy hogyan futtassuk a PHP-t Node.js-ben. Néhány kérés azért volt, mert az emberek nem tudják, hogyan kell ugyanazokat a dolgokat Node.js-ben csinálni, mint amit PHP-ben egyszerűen csinálnak, más kérések pedig azért voltak, mert együtt kell dolgozniuk más csapatokkal, akik csak PHP-ben programoznak.
Minden esetben azt a választ láttam, hogy nem lehet megcsinálni. Ami tényszerűen pontatlan. Mivel a PHP-t futtathatod a parancssoron, és a Node.js is könnyen tud programokat futtatni a parancssoron keresztül, nagyon is lehetséges.
Mi az előnye?
- Egyszerű együttműködés különböző tudású csapatok között
- A PHP nagyon jó abban, hogy gyors szkripteket dobjon össze
- Nem kell több szervert futtatni, ha a Node.js-re és a PHP-ra is szükség van
Mi a hátránya?
- Több lehetőség a biztonsági résekre
- Nem túl jó a teljesítmény
- Egyszerűen lábon lövöd magad
- Ha már ismered a PHP-t és tanulod a node-ot, akkor valószínűleg hajlamos leszel a “nehéz” dolgokat PHP-ben programozni, így nem tanulod meg a node módját.
Naná, hogy valószínűleg több hátránya és előnye is van, de ezekről halljuk a hozzászólásokban 😉
Lényegében ez a cikk egy 1. lépés. Nem egy teljes megoldás. Csak megmutatja, hogy meg lehet csinálni és hogyan.
Lássunk hozzá
Kihagyom, hogy elmondjam, hogyan kell telepíteni a Node-ot. Erről rengeteg tutorial van.
Az első dolog, amit tenned kell, az a PHP telepítése (ha még nem tetted meg).
Egyszerűen csak kövesd a http://php.net/manual/en/install.php oldalon található szabványos utasításokat, és minden rendben lesz.
Ebben a példában az Express-t használom. Nem muszáj Express-t használnod ahhoz, hogy PHP-t futtass a Node.js-ben, de egyelőre maradjunk ennél.
npm install express – save
Most nézzük meg a webserver.js-t, ami az első fájl lesz a projektünkben.
Mint láthatod, egy elég egyszerű webszervert készítettünk. Ha már dolgoztál korábban Express-szel, akkor már tudod, hogy a példa nagy része mit csinál.
Az, amit még nem láttál, az az “execphp.js” megkövetelése, ahol a PHP elemzést fogjuk elvégezni.
Meghatározunk egy útvonalat is, amely az összes *.php kéréseket, és lefuttatja azokat az execPHP osztályon keresztül.
Note: Change the variable execPHP.phpFolder to wherever you want to put your own php files.
Most vessünk egy pillantást az “execphp.js”-re, amely a második fájl lesz a projektünkben.
Mint láthatjuk, ez a fájl tartalmaz egy osztályt, az ExecPHP-t, egyetlen metódussal, a parseFile-val. Ez a metódus alapvetően fogadja a fájlt, végrehajtja a parancssori PHP-t, és az eredménnyel meghívja az átadott callback-et.
Note: Change the variable this.phpPath to wherever you have PHP installed.
Most készítsünk egy egyszerű PHP fájlt. Ezt “test.php”-nak neveztem el, és a “phpfiles” mappába tettem (abba, amit a webserver.js-ben szerkesztettünk).
Mint láthatod, ez egy nagyon egyszerű példa.
Most futtassuk a webszervert.
node – use_strict webserver.js
És látogassunk el a http://localhost:3000/test.php-ra a böngészőnkben.
Húúúúú, remélhetőleg meg kell kapnunk a php fájl eredményét.
Hello worldA simple counter:
0
1
2
3
4
5
6
7
8
9
Még néhány további problémát meghagyunk gyakorlatként az olvasónak.
Ha csak úgy, szerkesztés nélkül használjuk ezt a szkriptet, hamar korlátokba ütközünk. Például a $_GET, $_REQUEST stb. nincs beállítva. Ha ezt akarod használni, akkor valószínűleg a Node.js-szel írnod kellene néhány hamis PHP-t, ami beállítja a változókat arra, amire szeretnéd, és ezt feldolgoznád maga a fájl előtt.
Általában jó ötletek a jövőbeli fejlesztéshez:
- Maga az execPHP egy express-middleware legyen.
- Szanitizálja a fájlnevet, hogy az emberek ne írjanak olyan dolgokat, mint ../../../../evilfile.php, hogy hozzáférjenek olyan dolgokhoz, amikhez nem kellene.
- Az execPHP osztályban automatikusan kezelje a $_GET, $_SERVER, $_REQUEST, .stb. értékeket, így azok elérhetőek lesznek a php szkriptekben.
Az író: Martin Mouritzen.