Commit | Line | Data |
---|---|---|
54310121 | 1 | package CGI::Fast; |
2 | ||
3 | # See the bottom of this file for the POD documentation. Search for the | |
4 | # string '=head'. | |
5 | ||
6 | # You can run this file through either pod2man or pod2html to produce pretty | |
7 | # documentation in manual or html file format (these utilities are part of the | |
8 | # Perl 5 distribution). | |
9 | ||
10 | # Copyright 1995,1996, Lincoln D. Stein. All rights reserved. | |
11 | # It may be used and modified freely, but I do request that this copyright | |
12 | # notice remain attached to the file. You may modify this module as you | |
13 | # wish, but if you redistribute a modified version, please attach a note | |
14 | # listing the modifications you have made. | |
15 | ||
c29edf6c | 16 | $CGI::Fast::VERSION='1.07'; |
54310121 | 17 | |
18 | use CGI; | |
19 | use FCGI; | |
20 | @ISA = ('CGI'); | |
21 | ||
22 | # workaround for known bug in libfcgi | |
23 | while (($ignore) = each %ENV) { } | |
24 | ||
25 | # override the initialization behavior so that | |
26 | # state is NOT maintained between invocations | |
27 | sub save_request { | |
28 | # no-op | |
29 | } | |
30 | ||
8f3ccfa2 | 31 | # If ENV{FCGI_SOCKET_PATH} is specified, we maintain a FCGI Request handle |
69c89ae7 JH |
32 | # in this package variable. |
33 | use vars qw($Ext_Request); | |
34 | BEGIN { | |
35 | # If ENV{FCGI_SOCKET_PATH} is given, explicitly open the socket, | |
36 | # and keep the request handle around from which to call Accept(). | |
37 | if ($ENV{FCGI_SOCKET_PATH}) { | |
38 | my $path = $ENV{FCGI_SOCKET_PATH}; | |
39 | my $backlog = $ENV{FCGI_LISTEN_QUEUE} || 100; | |
40 | my $socket = FCGI::OpenSocket( $path, $backlog ); | |
41 | $Ext_Request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, | |
42 | \%ENV, $socket, 1 ); | |
43 | } | |
44 | } | |
45 | ||
54310121 | 46 | # New is slightly different in that it calls FCGI's |
47 | # accept() method. | |
48 | sub new { | |
71f3e297 JH |
49 | my ($self, $initializer, @param) = @_; |
50 | unless (defined $initializer) { | |
69c89ae7 JH |
51 | if ($Ext_Request) { |
52 | return undef unless $Ext_Request->Accept() >= 0; | |
53 | } else { | |
71f3e297 JH |
54 | return undef unless FCGI::accept() >= 0; |
55 | } | |
69c89ae7 | 56 | } |
c29edf6c | 57 | CGI->_reset_globals; |
71f3e297 | 58 | return $CGI::Q = $self->SUPER::new($initializer, @param); |
54310121 | 59 | } |
60 | ||
61 | 1; | |
62 | ||
63 | =head1 NAME | |
64 | ||
65 | CGI::Fast - CGI Interface for Fast CGI | |
66 | ||
67 | =head1 SYNOPSIS | |
68 | ||
69 | use CGI::Fast qw(:standard); | |
70 | $COUNTER = 0; | |
71 | while (new CGI::Fast) { | |
72 | print header; | |
73 | print start_html("Fast CGI Rocks"); | |
74 | ||
75 | h1("Fast CGI Rocks"), | |
76 | "Invocation number ",b($COUNTER++), | |
77 | " PID ",b($$),".", | |
78 | hr; | |
79 | print end_html; | |
80 | } | |
81 | ||
82 | =head1 DESCRIPTION | |
83 | ||
84 | CGI::Fast is a subclass of the CGI object created by | |
85 | CGI.pm. It is specialized to work well with the Open Market | |
86 | FastCGI standard, which greatly speeds up CGI scripts by | |
87 | turning them into persistently running server processes. Scripts | |
88 | that perform time-consuming initialization processes, such as | |
89 | loading large modules or opening persistent database connections, | |
90 | will see large performance improvements. | |
91 | ||
92 | =head1 OTHER PIECES OF THE PUZZLE | |
93 | ||
94 | In order to use CGI::Fast you'll need a FastCGI-enabled Web | |
55b5d700 | 95 | server. See http://www.fastcgi.com/ for details. |
54310121 | 96 | |
97 | =head1 WRITING FASTCGI PERL SCRIPTS | |
98 | ||
99 | FastCGI scripts are persistent: one or more copies of the script | |
100 | are started up when the server initializes, and stay around until | |
101 | the server exits or they die a natural death. After performing | |
102 | whatever one-time initialization it needs, the script enters a | |
103 | loop waiting for incoming connections, processing the request, and | |
104 | waiting some more. | |
105 | ||
106 | A typical FastCGI script will look like this: | |
107 | ||
108 | #!/usr/local/bin/perl # must be a FastCGI version of perl! | |
109 | use CGI::Fast; | |
110 | &do_some_initialization(); | |
111 | while ($q = new CGI::Fast) { | |
112 | &process_request($q); | |
113 | } | |
114 | ||
115 | Each time there's a new request, CGI::Fast returns a | |
116 | CGI object to your loop. The rest of the time your script | |
117 | waits in the call to new(). When the server requests that | |
118 | your script be terminated, new() will return undef. You can | |
119 | of course exit earlier if you choose. A new version of the | |
120 | script will be respawned to take its place (this may be | |
121 | necessary in order to avoid Perl memory leaks in long-running | |
122 | scripts). | |
123 | ||
124 | CGI.pm's default CGI object mode also works. Just modify the loop | |
125 | this way: | |
126 | ||
127 | while (new CGI::Fast) { | |
128 | &process_request; | |
129 | } | |
130 | ||
131 | Calls to header(), start_form(), etc. will all operate on the | |
132 | current request. | |
133 | ||
134 | =head1 INSTALLING FASTCGI SCRIPTS | |
135 | ||
136 | See the FastCGI developer's kit documentation for full details. On | |
137 | the Apache server, the following line must be added to srm.conf: | |
138 | ||
139 | AddType application/x-httpd-fcgi .fcgi | |
140 | ||
141 | FastCGI scripts must end in the extension .fcgi. For each script you | |
142 | install, you must add something like the following to srm.conf: | |
143 | ||
69c89ae7 | 144 | FastCgiServer /usr/etc/httpd/fcgi-bin/file_upload.fcgi -processes 2 |
54310121 | 145 | |
146 | This instructs Apache to launch two copies of file_upload.fcgi at | |
147 | startup time. | |
148 | ||
149 | =head1 USING FASTCGI SCRIPTS AS CGI SCRIPTS | |
150 | ||
151 | Any script that works correctly as a FastCGI script will also work | |
152 | correctly when installed as a vanilla CGI script. However it will | |
153 | not see any performance benefit. | |
154 | ||
69c89ae7 JH |
155 | =head1 EXTERNAL FASTCGI SERVER INVOCATION |
156 | ||
157 | FastCGI supports a TCP/IP transport mechanism which allows FastCGI scripts to run | |
158 | external to the webserver, perhaps on a remote machine. To configure the | |
159 | webserver to connect to an external FastCGI server, you would add the following | |
160 | to your srm.conf: | |
161 | ||
162 | FastCgiExternalServer /usr/etc/httpd/fcgi-bin/file_upload.fcgi -host sputnik:8888 | |
163 | ||
164 | Two environment variables affect how the C<CGI::Fast> object is created, | |
165 | allowing C<CGI::Fast> to be used as an external FastCGI server. (See C<FCGI> | |
166 | documentation for C<FCGI::OpenSocket> for more information.) | |
167 | ||
168 | =over | |
169 | ||
170 | =item FCGI_SOCKET_PATH | |
171 | ||
172 | The address (TCP/IP) or path (UNIX Domain) of the socket the external FastCGI | |
8f3ccfa2 | 173 | script to which bind an listen for incoming connections from the web server. |
69c89ae7 JH |
174 | |
175 | =item FCGI_LISTEN_QUEUE | |
176 | ||
177 | Maximum length of the queue of pending connections. | |
178 | ||
179 | =back | |
180 | ||
181 | For example: | |
182 | ||
183 | #!/usr/local/bin/perl # must be a FastCGI version of perl! | |
184 | use CGI::Fast; | |
185 | &do_some_initialization(); | |
186 | $ENV{FCGI_SOCKET_PATH} = "sputnik:8888"; | |
187 | $ENV{FCGI_LISTEN_QUEUE} = 100; | |
188 | while ($q = new CGI::Fast) { | |
189 | &process_request($q); | |
190 | } | |
191 | ||
54310121 | 192 | =head1 CAVEATS |
193 | ||
194 | I haven't tested this very much. | |
195 | ||
196 | =head1 AUTHOR INFORMATION | |
197 | ||
71f3e297 | 198 | Copyright 1996-1998, Lincoln D. Stein. All rights reserved. |
54310121 | 199 | |
71f3e297 JH |
200 | This library is free software; you can redistribute it and/or modify |
201 | it under the same terms as Perl itself. | |
202 | ||
203 | Address bug reports and comments to: lstein@cshl.org | |
54310121 | 204 | |
205 | =head1 BUGS | |
206 | ||
207 | This section intentionally left blank. | |
208 | ||
209 | =head1 SEE ALSO | |
210 | ||
211 | L<CGI::Carp>, L<CGI> | |
3cb6de81 | 212 | |
54310121 | 213 | =cut |