comparison xml/ru/docs/http/ngx_http_perl_module.xml @ 1251:ac1b01d37929

Perl module: removed info specific to nginx 0.6.22 and earlier.
author Yaroslav Zhuravlev <yar@nginx.com>
date Mon, 14 Jul 2014 20:03:56 +0400
parents 95c3c3bbf1ce
children 31f21c7956dd
comparison
equal deleted inserted replaced
1250:9fbe66ff4f7c 1251:ac1b01d37929
8 <!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> 8 <!DOCTYPE module SYSTEM "../../../../dtd/module.dtd">
9 9
10 <module name="Модуль ngx_http_perl_module" 10 <module name="Модуль ngx_http_perl_module"
11 link="/ru/docs/http/ngx_http_perl_module.html" 11 link="/ru/docs/http/ngx_http_perl_module.html"
12 lang="ru" 12 lang="ru"
13 rev="2"> 13 rev="3">
14 14
15 <section id="summary"> 15 <section id="summary">
16 16
17 <para> 17 <para>
18 Модуль <literal>ngx_http_perl_module</literal> позволяет писать обработчики 18 Модуль <literal>ngx_http_perl_module</literal> позволяет писать обработчики
79 не будут обрабатываться. Поэтому рекомендуется ограничиться операциями, 79 не будут обрабатываться. Поэтому рекомендуется ограничиться операциями,
80 время исполнения которых короткое и предсказуемое, например, обращение 80 время исполнения которых короткое и предсказуемое, например, обращение
81 к локальной файловой системе. 81 к локальной файловой системе.
82 </para> 82 </para>
83 83
84 <para>
85 Нижеописанные проблемы относятся только к версиям nginx до 0.6.22.
86
87 <note>
88 Данные, возвращаемые методами объекта запроса <literal>$r</literal>,
89 имеют только текстовое значение, причём само значение хранится
90 в памяти, выделяемой не Perl, а nginx из собственных пулов.
91 Это позволяет уменьшить число операций копирования в большинстве случаев,
92 однако в некоторых ситуациях это приводит к ошибке.
93 Например, при попытке использования таких значений в числовом контексте
94 рабочий процесс выходит с ошибкой (FreeBSD):
95 <example>
96 nginx in realloc(): warning: pointer to wrong page
97 Out of memory!
98 Callback called exit.
99 </example>
100 или (Linux):
101 <example>
102 *** glibc detected *** realloc(): invalid pointer: ... ***
103 Out of memory!
104 Callback called exit.
105 </example>
106 Обойти такую ситуацию просто: нужно присвоить значение метода
107 переменной, например, такой код
108 <example>
109 my $i = $r->variable('counter') + 1;
110 </example>
111 нужно заменить на
112 <example>
113 my $i = $r->variable('counter');
114 $i++;
115 </example>
116 </note>
117
118 <note>
119 Так как строки внутри nginx в большинстве случаев хранятся без
120 завершающего нуля, то они в таком же виде возвращаются и методами
121 объекта запроса <literal>$r</literal> (исключения составляют методы
122 <literal>$r->filename</literal> и <literal>$r->request_body_file</literal>).
123 Поэтому такие значения нельзя использовать
124 в качестве имени файла и тому подобного.
125 Обойти это можно так же, как в предыдущей ситуации: присвоив значение
126 переменной (при этом происходит копирование данных и добавление необходимого
127 нуля) или же использовав его в выражении, например:
128 <example>
129 open FILE, '/path/' . $r->variable('name');
130 </example>
131 </note>
132
133 </para>
134
135 </section> 84 </section>
136 85
137 86
138 <section id="example" name="Пример конфигурации"> 87 <section id="example" name="Пример конфигурации">
139 88