Perl: Nginx

Alexandr Gomoliako zzz на zzz.org.ua
Ср Дек 28 15:16:52 UTC 2011


On 12/28/11, Dmitry E. Oboukhov <unera at uvw.ru> wrote:

> ngx_connector "1.2.3.4", 80, 15, sub {
>
> };
> ngx_connector "1.2.3.3", 80, 15, sub {
>
> };
> ngx_connector "1.2.3.5", 80, 15, sub {
>
> };

> в одном из них выясняется что два других нам уже не нужны (если они
> еще не выполнились).  Вопрос как остановить процесс установления
> коннекта?

Внутри:

    ngx_connector "1.2.3.5", 80, 15, sub {
        return NGX_CLOSE  if  $someone_already_responded;
        ...
    };

Этого должно быть достаточно, подключение может происходить успешно,
но возвращать ошибку сразу при попытке отправить данные или получить.
Т.е. все равно нужно ждать дольше.

http://zzzcpan.github.com/nginx-perl/Nginx.html#FLOW_CONTROL

> Или удалить процесс ngx_reader с сокета (и возможно заменить его
> другим)?

Можно переопределять сколько угодно раз, но только явно:

    ngx_reader $c, .. sub {
        ...
        ngx_reader $c, .. sub {
            ...
        };

        return NGX_READ;
    };

Т.е. весь flow будет выстроен в лесенку.
Но лесенка будет маленькая, т.к. ими можно управлять:

    my $min = 10;
    my $max = 10;
    my $timeout = 15;
    my $buf;

    ngx_reader $c, $buf, $min, $max, $timeout, sub {

        if ($something) {
            $min = 50;
            $max = 100;
            $timeout = 5;
            return NGX_READ;
        }
        ...
    };

> и что такое $c? обычный handler? то есть можно ли этим функциям
> подсовывать сокеты, которые открыты из perl'ового кода? Этот вопрос
> как-то не раскрыт остался

Это не сокет, это указатель на ngx_connection_t, который хранит в себе
все остальное.


Подробная информация о списке рассылки nginx-ru