在我的服务器(Ubuntu 14.04.4 LTS)上,我安装了Firefox,以及xvfb
用于无头Firefox操作,CasperJS用于SlimerJS。我也有一个CasperJS脚本,工作正常。我想利用PHP中的这个脚本;这是我的PHP脚本的本质,我们称之为mytest.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";
编辑:请注意,该命令也可以只是:
$cmdline = "xvfb-run $nodeModPath/casperjs/bin/casperjs --engine=slimerjs --debug=true 2>&1";
...也就是说,没有列出任何JS脚本 - 在这种情况下应该转储帮助(在CLI访问的情况下 - 但是在通过Web服务器访问时报告的错误与下面相同)
当我从终端命令行(通过SSH)运行此PHP脚本时,即通过CLI以CLI模式运行:
$ php mytest.php
......一切顺利,没有任何问题。
但是,当我通过网络服务器在线调用此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]
所以,当通过网络服务器调用PHP时,显然我的无头Firefox不想运行(在这种情况下,PHP报告它使用apache2handler
SAPI)。
有谁知道为什么会发生这种情况 - 如何在从Web服务器调用时让脚本正常执行,就像在PHP CLI模式下运行一样?
编辑2:现在也可以通过CLI模式重建此错误,并且可以确认它是由用户决定的;所以如果$command
中没有提供任何JS脚本,我会得到这个:
$ 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
答案 0 :(得分:5)
嗯,这是一个令人讨厌的问题。在运行完整strace
时,我最终为root
用户和www-data
用户执行slimerjs
并比较日志(可以通过以下方式找到完整的命令行)将echo
es添加到/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
是/var/www
,它似乎没有写入权限!
所以,对我来说最简单的事情是" hack" $HOME
脚本中的mytest.php
环境变量,并将其设置为/tmp
,其中www-data
肯定具有写入权限:
...
putenv("SLIMERJSLAUNCHER=/usr/bin/firefox46");
putenv("HOME=/tmp");
...
...和whaddayaknow,最后脚本也在CLI的www-data
用户下工作:
$ 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
...
顺便说一下,这个.innophi
目录似乎也在https://docs.slimerjs.org/current/configuration.html#profiles中提到,