Re: Установить переменную с помощью perl внутри location
Hello! On Thu, Jul 16, 2015 at 03:14:33PM +0300, Daniel Podolsky wrote: При правильном выполнении должен проставиться заголовок X-MY-VAR равный ==, но по факту ставится число 0. Если убрать = из return, то заголовок просто не ставится (видимо, пустая переменная). в перле + - не оператор конкатенации строк, извините. Поработаю К.О.: Это, в частности, означает, что результат 0 - правильный, и всё работает ровно так, как написано. ну и мне кажется, что $outer_variable выполнится раньше, чем код location Нет. Код, который вычисляет значение перловой переменной, выполняется в момент обращения к этой переменной. Т.е., в случае add_header он выполнится только тогда, когда будет делаться add_header - уже в процессе возврата ответа. Отмечу также, что код perl_set выполняется только один раз за запрос, и результат выполнения - кешируется до окончания запроса. Соответственно, ранее звучавшая в этом треде рекомендация сохранять значение с помощью set - избыточна. -- Maxim Dounin http://nginx.org/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Установить переменную с помощью perl внутри location
Всем спасибо. Победил: https://gist.github.com/noff/865d3d043964d099b927 Осталось выяснить, насколько это сильно влияет на скорость обработки запросов (если добавит больше 5ms, то плохо). 2015-07-16 21:32 GMT+03:00 Maxim Dounin mdou...@mdounin.ru: Hello! On Thu, Jul 16, 2015 at 09:10:41PM +0300, Michael Kechinov wrote: [...] При выполнении POST-запросов $r-request_body всегда пустое. Почему? Потому что для чтения тела запроса надо вызывать метод $r-has_request_body(), см. пример в документации тут: http://nginx.org/en/docs/http/ngx_http_perl_module.html#methods -- Maxim Dounin http://nginx.org/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru -- *Michael Kechinov http://linkedin.com/in/mkechinov* | s...@mkechinov.ru | +7 950 0099233 Startups development studio: mkechinov.ru | en http://mkechinov.com Personalization for e-commerce: rees46.com HackDay: hackday.ru Twitter-wall: twijector.com ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Установить переменную с помощью perl внутри location
2015-07-16 0:51 GMT+03:00 Michael Kechinov kechin...@gmail.com: Внутри location делаю вставку perl, в которой что-то рассчитывается и результат нужно передать в переменную внутрь location. Как это можно сделать? http://nginx.org/ru/docs/http/ngx_http_perl_module.html#perl_set английский вариант этой доки, надо сказать, более внятный так вот, perl_set позволяет создать квазипеременную, при упоминании которой в конфиге будет вызываться ваш перловый код. при каждом упоминании. соответственно, если вызвать код надо один раз на запрос - используйте set в сочетании с perl_set ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Установить переменную с помощью perl внутри location
Английская дока, насколько вижу, полностью соответствует русской. Я сделал так, но не работает: http { perl_set $outer_variable ' sub { my $r = shift; return = + $r-variable(inner_variable) + =; } '; location / { perl ' sub { my $r = shift; $r-variable(inner_variable, ); } '; add_header X-MY-VAR $outer_variable; } } При правильном выполнении должен проставиться заголовок X-MY-VAR равный ==, но по факту ставится число 0. Если убрать = из return, то заголовок просто не ставится (видимо, пустая переменная). 2015-07-16 11:12 GMT+03:00 Daniel Podolsky onoko...@gmail.com: 2015-07-16 0:51 GMT+03:00 Michael Kechinov kechin...@gmail.com: Внутри location делаю вставку perl, в которой что-то рассчитывается и результат нужно передать в переменную внутрь location. Как это можно сделать? http://nginx.org/ru/docs/http/ngx_http_perl_module.html#perl_set английский вариант этой доки, надо сказать, более внятный так вот, perl_set позволяет создать квазипеременную, при упоминании которой в конфиге будет вызываться ваш перловый код. при каждом упоминании. соответственно, если вызвать код надо один раз на запрос - используйте set в сочетании с perl_set ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru -- *Michael Kechinov http://linkedin.com/in/mkechinov* | s...@mkechinov.ru | +7 950 0099233 Startups development studio: mkechinov.ru | en http://mkechinov.com Personalization for e-commerce: rees46.com HackDay: hackday.ru Twitter-wall: twijector.com ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Установить переменную с помощью perl внутри location
При правильном выполнении должен проставиться заголовок X-MY-VAR равный ==, но по факту ставится число 0. Если убрать = из return, то заголовок просто не ставится (видимо, пустая переменная). в перле + - не оператор конкатенации строк, извините. ну и мне кажется, что $outer_variable выполнится раньше, чем код location ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Установить переменную с помощью perl внутри location
Видимо да. Вот и ищу способ, как же сделать так, чтобы из location можно было определить переменную, которая будет использована в http. Потому что request_body доступен только в location, а map, который нужно сделать на основании данных в request_body, доступен только в http. 2015-07-16 15:14 GMT+03:00 Daniel Podolsky onoko...@gmail.com: При правильном выполнении должен проставиться заголовок X-MY-VAR равный ==, но по факту ставится число 0. Если убрать = из return, то заголовок просто не ставится (видимо, пустая переменная). в перле + - не оператор конкатенации строк, извините. ну и мне кажется, что $outer_variable выполнится раньше, чем код location ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru -- *Michael Kechinov http://linkedin.com/in/mkechinov* | s...@mkechinov.ru | +7 950 0099233 Startups development studio: mkechinov.ru | en http://mkechinov.com Personalization for e-commerce: rees46.com HackDay: hackday.ru Twitter-wall: twijector.com ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Установить переменную с помощью perl внутри location
Hello! On Thu, Jul 16, 2015 at 09:10:41PM +0300, Michael Kechinov wrote: [...] При выполнении POST-запросов $r-request_body всегда пустое. Почему? Потому что для чтения тела запроса надо вызывать метод $r-has_request_body(), см. пример в документации тут: http://nginx.org/en/docs/http/ngx_http_perl_module.html#methods -- Maxim Dounin http://nginx.org/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru