Cameron
Cameron

Reputation: 28853

Run NodeJS commands from PHP

I have the following PHP code that is run when a user clicks a button on a local intranet page to run some Node JS commands. e.g.

exec('npm install', $output);
$output = implode(PHP_EOL, $output);
echo $output;

But the command doesn't seem to get run... It does if I type the command into the command prompt and run it...

I don't see any errors and NodeJS is set as a system variable in the Path so it should know what grunt is... Any ideas? Other commands, e.g. whoami run fine.

Any ideas?

I'm on Windows 7.


Update: Based on the comments below I can now get an error with:

exec('npm install 2>&1', $output, $returnCode);
$output = implode(PHP_EOL, $output);
echo $output . ' ' . $returnCode;

And this is the error:

TypeError: Cannot call method 'get' of undefined at C:\Program Files (x86)\nodejs\node_modules\npm\lib\npm.js:310:23 at C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\npmconf\npmconf.js:80:7 at Array.forEach (native) at C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\npmconf\npmconf.js:79:13 at f (C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\once\once.js:16:25) at C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\npmconf\npmconf.js:108:14 at Conf. (C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\npmconf\npmconf.js:179:14) at Conf.next (C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\npmconf\lib\load-prefix.js:48:20) at C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\mkdirp\index.js:37:53 at Object.oncomplete (fs.js:107:15) C:\Program Files (x86)\nodejs\node_modules\npm\lib\npm.js:33 throw new Error('npm.load() required') ^ Error: npm.load() required at Object.npm.config.get (C:\Program Files (x86)\nodejs\node_modules\npm\lib\npm.js:33:11) at exit (C:\Program Files (x86)\nodejs\node_modules\npm\lib\utils\error-handler.js:49:27) at process.errorHandler (C:\Program Files (x86)\nodejs\node_modules\npm\lib\utils\error-handler.js:316:3) at process.emit (events.js:95:17) at process._fatalException (node.js:272:26) 7

So it looks like the PHP knows where NodeJS and NPM is... but can't run it?


If I do whoami in the PHP I get: nt authority\iusr

But if I do it from the command prompt then I get: dom\cameron

I wonder if it's because PHP runs it as a different user to when I run it directly in the command prompt...


Upvotes: 4

Views: 3864

Answers (3)

Cameron
Cameron

Reputation: 28853

Okay I've managed to fix this!

Basically you need to run the website (where the PHP file lives) as the same user as where NodeJS is run from!

To achieve this I did the following in IIS:

1.) Find the website
2.) Choose basic settings
3.) Click the connect as... button
4.) Choose 'specific user'
5.) Enter `dom/cameron` and my password
6.) Restart IIS

If anyone has any ideas for how to get NodeJS running for the default nt authority\iusr then feel free to post an answer :)

Upvotes: 1

CargoMeister
CargoMeister

Reputation: 4319

The error you're getting indicating that an object is not defined. It's quite possible that a module is simply not loading because you're not running the script from the correct location, and relative links to some include are not working. Running as the correct user might fix it. Or try changing to the correct directory before running the node script. Or change the location of the links inside the node script.

Upvotes: 0

Peter
Peter

Reputation: 1669

You defined npm in WINDOWS path, but did PHP recognize it?

I suggest you should test it with writing the full NPM path in the exec. If it works, than you should call putenv() with correct parameters before executing npm install..

So first try:

exec('C:\npm-test\npm install', $output);
$output = implode(PHP_EOL, $output);
echo $output;

And if it works, use the putenv() command before calling exec(). Example:

putenv("npm='C:\npm-test\npm'");

//and then exec(...)

Upvotes: 0

Related Questions