Оптимизация Perl-скрипта - PullRequest
0 голосов
/ 12 мая 2011


Можно ли сделать этот скрипт быстрее?

#!/usr/bin/perl -w
    use strict;
    use CGI;
    package SwitchGUI;

    sub new {
        my ($classe, $nom, $nbports, $gio) = @_;

        my $this = {
            "nom"     => $nom,
            "nbports" => $nbports,
            "gio"     => $gio
        };

        bless($this, $classe);
        $this->afficher();
        return $this;   
    }

    sub afficher {
        my ($this) = @_;
        my @tab = ( 1 .. $this->{nbports} );
        my @odd = grep { $_ % 2 } @tab;
        my @even = grep { not $_ % 2 } @tab;

        my $cgi = new CGI;
        my $i;
        my $j;

        print "<div id=\"$this->{nom}\" class=\"switch\">\n";
        print $cgi->h2("$this->{nom}");

        print "<div class=\"ports\">";
        for my $port (@odd) {
            my $res = `perl ifname-index.pl -h $this->{nom} -i FastEthernet0/$port -c reseau`;

            if ($res =~ /^Erreur /) {
                print $cgi->img({
                src => 'ressources/interface_haut_down.png',  
                alt => "port n°$port",
                }), "\n",
            }
            else {
                print $cgi->a({class=>"tooltip", title=>$res},$cgi->img({
                src => 'ressources/interface_haut_up.png',  
                alt => "port n°$port",
                }), "\n",)
            }
        }

        print "<br/>";
        for my $port (@even) {
            my $res = `perl ifname-index.pl -h $this->{nom} -i FastEthernet0/$port -c reseau`;      
            if ($res =~ /^Erreur/) {
                print $cgi->img({
                src => 'ressources/interface_bas_down.png',  
                alt => "port n°$port",
                }), "\n",
            }
            else {
                if ($this->getDuplex($res)!="Full") {
                    print $cgi->a({class=>"tooltip", title=>$res},$cgi->img({
                    src => 'ressources/interface_bas_duplex.png',  
                    alt => "port n°$port",
                    }), "\n",)
                }
                elsif ($this->getVitesse($res)!="100"){
                    print $cgi->a({class=>"tooltip", title=>$res},$cgi->img({
                    src => 'ressources/interface_bas_speed.png',  
                    alt => "port n°$port",
                    }), "\n",)
                }
                else {
                    print $cgi->a({class=>"tooltip", title=>$res},$cgi->img({
                    src => 'ressources/interface_bas_up.png',  
                    alt => "port n°$port",
                    }), "\n",)
                }
            }
        }
        print "</div>";
        print "<div class=\"gio\">";
        for ($j=0;$j<$this->{gio};$j++) {
            my $req = system("perl ifname-index.pl -h $this->{nom} -i GigabitEthernet0/$j -c reseau &");
            print $cgi->img({
                src => 'ressources/interface_bas_down.png',  
                alt => "port",
                });
        }
        print "</div>\n";

        print "</div>\n";

    }

    1;

Он выполняет сценарий Perl (который использует SNMP для запроса сетевого оборудования) и в зависимости от возврата этого сценария отображает соответствующее изображение и описание. Этот скрипт используется для вызова ajax из другого скрипта cgi.

Мой вопрос: можно ли выполнить несколько сценариев, добавив & или что-то подобное
в конце следующей строки?

my $res = `perl ifname-index.pl -h $this->{nom} -i FastEthernet0/$port -c reseau`;

1 Ответ

7 голосов
/ 12 мая 2011

Хотя я не хочу комментировать такие вещи, как использование CGI и «печать» (в 2011 году это действительно архаично), я прокомментирую две строки:

my $res = `perl ifname-index.pl -h $this->{nom} -i FastEthernet0/$port -c reseau`;
...
my $req = system("perl ifname-index.pl -h $this->{nom} -i GigabitEthernet0/$j -c reseau &");

Начало другогоPerl-процессы действительно замедляют работу.
Вы создаете пакет для отображения HTML, но не для опроса?

Рефакторинг ifname-index.pl для подпрограммы.Итак,

my $res = get_request_interface(name => $this->{nom}, interface => "FastEthernet0/$port");

или пакету (правильный путь) - что-то вроде ...

my $interface = My::Interface::Handler->new();
my $res = $interface->get_request;
...
my $another_result = $interface->get_request;
#etc

И ofc, можно начать больше (несколько) процессов и связи с ними, но решение, вероятно, будет более сложным, чем рефакторинг ifname-index.pl для подпрограммы.(прочитайте это: http://faq.perl.org/perlfaq8.html#How_do_I_start_a_pro)

Суммирование для "классного" приложения - на основе комментариев:

  • создайте веб-страницу, где вы перечисляете интерфейсы, например, строки N-статусадля N портов
  • страница будет отправлять N ajax (параллельные) запросы на сервер о состоянии с помощью javascript
  • сервер выполнит N параллельных SNMP-запросов и отправит N ajax-ответов
  • страница получит ответы от сервера и обновит правильные div

С помощью вышеуказанного способа:

  • пользователь сразу получит веб-страницу
  • страница имеет обратную связь для пользователя - «подождите, я работаю над получением статуса»
  • сервер, выполняющий N параллельных запросов к snmp
  • ajax-ответам, обновляющим страницу по мере их поступления ссервер

Для веб-части лучше всего использовать сервер типа PGSI. Проверьте CPAN, существует несколько таких серверов. Tatsuhiko Miyagawa - это"Герой Perl" в эти дни:)

Ps:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...