POD2-RU-PSGI
view release on metacpan or search on metacpan
lib/POD2/RU/PSGI.pod view on Meta::CPAN
ÑеÑвеÑа, оÑнованного на CGI (или на ÑÑм-Ñо поÑ
ожем).
=item *
C<psgi.nonblocking>: ÐÑлево знаÑение, ÑодеÑжаÑее true, еÑли ÑеÑÐ²ÐµÑ Ð²ÑзÑваеÑ
пÑиложение в неблокиÑÑÑÑем ÑобÑÑийном Ñикле.
=item *
C<psgi.streaming>: ÐÑлево знаÑение, Ñавное true, еÑли ÑеÑÐ²ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ
оÑложенного оÑвеÑа в ÑÑиле callback и поÑокового пиÑÑÑего обÑекÑа.
=back
СеÑÐ²ÐµÑ Ð¸Ð»Ð¸ пÑиложение Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑоÑ
ÑанÑÑÑ Ñвои даннÑе в пеÑеменнÑÑ
окÑÑжениÑ. ÐÑи пеÑеменнÑе B<ÐÐÐÐÐЫ> ÑодеÑжаÑÑ Ð¿Ð¾ менÑÑей меÑе Ð¾Ð´Ð½Ñ ÑоÑкÑ, и иÑ
B<СÐÐÐУÐТ> назÑваÑÑ, наÑÐ¸Ð½Ð°Ñ Ñ ÑникалÑной пÑиÑÑавки.
ÐÑиÑÑавка C<psgi.> заÑезеÑвиÑована Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¾Ñновной ÑпеÑиÑикаÑией
PSGI, а пÑиÑÑавка C<psgix.> заÑезеÑвиÑована Ð´Ð»Ñ Ð¾ÑиÑиалÑно одобÑеннÑÑ
lib/POD2/RU/PSGI.pod view on Meta::CPAN
обÑÐµÐºÑ L<IO::Handle>, они обÑаÑÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ на знаÑение. ÐоÑ
ожим обÑазом
обÑекÑ, пÑедоÑÑавлÑÑÑий аналогиÑнÑй API, B<ÐÐÐÐТ> Ñакже обÑаÑиÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ на
ÑÑÑ ÑпеÑиалÑнÑÑ Ð¿ÐµÑеменнÑÑ, но Ð¾Ñ Ð½ÐµÐ³Ð¾ не ÑÑебÑеÑÑÑ Ð´ÐµÐ»Ð°ÑÑ ÑÑо.
=back
=head2 ÐÑложеннÑй ÐÑÐ²ÐµÑ Ð¸ ÐоÑоковое Тело оÑвеÑа
The PSGI interface allows applications and servers to provide a
callback-style response instead of the three-element array
reference. This allows for a delayed response and a streaming body
(server push).
ÐнÑеÑÑÐµÐ¹Ñ PSGI позволÑÐµÑ Ð¿ÑиложениÑм и ÑеÑвеÑам пÑедоÑÑавлÑÑÑ Ð¾ÑÐ²ÐµÑ Ð² виде
вÑзÑваемой ÑÑнкÑии вмеÑÑо ÑÑÑлки на ÑÑÑÑ
ÑлеменÑнÑй маÑÑив. ÐÑо позволÑеÑ
возвÑаÑаÑÑ Ð¾ÑложеннÑе оÑвеÑÑ Ð¸ поÑоковое Ñело оÑвеÑа (server push).
PSGI ÑеÑвеÑам B<СÐÐÐУÐТ> ÑеализовÑваÑÑ ÑÑÐ¾Ñ Ð¸Ð½ÑеÑÑейÑ, и пеÑеменнаÑ
C<psgi.streaming> должна бÑÑÑ Ñавна true в ÑакиÑ
ÑеÑвеÑаÑ
.
ЧÑÐ¾Ð±Ñ ÑазÑеÑиÑÑ Ð¾ÑложеннÑй оÑвеÑ, пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ B<СÐÐÐУÐТ> возвÑаÑаÑÑ Ð²ÑзÑваемÑÑ
ÑÑнкÑÐ¸Ñ Ð² каÑеÑÑве оÑвеÑа. ÐÑиложение B<ÐÐÐÐТ> пÑовеÑÑÑÑ, ÑÑо пеÑеменнаÑ
C<psgi.streaming> Ñавна true, и возвÑаÑаÑÑÑÑ Ðº непоÑÑедÑÑÐ²ÐµÐ½Ð½Ð¾Ð¼Ñ Ð¾ÑвеÑÑ, еÑли
ÑÑо не Ñак.
This callback will be called with I<another> subroutine reference (referred to
as the I<responder> from now on) as its only argument. The I<responder>
should in turn be called with the standard three element array reference
response. This is best illustrated with an example:
ÐÑа вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана Ñо ÑÑÑлкой наI<дÑÑгÑÑ> ÑÑнкÑÐ¸Ñ (далее
назÑваемÑÑ I<оÑвеÑÑик>) в каÑеÑÑве единÑÑвенного аÑгÑменÑа. I<ÐÑвеÑÑик> должен
в ÑÐ²Ð¾Ñ Ð¾ÑеÑÐµÐ´Ñ Ð±ÑÑÑ Ð²Ñзван Ñо ÑÑандаÑÑнÑм оÑвеÑом в виде ÑÑÑлки на
lib/POD2/RU/PSGI.pod view on Meta::CPAN
1.1: 2010.02.xx
=over 4
=item *
Added optional PSGI keys as extensions: C<psgix.logger> and C<psgix.session>.
=item *
C<psgi.streaming> B<SHOULD> be implemented by PSGI servers, rather than B<MAY>.
=item *
PSGI keys C<psgi.run_once>, C<psgi.nonblocking> and C<psgi.streaming>
B<MUST> be set by PSGI servers.
=item *
Removed C<poll_cb> from writer methods.
=back
=head1 ACKNOWLEDGEMENTS
lib/POD2/RU/PSGI/FAQ.pod view on Meta::CPAN
ÑабоÑаеÑ, но ÑÑо болÑÑе pull, Ñем push, и Ñложно делаÑÑ Ð½ÐµÐ±Ð»Ð¾ÐºÐ¸ÑÑемÑй
ввод/вÑдаÑÑ, еÑли ÑолÑко не иÑполÑзÑеÑÑÑ Coro.
ÐÑли Ð²Ñ Ñ
оÑиÑе делаÑÑ push Ñо ÑÑоÑÐ¾Ð½Ñ ÑеÑвеÑа, где пÑиложение ÑабоÑÐ°ÐµÑ Ð² Ñикле
обÑабоÑки ÑобÑÑий (event loop) и пÑи гоÑовноÑÑи вÑÐ´Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñе клиенÑÑ, ÑледÑеÑ
веÑнÑÑÑ callback Ð´Ð»Ñ Ð¾Ñложенного оÑвеÑа.
# long-poll comet подобное ÑаÑ-пÑиложение
my $app = sub {
my $env = shift;
unless ($env->{'psgi.streaming'}) {
die "ÐÑо пÑиложение ÑÑебÑÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑжки psgi.streaming";
}
return sub {
my $respond = shift;
wait_for_new_message(sub {
my $message = shift;
my $body = [ $message->to_json ];
$respond->([200, ['Content-Type', 'application/json'], $body]);
});
};
};
lib/POD2/RU/PSGI/FAQ.pod view on Meta::CPAN
ÑазÑабоÑÑиком. РболÑÑинÑÑве ÑлÑÑаев ÑÑебÑеÑÑÑ Ð½ÐµÐ±Ð»Ð¾ÐºÐ¸ÑÑÑÑий Ñежим, Ñогда
ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ñикл обÑабоÑки ÑобÑÑий (event loop), как L<AnyEvent>. Также
можно пÑовеÑиÑÑ Ð·Ð½Ð°Ñение C<psgi.nonblocking>, и, еÑли ÑÑо не поддеÑживаеÑÑÑ,
иÑполÑзоваÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÑÑÑий вÑзов.
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑÑÑимиÑÑ ÐºÐ¾Ð½ÑÐµÐ½Ñ (Ð´Ð»Ñ ÑÑÑиминга ÑообÑений ÑеÑез Flash ÑÐ¾ÐºÐµÑ Ð¸Ð»Ð¸
multipart XMLHTTPRequest):
my $app = sub {
my $env = shift;
unless ($env->{'psgi.streaming'}) {
die "ÐÑо пÑиложение ÑÑебÑÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑжки psgi.streaming";
}
return sub {
my $respond = shift;
my $writer = $respond->([200, ['Content-Type', 'text/plain']]);
wait_for_new_message(sub {
my $message = shift;
if ($message) {
$writer->write($message->to_json);
} else {
$writer->close;
lib/POD2/RU/PSGI/FAQ.pod view on Meta::CPAN
ÐÑÑÑ ÑеÑвеÑÑ, коÑоÑÑй поддеÑживаÑÑ Ð½ÐµÐ±Ð»Ð¾ÐºÐ¸ÑÑÑÑий Ñежим (где C<psgi.nonblocking>
Ð¸Ð¼ÐµÐµÑ true знаÑение), но пÑоблема в Ñом, ÑÑо ÑеÑвеÑнÑй ÑÑеймвоÑк ÑовÑем не
обÑзаÑелÑно поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð°ÑинÑ
ÑоннÑй Ñикл обÑабоÑки ÑобÑÑий. ÐапÑимеÑ, в
Catalyst еÑÑÑ Ð¼ÐµÑод C<write> Ñ Ð¾Ð±ÑекÑа оÑвеÑа:
while ($cond) {
$c->res->write($some_stuff);
}
ÐÑо должно ÑÑабоÑаÑÑ Ñ ÑеÑвеÑами поддеÑживаÑÑими C<psgi.streaming> даже еÑли они
блокиÑÑÑÑие, и еÑли они ÑабоÑаÑÑ Ð² Ñежиме неÑколÑкиÑ
пÑоÑеÑÑов
(C<psgi.multiprocess> в знаÑении true).
L<Catalyst::Engine::PSGI> Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑÑÑÐ°Ð½Ð¾Ð²ÐºÑ IO::Handle-подобного
обÑекÑа, коÑоÑÑй Ð¸Ð¼ÐµÐµÑ C<getline> меÑод, пÑÐ¸Ð¼ÐµÑ Ñ L<IO::Handle::Util>
my $io = io_from_getline sub {
return $data; # or undef when done()
};
$c->res->body($io);
Ð ÑÑо ÑабоÑÐ°ÐµÑ Ð²Ð¿Ð¾Ð»Ð½Ðµ ноÑмалÑно Ð´Ð»Ñ ÑÑÑиминга, но ÑÑо ÑкоÑее блокиÑÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑиÑ
(I<pull>), а не аÑинÑ
ÑоннÑй push Ñо ÑÑоÑÐ¾Ð½Ñ ÑеÑвеÑÑ, поÑÑомÑ, опÑÑÑ Ð¶Ðµ, ÑÑоиÑ
бÑÑÑ Ð¾ÑÑоÑожнÑм пÑи запÑÑке пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² неблокиÑÑÑÑем (и не многопÑоÑеÑÑоÑном)
ÑеÑвеÑном окÑÑжении.
ÐжидаеÑÑÑ, ÑÑо бÑдÑÑ Ð¿Ð¾ÑвлÑÑÑÑÑ Ð½Ð¾Ð²Ñе ÑÑеймвоÑки или доÑабаÑÑваÑÑÑÑ
ÑÑÑеÑÑвÑÑÑие, коÑоÑÑе поддеÑживаÑÑ Ð°ÑинÑ
ÑоннÑй и неблокиÑÑÑÑий ÑÑÑиминг
инÑеÑÑейÑ.
=head3 ЯвлÑеÑÑÑ Ð»Ð¸ инÑеÑÑÐµÐ¹Ñ psgi.streaming необÑ
одимÑм Ð´Ð»Ñ ÑеÑвеÑов?
Ðн Ñказан в ÑпеÑиÑикаÑии как B<SHOULD>, поÑÑомÑ, еÑли Ð½ÐµÑ ÑеÑÑÑзной пÑиÑинÑ
оÑказаÑÑÑÑ Ð¾Ñ ÑеализаÑии инÑеÑÑейÑа, вÑем ÑеÑвеÑам ÑекомендÑеÑÑÑ ÑеализовÑваÑÑ
ÑÑÐ¾Ñ Ð¸Ð½ÑеÑÑейÑ.
Тем не менее, еÑли Ð²Ñ ÑеализовÑваеÑе PSGI ÑеÑвеÑ, иÑполÑзÑÑ Perl XS инÑеÑÑейÑ
Ð´Ð»Ñ Ð´Ð¾ÑÑÐ¸Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑималÑной пÑоизводиÑелÑноÑÑи или инÑегÑаÑии Ñ Ð²ÐµÐ±-ÑеÑвеÑами
вÑоде Apache или nginx, или ÑоздаÑÑе окÑÑжение Ñипа "пеÑоÑниÑÑ" (наподобие
Google AppEngine или Heroku), или ÑаÑпÑеделÑннÑÑ Ð¿Ð»Ð°ÑÑоÑмÑ, иÑполÑзÑÑ ÑÑилиÑÑ
вÑоде Gearman, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе не заÑ
оÑеÑÑ ÑеализовÑваÑÑ ÑÑÐ¾Ñ Ð¸Ð½ÑеÑÑейÑ.
( run in 0.543 second using v1.01-cache-2.11-cpan-4d50c553e7e )