2016-06-30 2 views
0

На моем сервере (Ubuntu 14.04.4 LTS) у меня установлен Firefox, а также xvfb для безгласного действия Firefox и CasperJS с SlimerJS. У меня также есть скрипт CasperJS, который отлично работает. Я хочу использовать этот скрипт из PHP; это суть моего PHP скрипт для этого, давайте назовем его mytest.php:Запуск SlimerJS + безгласного скрипта Firefox через PHP на веб-сервере?

echo "php_sapi_name() " . php_sapi_name() . "\n"; // "cli" for php cli, "apache2handler" for php via webserver 

chdir(dirname(__FILE__)); 

$nodeModPath = "/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules"; 

putenv("SLIMERJSLAUNCHER=/usr/bin/firefox46"); 
$cmdline = "xvfb-run $nodeModPath/casperjs/bin/casperjs --engine=slimerjs --debug=true mySlimerScript.js"; 

$returnString = shell_exec($cmdline); 
echo "$returnString\n"; 

EDIT: Обратите внимание, что команда может также быть просто:

$cmdline = "xvfb-run $nodeModPath/casperjs/bin/casperjs --engine=slimerjs --debug=true 2>&1"; 

... что , без какого-либо сценария JS, который указан - в этом случае справка должна быть сброшена (и в случае доступа к CLI), но при доступе через веб-сервер сообщается о такой же ошибке, как указано ниже:


Когда я запускаю этот скрипт из командной строки терминала (через SSH), то есть через PHP в режиме CLI:

$ php mytest.php 

... все работает нормально, нет никаких проблем вообще.

Однако, когда я вызываю этот скрипт в Интернете через веб-сервер, то есть через http://example.com/mytest.php, он не первый с ошибкой:

Gecko error: it seems /usr/bin/firefox46 is not compatible with SlimerJS. 
See Gecko version compatibility. If version is correct, launch slimerjs 
with --debug=true to see Firefox error message 

... и после добавления --debug=true (как уже включен в пример выше), я дополнительно получаю эту ошибку:

JavaScript error: resource://gre/modules/FileUtils.jsm, line 63: NS_ERROR_FAILURE: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIProperties.get] 

Таким образом, по-видимому, мой обезглавленный Firefox не хочет работать, когда PHP запускается через веб-сервер (в этом случае, PHP сообщает, что он использует apache2handler SAPI).

Может кто-нибудь знать, почему это происходит - и как я могу заставить скрипт правильно выполняться при вызове с веб-сервера так же, как при работе в режиме CLI в PHP?

EDIT 2: теперь можно также восстановить эту ошибку через режим CLI и подтвердить это пользователем; поэтому без какого-либо сценария JS, представленного в $command, я получаю это:

$ sudo -H -u root php mytest.php 
... 
Usage: casperjs [options] script.[js|coffee] [script argument [script argument ...]] 
     casperjs [options] test [test path [test path ...]] 
     casperjs [options] selftest 
... 

$ sudo -H -u www-data php mytest.php 
JavaScript error: resource://gre/modules/FileUtils.jsm, line 63: NS_ERROR_FAILURE: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIProperties.get] 
Gecko error: it seems /usr/bin/firefox46 is not compatible with SlimerJS. 
See Gecko version compatibility. If version is correct, launch slimerjs 
with --debug=true to see Firefox error message 
+1

Первые мысли: разрешения файлов при запуске сценария в режиме «cli» будут иметь пользователя, запускающего его, однако через веб-сервер пользователь будет «www-data». Возможно, не так ли? –

+0

Действительно, @ php-dev, но я не могу понять, чьи разрешения будут проблемой; здесь я называю 'xvfb-run', который вызывает' casperjs', который вызывает 'slimerjs', который вызывает безгласный Firefox. Есть ли способ проверить ошибки разрешений где-нибудь в этом случае? Я попробовал '/ var/log/apache2/error-mysite.log', но он только сообщает PHP-материал, например' Trying get property of non-object', как только вызов 'shell_exec' завершится с ошибкой. – sdbbs

+1

Попробуйте перенаправить вывод 'stderr' в' stdout' или файл. –

ответ

4

Ну, это была неприятная проблема. Я закончил тем, что делал в strace, и сравнивая журналы, для root пользователя и www-data пользователя при работе с полной slimerjs (полной командной строки можно найти путем добавления echo эсов к /path/to/slimerjs-0.10.1-pre/slimerjs):

sudo -H -u www-data strace \ 
    /usr/bin/firefox46 -app /path/to/slimerjs-0.10.1-pre/application.ini \ 
    --profile /path/to/firefox-46.0.1/profile-46 -no-remote --debug=true /home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules/casperjs/bin/bootstrap.js --casper-path=/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules/casperjs \ 
    --cli 2>&1 \ 
    | tee /tmp/strace.log 

sudo -H -u root strace \ 
    /usr/bin/firefox46 -app /path/to/slimerjs-0.10.1-pre/application.ini \ 
    --profile /path/to/firefox-46.0.1/profile-46 -no-remote --debug=true /home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules/casperjs/bin/bootstrap.js --casper-path=/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules/casperjs \ 
    --cli 2>&1 \ 
    | tee /tmp/straceR.log 

Если эти журналы теперь по сравнению, скажем, meld, то в конечном итоге начинают расходящиеся в точке, как это:

mkdir("/root/.innophi", 0700)   = 0 
mkdir("/root/.innophi/slimerjs", 0700) = 0 

... [vs.] ... 

mkdir("/var/www/.innophi", 0700)  = -1 EACCES (Permission denied) 
access("/var/www/.innophi", F_OK)  = -1 ENOENT (No such file or directory) 

Так, casperJS в основном пытается создать каталог в домашней директории пользователя; проблема в том, www-data$HOME is /var/www, где у него, похоже, нет доступа для записи!

Итак, проще всего для меня было «взломать» переменную окружения $HOME в mytest.php сценарии, и установить его в /tmp, где www-data определенно имеет права на запись:

... 
putenv("SLIMERJSLAUNCHER=/usr/bin/firefox46"); 
putenv("HOME=/tmp"); 
... 

... и whaddayaknow , наконец, скрипт работает под www-data пользователя из CLI тоже:

$ sudo -H -u www-data php test_commands.php 
... 
Options: 

--verbose Prints log messages to the console 
--log-level Sets logging level 
--help  Prints this help 
... 

Btw, это .innophi каталог, кажется, также упоминается в https://docs.slimerjs.org/current/configuration.html#profiles,