2015-12-11 2 views
0

у меня есть это очень простой Mojolicious Lite сценарий:WWW :: Механизируйте :: PhantomJS код в скрипте Mojolicious Lite не работает, когда работает в фоновом режиме

#!/usr/bin/env perl 

use v5.10; 
use WWW::Mechanize::PhantomJS; 
use Mojolicious::Lite; 

my $mech = WWW::Mechanize::PhantomJS->new(); 

$mech->get('http://stackoverflow.com/'); 

get '/test' => sub { 
    my $c = shift; 
    $mech->get("https://stackoverflow.com/questions"); 
    $c->render(template => 'activity'); 
}; 

app->secrets(['test secret']); 
app->start; 


__DATA__ 

@@ activity.html.ep 
<!DOCTYPE html> 
<html> 
    <head><title>Test</title></head> 
    <body><h2>Test</h2></body> 
</html> 

Когда я запустить его с помощью Hypnotoad в режиме переднего плана (hypnotoad -f ./script.pl), а также доступ /test URL - Я получаю тестовую страницу и очистить журналы:

[Fri Dec 11 18:00:23 2015] [info] Listening at "http://*:8080" 
[Fri Dec 11 18:00:23 2015] [info] Manager 3011 started 
[Fri Dec 11 18:00:23 2015] [info] Creating process id file "/home/username/pc_activity/demo_site/hypnotoad.pid" 

Когда я начинаю его с помощью фонового режима (hypnotoad ./script.pl), и получить доступ к /test URL - я получаю «что-то пошло совсем не так " ошибка страницы с метанием хищника.

[Fri Dec 11 17:58:07 2015] [info] Listening at "http://*:8080" 
[Fri Dec 11 17:58:07 2015] [info] Manager 2964 started 
[Fri Dec 11 17:58:07 2015] [info] Creating process id file "/home/username/pc_activity/demo_site/hypnotoad.pid" 
[Fri Dec 11 17:58:14 2015] [error] Error while executing command: get: Server returned error message Can't connect to localhost:8910 

Connection refused at /usr/local/share/perl/5.18.2/LWP/Protocol/http.pm line 47, <DATA> line 49. 
instead of data at /usr/local/share/perl/5.18.2/Selenium/Remote/Driver.pm line 310. 

Оказывается localhost:8910 это настройки по умолчанию для PhanomJS работать на в режиме WebDriver. Что это не на моей машине. Но даже если я начну, а затем получить доступ к URL, я все еще получаю ошибку:

[Fri Dec 11 18:41:01 2015] [error] Error while executing command: get: Server returned error message Variable Resource Not Found - {"headers":{"Accept":"application/json","Connection":"TE, close","Content-Length":"45","Content-Type":"application/json; charset=utf-8","Host":"localhost:8910","TE":"deflate,gzip;q=0.3","User-Agent":"libwww-perl/6.15"},"httpVersion":"1.1","method":"POST","post":"{\"url\":\"https://stackoverflow.com/questions\"}","url":"/session/98799e80-a060-11e5-8907-0b365878087d/url","urlParsed":{"anchor":"","query":"","file":"url","directory":"/session/98799e80-a060-11e5-8907-0b365878087d/","path":"/session/98799e80-a060-11e5-8907-0b365878087d/url","relative":"/session/98799e80-a060-11e5-8907-0b365878087d/url","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/session/98799e80-a060-11e5-8907-0b365878087d/url","queryKey":{},"chunks":["session","98799e80-a060-11e5-8907-0b365878087d","url"]}} instead of data at /usr/local/share/perl/5.18.2/Selenium/Remote/Driver.pm line 310. 

Я думаю, я не понимаю, почему она работает в режиме переднего плана, а не в фоновом режиме Режим. И затем, что я могу сделать, чтобы запустить его в фоновом режиме?

ответ

1

Причина, по которой она не будет работать в фоновом режиме, связана с резьбой. После запуска hypnotoad в фоновом режиме он запускает некоторые процессы.

664161507 46028  1 0 10:34AM ??   0:00.01 script.pl 
664161507 46029 46028 0 10:34AM ??   0:00.08 script.pl 
664161507 46030 46028 0 10:34AM ??   0:00.01 script.pl 
664161507 46031 46028 0 10:34AM ??   0:00.01 script.pl 
664161507 46032 46028 0 10:34AM ??   0:00.01 script.pl 

У них не будет доступа к PhantomJS, который вы создали в родительском процессе. Я не рассматривал, как это сообщение выполняется, но если вы хотите поделиться PhantomJS для своих сотрудников, вам нужно сделать его отдельной услугой.

Однако, если вы хотите иметь PhantomJS для каждого запроса вы можете инициализировать его в запросе, но я не обязательно поощрять такой подход:

get '/test' => sub { 
    my $c = shift; 
    my $mech = WWW::Mechanize::PhantomJS->new(); 
    $mech->get('http://stackoverflow.com/'); 
    $mech->get("https://stackoverflow.com/questions"); 
    $c->render(template => 'activity'); 
}; 
+0

Спасибо! Я попробую это, так как этот сценарий не ожидает много хитов. Причина, по которой я хотел этого заявить, заключалась в том, чтобы иметь возможность входа на сайт (не S.O.) «внешние» запросы, а затем на запросы анализировать вещи на страницах моей учетной записи. Если я инициализирую каждый запрос, мне нужно будет каждый раз заходить в систему. Но тогда, возможно, нет, если я включу сохранение файлов cookie. Я буду играть с ним .... Больше кода для простой вещи, которую я хотел :) – flamey

+0

Вы можете попытаться сделать переменную, которая инициализируется при первом запросе этому ребенку. Это может сделать трюк. то есть '$ mech || = initialize_mech();', а затем 'my $ mech;' без инициализации там, где он есть. – bolav

Смежные вопросы