2016-05-25 38 views
2

我試圖在Ubuntu 14.04 Mink (PHP);我基本上做了以下:nodejs無法找到與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 [email protected]: wanted: {"node":"^4.0.0"} (current: {"node":"0.10.45","npm":"2.15.1"}) 
... 
[email protected] /usr/lib/node_modules/zombie 
├── [email protected] 
├── [email protected] 
... 

$ ls /usr/lib/node_modules/zombie/node_modules/ 
babel-runtime bluebird debug eventsource iconv-lite jsdom lodash mime ms request tough-cookie ws 

所以,基本上,就算我得到一個警告,模塊建造,並應在目錄/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(也Cannot find module 'zombie' · Issue #84 · assaf/zombie · 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 

我怎樣才能得到這個運行基本示例?


編輯:玩過周圍多一點這個問題,並發現,當我指定的命令行環境變量:

$ 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 
... 

...然後模塊似乎找到了!所以我的問題基本上簡化爲:我怎樣才能從我的php腳本中更改NODE_PATH環境變量,所以我不必在shell中指定它 - 因爲顯然putenv("NODE_PATH=/usr/lib/node_modules");對我而言並不真實...

As對於新的錯誤,有Installing Zombie.js Error: ReferenceError: Set is not defined. What am I doing wrong? - 顯然這是由於版本不匹配,我得到了一個警告(npm WARN engine [email protected]: wanted: {"node":"^4.0.0"} (current: {"node":"0.10.45","npm":"2.15.1"})),所以我想我將不得不安裝nvm,以便我可以安裝正確的nodejs版本;我也注意到,在/usr/lib/node_modules/zombie/README.md

殭屍4.x的經過測試與io.js 1.6 or later工作。
如果您需要使用節點0.12或更早版本,請考慮使用Zombie 2.x. ...
要安裝Zombie.js你需要io.js
```慶典
$ NPM安裝殭屍--save-dev的
```

...我認爲,也可以用nvm安裝;所以我會試試...

回答

0

好吧,找到某種似乎有效的方法 - 但我仍然希望有人能夠更有知識地回答。

無論如何,訣竅是 - zombie可以接受一個路徑到nodejs二進制;所以如果你不能真正從PHP中傳遞nodejs的環境變量,那麼創建一個shell腳本來設置這些環境變量,然後調用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的問題是,它在用戶目錄中安裝,我想測試我的用戶機和遠程服務器,在我的劇本我都uids完全不同。無論如何,使用自定義可執行文件有一點幫助。所以,在「全局」位置創建一個腳本,我選擇了/home,所以我需要sudo在那裏創建文件:

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 "[email protected]" | tee -a /tmp/node.log 
/home/USERNAME/.nvm/versions/node/v4.0.0/bin/node "[email protected]" 

...當然,用正確的替換路徑;後來終於使其可執行:

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.phpsetNodeModulesPath($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: '' 

...並且沒有錯誤,我假設它是所有現在罰款...