Я тестирую 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: ''
… и, поскольку ошибок нет, я предполагаю, что все в порядке сейчас …