nodejs无法find与PHP水貂模块“僵尸”

我在Ubuntu 14.04上试用了Mink(PHP) 我基本上做了以下几点:

$ apt-show-versions nodejs nodejs:amd64/trusty 0.10.45-1nodesource1~trusty1 uptodate $ npm -v 2.15.1 $ sudo npm install -g zombie npm WARN engine zombie@4.2.1: wanted: {"node":"^4.0.0"} (current: {"node":"0.10.45","npm":"2.15.1"}) ... zombie@4.2.1 /usr/lib/node_modules/zombie ├── ms@0.7.1 ├── debug@2.2.0 ... $ ls /usr/lib/node_modules/zombie/node_modules/ babel-runtime bluebird debug eventsource iconv-lite jsdom lodash mime ms request tough-cookie ws 

所以,基本上,即使我得到警告,模块也会build立,并且应该位于/usr/lib/node_modules

那我呢:

 mkdir test_php_mink cd test_php_mink/ composer require behat/mink composer require behat/mink-zombie-driver 

作为支票:

 test_php_mink$ ls composer.json composer.lock vendor 

…似乎所有的composer文件都在那里。

最后,根据http://mink.behat.org/en/latest/drivers/zombie.html (也无法find模块“僵尸”问题#84·assaf /僵尸·GitHub ),我正在尝试这个脚本:

 <?php # composer autoload: require_once __DIR__ . '/vendor/autoload.php'; echo "safe_mode: '" . ini_get("safe_mode") ."'\n"; # have PHP 5.5.9, safe_mode is removed putenv("NODE_PATH=/usr/lib/node_modules"); echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; # OK, is there # NOPE: #$driver = new \Behat\Mink\Driver\ZombieDriver(); $driver = new \Behat\Mink\Driver\ZombieDriver( new \Behat\Mink\Driver\NodeJS\Server\ZombieServer() ); $session = new \Behat\Mink\Session($driver); // start the session $session->start(); ?> 

这个脚本,不幸的是,仍然失败:

 $ php test_php_mink.php safe_mode: '' NODE_PATH is: '/usr/lib/node_modules' PHP Fatal error: Uncaught exception 'RuntimeException' with message 'Server process has been terminated: (8) [ module.js:340 throw err; ^ Error: Cannot find module 'zombie' at Function.Module._resolveFilename (module.js:338:15) at Function.Module._load (module.js:280:25) at Module.require (module.js:364:17) at require (module.js:380:17) at Object.<anonymous> (/path/to/test_php_mink/vendor/behat/mink-zombie-driver/bin/mink-zombie-server.js:3:14) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Function.Module.runMain (module.js:497:10) ]' in /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/NodeJS/Server.php:413 Stack trace: #0 /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/NodeJS/Server.php(306): Behat\Mink\Driv in /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/NodeJS/Server.php on line 413 

我怎样才能得到这个基本的例子运行?


编辑:用这个玩了一下,发现当我在命令行指定环境variables时:

 $ NODE_PATH=/usr/lib/node_modules php test_php_mink.php safe_mode: '' NODE_PATH is: '/usr/lib/node_modules' PHP Fatal error: Uncaught exception 'RuntimeException' with message 'Server process has been terminated: (8) [ /usr/lib/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:238 var nonInheritedTags = new Set([ ^ ReferenceError: Set is not defined ... 

…那么模块似乎被发现! 所以我的问题基本上减less到:我怎样才能改变我的PHP脚本的NODE_PATH环境variables,所以我不会在shell中指定它 – 因为显然putenv("NODE_PATH=/usr/lib/node_modules"); 真的不适合我…

至于新的错误,有安装Zombie.js错误:ReferenceError:设置没有定义。 我究竟做错了什么? – 显然这是由于版本不匹配,我得到了警告( npm WARN engine zombie@4.2.1: wanted: {"node":"^4.0.0"} (current: {"node":"0.10.45","npm":"2.15.1"}) ),所以我想我将不得不安装nvm所以我可以安装正确的nodejs版本; 我也注意到/usr/lib/node_modules/zombie/README.md

僵尸4.xtesting与io.js 1.6或更高版本一起使用 。
如果您需要使用Node 0.12或更早版本,请考虑使用Zombie 2.x。 …
要安装Zombie.js,你将需要io.js :
“`庆典
$ npm install zombie –save-dev
“`

…我觉得也可以用nvm来安装; 所以我会试试…

好的,find了某种似乎有效的方法 – 但是我仍然希望有更多的知识能够回答。

无论如何,诀窍是 – zombie可以接受通往nodejs二进制文件的path; 所以如果你不能真正的从PHP中传递nodejs环境variables,那么创build一个shell脚本来设置这些环境variables,然后调用nodejs

首先这是我的安装:

 # remove previous sudo npm uninstall -g zombie --save-dev sudo apt-get remove --purge nodejs && sudo apt-get autoremove --purge # install new curl -o- https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash nvm install iojs-v3.3.1 npm list -g --depth=0 nvm install 4.0.0 npm list -g --depth=0 npm -g install zombie --save-dev 

nvm的问题在于它安装在用户目录中,我想在我的用户机器和远程服务器上testing我的脚本,在这些服务器上,我的uids完全不同。 无论如何,使用自定义可执行文件有一点帮助。 所以,在“全局”位置创build一个脚本,我select了/home ,所以我需要sudo在那里创build文件:

 sudo touch /home/node_pth.sh 

…然后粘贴在以下内容中:

 #!/bin/bash export NODE_PATH=/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules #echo ARGS ARE "$@" | tee -a /tmp/node.log /home/USERNAME/.nvm/versions/node/v4.0.0/bin/node "$@" 

…当然,用正确的路线取代path; 然后最终使其可执行:

 sudo chmod +x /home/node_pth.sh 

现在我们可以使用下面的test_php_mink.php PHP文件:

 <?php $nodeModPath = "/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules"; # correct NODE_PATH, but will not help $nodePath = "/home/node_pth.sh"; # shell script that sets NODE_PATH, then calls node executable echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; # putenv("NODE_PATH=".$nodeModPath); echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; # is there - but still doesn't help with call # composer autoload: require_once __DIR__ . '/vendor/autoload.php'; echo "safe_mode: '" . ini_get("safe_mode") ."'\n"; # have PHP 5.5.9, safe_mode is removed $driver = new \Behat\Mink\Driver\ZombieDriver( //~ new \Behat\Mink\Driver\NodeJS\Server\ZombieServer() # copy defaults here for everything but nodeBin; # see vendor/behat/mink-zombie-driver/src/NodeJS/Server.php new \Behat\Mink\Driver\NodeJS\Server\ZombieServer("127.0.0.1", 8124, $nodePath, null) ); $session = new \Behat\Mink\Session($driver); // start the session $session->start(); ?> 

…或者,我刚刚意识到在vendor/behat/mink-zombie-driver/src/NodeJS/Server.php setNodeModulesPath($nodeModulesPath)setNodeModulesPath($nodeModulesPath) ,所以我们可以完全删除代理bash可执行文件:

 <?php $nodeModPath = "/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules"; # correct NODE_PATH, but will not help via putenv echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; # putenv("NODE_PATH=".$nodeModPath); echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; # is there - but still doesn't help with call # composer autoload: require_once __DIR__ . '/vendor/autoload.php'; echo "safe_mode: '" . ini_get("safe_mode") ."'\n"; # have PHP 5.5.9, safe_mode is removed $zsrv = new \Behat\Mink\Driver\NodeJS\Server\ZombieServer(); $zsrv->setNodeModulesPath($nodeModPath . "/"); # needs to end with a trailing '/' $driver = new \Behat\Mink\Driver\ZombieDriver( $zsrv ); $session = new \Behat\Mink\Session($driver); // start the session $session->start(); ?> 

无论如何,当这个脚本被调用,它输出:

 $ php test_php_mink.php NODE_PATH is: '' NODE_PATH is: '/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules' safe_mode: '' 

…因为没有错误,我假设现在一切正常…