7

プログラムで Web ページのスクリーンショットを撮る目的で、phantomJSを使用しています。私の Web サーバーは Linux 64 ビットで動作します。

シナリオ

私のtest.phpファイル

exec('./phantomjs --version', $o, $e);
print_r($o);
echo $e;

ブラウザで開きtest.phpます。私が得る出力は次のとおりです。

1.9.1 // version number
0 // exit code

exec()これは、コマンドを実行でき、phantomJS完全に機能していることを証明しています。

問題

上記のコードを次のように置き換えると:

exec('./phantomjs http://mywebsite.com/test.js', $o, $e);
print_r($o);
echo $e;

出力は次のとおりです。

Array ( ) // empty output
139 // exit code which on investigating turned out to be segmentation fault

私も試しました:

exec('./phantomjs ./test.js', $o, $e); // since phantomjs and test.js are in same folder

しかし、結果は同じでした(segfault)

test.jsコード:

var page = require('webpage').create();
var url = 'http://www.rediff.com/';
page.open(url, function (status) {
    phantom.exit();
});

これにより、完全なパスを の 2 番目の引数として使用するphantomJSと、クラッシュが発生すると思われます。したがって、私が疑問に思っていることは次のとおりです。

  • 私の仮定は正しいですか?
  • それとも、絶対 URL を介しexec()たファイルへのアクセスをブロックしている Web サーバーの制限のためですか?.js
4

4 に答える 4

3

多くの検索とテストの後、次の追加で機能するようになりました。

//throws a lot of errors because searching some libraries
$cmd = 'unset DYLD_LIBRARY_PATH ;';
$cmd.= ' /abs/path/to/phantomjs';
$cmd.= ' /abs/path/to/script.js';

//set environment variable to node source
putenv('PATH=/abs/path/to/node/bin/');

//now exec the cmd and pipe the errors to stdout
exec($cmd.' 2>&1', $output);

//and output the results
print_r($output);

私は最高のサーバー管理者ではないので、すべてを詳細に説明することはできませんが、上記の行は pdf を生成します。うん。

于 2014-02-20T17:42:09.110 に答える
1

同様の問題がありました。PHP + PhantomJS ラスタライズ phantomjs は apache プロセスからの実行を好まないことがわかりました。コマンド ラインから exec コマンドを実行してみてください。

php -r "exec('./phantomjs http://mywebsite.com/test.js', $o, $e); print_r($o); echo $e;"

これが機能する場合、いくつかのオプションがあります。

1.) sudoers を変更して、apache ユーザーに phantomjs バイナリへのパスワードなしの sudo 権限を付与することを提案する人もいます

2.) 私がしたように、スクリプトを cron として実行します。

于 2014-01-28T21:47:57.153 に答える
0

test.jsあるフォルダにtest.php配置するか ( を呼び出す場合exec('./phantomjs ./test.js', $o, $e);)、フル パスを使用してみてください。

于 2013-10-04T18:42:04.710 に答える
0

問題はselinuxにあることがわかりました(現在、すべての本番サーバービルドで標準でデフォルトで無効になっています)。

ファイル /etc/selinux/config で、次を含む行を見つけます。

SELINUX=

これを次のように変更します。

SELINUX=無効

コマンドを実行 (再起動せずにすぐに有効にするため)

/usr/sbin/setenforce 0

于 2015-12-04T02:50:43.207 に答える