Intereting Posts

nodejs не может найти модуль «зомби» с PHP норкой

Я тестирую Mink (PHP) на Ubuntu 14.04; Я в основном сделал следующее:

$ 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 

Итак, в принципе, даже если я получаю предупреждение, модули строятся и должны находиться в каталоге /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 (а также не удается найти модуль «зомби» · Проблема № 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 

Как я могу запустить этот базовый пример?


EDIT: немного поработал с этим и обнаружил, что когда я укажу переменную окружения в командной строке:

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

… тогда модуль, кажется, найден! Поэтому мой вопрос в основном сводится к: как я могу изменить NODE_PATH среды NODE_PATH из моего php-скрипта, поэтому мне не нужно было указывать его в оболочке – поскольку, по-видимому, putenv("NODE_PATH=/usr/lib/node_modules"); на самом деле не работает для меня …

Что касается новой ошибки, появляется сообщение об установке Zombie.js Error: ReferenceError: Set не определен. Что я делаю не так? – по-видимому, это связано с несоответствием версии, что я получил предупреждение для ( 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 :

Zombie 4.x тестируется для работы с io.js 1.6 или новее .
Если вам нужно использовать Node 0.12 или ранее, подумайте об использовании Zombie 2.x. …
Для установки Zombie.js вам понадобится io.js :
“ `Баш
$ npm установить зомби –save-dev
“ `

… и я думаю, что также можно установить с nvm ; поэтому я попробую попробовать …

    Хорошо, нашел какой-то метод, который, по-видимому, работает, но мне все равно хотелось бы, чтобы кто-то более осведомлен, чтобы ответить.

    В любом случае, трюк – zombie может принять путь к nodejs ; поэтому, если вы не можете передавать переменные окружения для nodejs из PHP, тогда создайте сценарий оболочки, который установит эти переменные среды, а затем вызовет 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 "$@" | tee -a /tmp/node.log /home/USERNAME/.nvm/versions/node/v4.0.0/bin/node "$@" 

    … конечно, заменив пути вашими правильными; затем, наконец, сделать его исполняемым:

     sudo chmod +x /home/node_pth.sh 

    Теперь мы можем использовать следующий test_php_mink.php PHP test_php_mink.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) , поэтому мы можем полностью удалить исполняемый файл proxy 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: '' 

    … и, поскольку ошибок нет, я предполагаю, что все в порядке сейчас …