Auf meinem Server (Ubuntu 14.04.4 LTS) habe ich einen Firefox installiert, sowie xvfb
für den kopflosen Firefox-Betrieb und CasperJS mit SlimerJS. Ich habe auch ein CasperJS-Skript, das gut funktioniert. Ich möchte dieses Skript von PHP verwenden; Das ist die Essenz meines PHP-Skript für diese, machen sie es mytest.php
nennen:Ein SlimerJS + kopfloses Firefox-Skript über PHP auf dem Webserver ausführen?
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: Beachten Sie, dass der Befehl auch nur sein könnte:
$cmdline = "xvfb-run $nodeModPath/casperjs/bin/casperjs --engine=slimerjs --debug=true 2>&1";
... das ist , ohne dass ein JS-Skript aufgeführt ist - in diesem Fall sollte die Hilfe ausgegeben werden (und im Fall von CLI-Zugriff - aber der gleiche Fehler wie unten beim Zugriff über den Webserver gemeldet wird)
Wenn ich diesen PHP-Skript von der Terminal-Befehlszeile (per SSH) ausführen, das ist durch PHP im CLI-Modus:
$ php mytest.php
... alles gut läuft, gibt es überhaupt kein Problem.
Allerdings, wenn ich dieses PHP-Skript online über die Web-Server aufrufen, ist, dass über http://example.com/mytest.php
, es nicht zuerst mit dem Fehler:
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
... und nach --debug=true
Zugabe (wie bereits im Beispiel enthalten oben), habe ich diesen Fehler zusätzlich erhalten:
JavaScript error: resource://gre/modules/FileUtils.jsm, line 63: NS_ERROR_FAILURE: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIProperties.get]
Also, anscheinend meine kopflos Firefox will nicht laufen, wenn PHP durch den Webserver aufgerufen wird (in diesem Fall, berichtet PHP, dass es die apache2handler
SAPI verwendet).
Wüsste jemand, warum das passiert - und wie kann ich das Skript korrekt ausführen, wenn es von einem Webserver aufgerufen wird, genau so wie es im PHP CLI-Modus ausgeführt wird?
EDIT 2: Kann diesen Fehler nun auch über den CLI-Modus rekonstruieren und kann bestätigen, dass dies auf den Benutzer zurückzuführen ist; so ohne JS Skript im $command
zur Verfügung gestellt, bekomme ich diese:
$ 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
Erste Gedanken: Dateien Berechtigungen wie das Ausführen des Skripts im 'CLI' Modus wird der Benutzer es ausführen, aber über den Webserver wird der Benutzer 'www-Daten'. Möglich, nicht wahr? –
In der Tat, @ php-dev, aber ich kann nicht wirklich herausfinden, wessen Berechtigungen das Problem sein würde; hier rufe ich 'xvfb-run' an, das' casperjs' aufruft, das 'slimerjs' aufruft, das kopflosen Firefox aufruft. Gibt es eine Möglichkeit, irgendwo in diesem Fall nach Berechtigungsfehlern zu suchen? Ich habe versucht '/ var/log/apache2/error-mysite.log', aber es meldet nur PHP-Sachen wie' Versuch, Eigenschaft von Nicht-Objekt zu bekommen', wenn der 'shell_exec'-Aufruf fehlschlägt. – sdbbs
Versuchen Sie, 'stderr' Ausgabe in' stdout' oder eine Datei umzuleiten. –