Я успешно получил Phantomjs для работы на Heroku, но теперь я сталкиваюсь с проблемами с интерфейсом phantomjs- node для node.js(см. https://github.com/sgentle/phantomjs-node).
Когда я пытаюсь инициализировать Phantom, я вижу задержку 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
Проверьте, что ваше приложение появилось, от третьей до последней строки укажет URL-адрес, он должен выглядеть следующим образом:
http://fathomless-ravine-5563.herokuapp.com deployed to Heroku
В случае успеха вы должны увидеть Hello World! в вашем браузере.
Теперь из той же папки, в которой выполняется ваше приложение Heroku:
heroku run node
В приглашении 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);
});
Я пробовал варианты версий node, phantom и т.д. без везения.
Я также пробовал настраиваемый buildpack, который устанавливает переменную DYLD, не смотря на http://github.com/tecnh/heroku-buildpack-nodejs.
Любой, у кого есть Phantom + node, играющий вместе на Heroku, пожалуйста, дайте мне знать. Есть несколько ссылок на это на Stackoverflow, но никто не говорит "Я получил его работать, вот как".