PhantomjsをHerokuで正常に動作させることができましたが、node.jsのphantomjs-nodeインターフェイスで問題が発生しています(https://github.com/sgentle/phantomjs-nodeを参照)。
ファントムを初期化しようとすると、10〜15秒の遅延が発生します。
> phantom stdout: ReferenceError: Can't find variable: socket
phantom stdout: phantomjs://webpage.evaluate():1
phantomjs://webpage.evaluate():1
phantomjs://webpage.evaluate():1
次の手順で、またはhttps://github.com/matellis/phantom-testでテストアプリをプルダウンすることで、問題を再現できます。
git init phantom-test
cd phantom-test
heroku apps:create
# create node app as per Heroku instructions here https://devcenter.heroku.com/articles/nodejs
# copy bin and lib folders from http://phantomjs.googlecode.com/files/phantomjs-1.6.1-linux-x86_64-dynamic.tar.bz2 into root of your new project
# if you don't do this step you'll get an error "phantom stderr: execvp(): No such file or directory"
git add .
git commit -m "init"
git push heroku
アプリが起動したことをテストします。最後から3行目にURLが表示され、次のように表示されます。
http://fathomless-ravine-5563.herokuapp.com deployed to Heroku
成功した場合は、Hello World!が表示されます。ブラウザで。
これで、Herokuアプリケーションの実行と同じフォルダーから:
heroku run node
ノードプロンプトで、次のことを試してください。
phantom = require('phantom');
x = phantom.create();
10〜15秒待つと、エラーが表示されます。この時点からは何も機能しません。
これはファイルを出力するはずですfoo.png
:
x = phantom.create(function(ph){ph.createPage(function(page){ page.open('http://bbcnews.com', function(status){ page.render('foo.png', function(result) {ph.exit()}); }); }); });
PhantomjsがHerokuで正常に動作していることを検証するには、テストプロジェクトを使用して次のことを試してください。
>heroku run bash
Running `bash` attached to terminal... up, run.1
~ $ phantomjs test.js http://bbcnews.com foo.png
~ $ ls *.png
foo.png
これらの問題をローカルで再現することはできませんが、他の問題が報告されており、人々がこの問題をローカルで発生させた可能性があります。
問題はshim.js
1637行目で発生しているようです。
s.on('request', function(req) {
var evil;
evil = "function(){socket.emit('message', " + (JSON.stringify(JSON.stringify(req))) + " + '\\n');}";
return controlPage.evaluate(evil);
});
ノードやファントムなどのバージョンのバリエーションを試してみましたが、うまくいきませんでした。
また、DYLD変数を設定するカスタムビルドパックも試しました。http://github.com/tecnh/heroku-buildpack-nodejsも参照してください。
Phantom + NodeをHerokuでうまく一緒にプレイしている人は、私に知らせてください。Stackoverflowにはこれに関するいくつかの言及がありますが、「動作させました。方法は次のとおりです」とは誰も言っていません。