2016-06-30 3 views
0

내 서버 (Ubuntu 14.04.4 LTS)에는 Firefox가 설치되어 있으며, 헤드리스 Firefox 작동에는 xvfb이, SlimerJS에는 CasperJS가 설치되어 있습니다. 나는 또한 잘 작동 CasperJS 스크립트가 있습니다. PHP에서이 스크립트를 활용하고 싶습니다. 문제는이에 대한 내 PHP 스크립트의 본질이다,의는 mytest.php를 호출하자웹 서버에서 PHP를 통해 SlimerJS + headless Firefox 스크립트를 실행 하시겠습니까?

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 액세스의 경우에도 그렇지만 웹 서버를 통해 액세스 할 때 아래와 같은 오류가보고됩니다)


나는 (SSH를 통해) 터미널 명령 행에서이 PHP 스크립트를 실행하면 3,691,363,210

, 즉 CLI 모드에서 PHP 통해 :

$ php 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를 추가 한 후 : 내가 웹 서버를 통해 온라인으로이 PHP 스크립트를 호출 할 때

그러나, 그게 오류와 첫번째 실패, http://example.com/mytest.php를 통해입니다 이상), 나는 또한이 오류 :

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

그래서, PHP는 웹 서버를 통해 호출 파이어 폭스가 실행하지 않는 분명히 내 헤드리스는 (이 경우, PHP는)가 apache2handler SAPI를 사용하여보고합니다.

왜 이런 일이 일어날 지 아무도 알 수 있습니까? 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 
+1

첫 번째 생각 :'cli' 모드에서 스크립트를 실행하는 파일 권한은 사용자를 실행하지만 웹 서버를 통해 사용자는'www-data'가됩니다. 가능하지? –

+0

사실, @ php-dev,하지만 난 정말 누군지 권한 문제가 될 알아낼 수 없습니다; 여기서 나는'xvfb-run'을 호출합니다. 이것은'casperjs'를 호출하는데, slimerjs를 호출하여 headless Firefox를 호출합니다. 이러한 경우에 권한 오류를 확인하는 방법이 있습니까? 나는'/ var/log/apache2/error-mysite.log'를 시도했지만'shell_exec' 호출이 실패하면'비 객체의 속성을 얻으려는 것'과 같은 PHP 물건 만보고합니다. – sdbbs

+1

'stderr' 출력을'stdout' 또는 파일로 재지향하십시오. –

답변

4

글쎄,이 더러운 문제였다.

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 

이러한 경우 : 나는 (/path/to/slimerjs-0.10.1-pre/slimerjsecho ES를 추가하여 찾을 수있는 전체 명령 줄) 경우 전체 slimerjs를 실행하는 root 사용자와 www-data 사용자에 대한 로그를 strace을 수행하고, 비교 결국 로그가 지금 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이며, 겉으로보기에는 쓰기 권한이 없습니다!

그래서, 나를 위해 쉬운 일이 /tmp,로를 mytest.php 스크립트의 $HOME 환경 변수를 "해킹"을 설정 어디 www-data 확실히 가지고 쓰기 권한 :

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

... 그리고 어떻든 이 .innophi 디렉토리도 언급 할 것으로 보인다 BTW,

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

: 마지막으로 스크립트는 너무 CLI에서 www-data 사용자로 작동 https://docs.slimerjs.org/current/configuration.html#profiles,