V poslední době jsem se setkal s mnoha dotazy, jak spustit PHP v Node.js. Některé žádosti byly proto, že lidé nevědí, jak v Node.js dělat stejné věci, jako se snadno dělají v PHP, a jiné žádosti byly proto, že potřebují spolupracovat s jinými týmy, které programují pouze v PHP.
V každém případě jsem viděl odpověď, že to nejde. Což je věcně nepřesné. Vzhledem k tomu, že PHP můžete spouštět v příkazovém řádku a Node.js umí snadno spouštět programy přes příkazový řádek, je to velmi dobře možné.
Jaké jsou výhody?
- Snadná spolupráce napříč týmy s různými znalostmi
- PHP umí opravdu dobře házet rychlé skripty dohromady
- Není třeba provozovat několik serverů, pokud je potřeba jak Node.js, tak PHP
Jaké jsou nevýhody?
- Více možností narušení bezpečnosti
- Ne příliš dobrý výkon
- Snadno se střelíte do nohy
- Pokud už znáte PHP a učíte se node, budete mít pravděpodobně tendenci programovat „těžké“ věci v PHP, a tím se nenaučíte node způsob.
Samozřejmě, že nevýhod a výhod je asi víc, ale o těch se dozvíte v komentářích 😉
V podstatě je tento článek krokem 1. Není to kompletní řešení. Má jen ukázat, že to jde a jak.
Začněme
Přeskočím povídání o tom, jak nainstalovat Node. O tom je spousta návodů.
První věc, kterou musíte udělat, je nainstalovat PHP (pokud jste ho ještě nenainstalovali).
Stačí postupovat podle standardního návodu na http://php.net/manual/en/install.php a mělo by to být v pořádku.
V tomto příkladu také používám Express. Pro spuštění PHP v Node.js nemusíte Express používat, ale prozatím se jím řiďme.
npm install express – save
Nyní se podíváme na soubor webserver.js, který bude prvním souborem našeho projektu.
Jak vidíte, vytvořili jsme celkem jednoduchý webserver. Pokud jste již dříve pracovali s Expressem, víte, co většina příkladu dělá.
To, co jste ještě neviděli, je vyžadování souboru „execphp.js“, ve kterém budeme provádět parsování PHP.
Definujeme také trasu, která přijímá všechny *.php požadavky a spustí je přes třídu execPHP.
Note: Change the variable execPHP.phpFolder to wherever you want to put your own php files.
Nyní se podíváme na soubor „execphp.js“, který bude druhým souborem našeho projektu.
Jak vidíte, tento soubor obsahuje třídu ExecPHP s jedinou metodou parseFile. Tato metoda v podstatě přijme soubor, provede příkazový řádek PHP a zavolá předané zpětné volání s výsledkem.
Note: Change the variable this.phpPath to wherever you have PHP installed.
Nyní vytvoříme jednoduchý soubor PHP. Nazval jsem ho „test.php“ a umístil ho do složky „phpfiles“ (té, kterou jste upravovali ve webserver.js).
Jak vidíte, jedná se o velmi jednoduchý příklad.
Nyní spustíme webserver.
node – use_strict webserver.js
A v našem prohlížeči navštivte http://localhost:3000/test.php.
Woohoo, snad byste měli dostat výsledek souboru php.
Hello worldA simple counter:
0
1
2
3
4
5
6
7
8
9
Některé další problémy necháme jako cvičení pro čtenáře.
Pokud tento skript použijete jen tak bez úprav, rychle narazíte na omezení. Například není nastaveno $_GET, $_REQUEST atd. Pokud byste to chtěli použít, pravděpodobně byste nechali Node.js napsat nějaké falešné PHP nastavující proměnné na to, co chcete, a zpracovat to před samotným souborem.
Všeobecně dobré nápady pro další vývoj:
- Udělat z execPHP samotný express-middleware.
- Sanitizovat název souboru, aby se zajistilo, že lidé nebudou psát věci jako ../../../evilfile.php, aby přistupovali k věcem, ke kterým by neměli.
- Spravovat $_GET, $_SERVER, $_REQUEST, .atd. automaticky ve třídě execPHP, aby byly k dispozici v php skriptech.
Napsal Martin Mouritzen.
Připravil Martin Mouritzen.