Agreed. I'm against applying this patch.
At 09:13 AM 12/3/2004 +0300, Dmitry Stogov wrote:
libfcgi that is used by PHP CGI SAPI uses SIGUSR1 for graceful restart. This feature are used by some FastCGI front-ends, mod_fastcgi for example (see notes section on http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html) Your patch breaks this.
Also it can break scripts that require more then PHP_FCGI_TIMEOUT time for execution.
At least, FastCGI front-ends have ability to kill dynamic servers by himself, so why we need to implement this functionality in PHP?
Thanks. Dmitry.
> -----Original Message----- > From: Christer Holgersson [mailto:[EMAIL PROTECTED] > Sent: Thursday, December 02, 2004 11:24 > To: Andi Gutmans > Cc: [EMAIL PROTECTED] > Subject: Re: [PHP-DEV] [PATCH] PHP_FCGI_TIMEOUT > > > > Currently apache and lighttpd. Both are feasible to patch, > but I looked into adding this functionality to lighttpd, and > that would require a more complicated patch than this, so this won ;-) > > As you said, it is not the end of the world. I am quite happy > to patch PHP myself when needed, but thought I'd share this > in case someone else has the same needs. If you do not want > it enabled in the mainline version maybe making it "#ifdef > PHP_FCGI_TIMEOUT" > would be an idea? > > Cheers, > /C > > > On Thu, Dec 02, 2004 at 12:08:37AM -0800, Andi Gutmans wrote: > > What front-end are you using? Look it's not the end of the > world but > > you're > > the first person who seems to have wanted this and I don't > see dozens of > > front-ends being patched to support this. I think it's > quite esoteric and I > > don't like seeing more and more patches, even if they don't > do anything > > under normal circumstances, if they aren't clearly advantageous. > > Anyway, maybe talk a bit more about what front-ends you see > this being used > > with and so on and maybe the need will be clearer. > > Thanks. > > > > At 09:04 AM 12/2/2004 +0100, Christer Holgersson wrote: > > > > >Yes, it could be implemented that way too, but it would require a > > >patch to all the different front-ends you might be using > instead of > > >one simple patch to the backend. You might also have a > front-end that > > >you do not have the source for, and thus cannot patch. > > > > > >I consider it a worthwhile patch. It is extremely simple, and does > > >not do anyhing unless the PHP_FCGI_TIMEOUT environment variable is > > >set. Summary: it is simply much easier to add this > functionality here > > >than anywhere else as I see it. > > > > > >Cheers, > > > /Chris > > > > > >On Wed, Dec 01, 2004 at 11:35:17PM -0800, Andi Gutmans wrote: > > >> I must be missing something. Again, why shouldn't this > be the job > > >> of whatever is running the FastCGI stuff? So what if it's a web > > >> frontend? It should be able to kill the mother implementation so > > >> that it also kills > > >its > > >> children. > > >> > > >> At 08:27 AM 12/2/2004 +0100, Christer Holgersson wrote: > > >> > > >> >If you are running the FastCGI version of PHP it will > start up a > > >> >number (default 8) of "child" PHP interpretors that will wait > > >> >around indefinitely for work to do, and the "mother" FastCGI > > >> >process will automatically restart any process that terminates > > >> >(and automatically restart every child after a default of 500 > > >> >requests). > > >> > > > >> >If you are using a web frontend that dynamically starts the > > >> >FastCGI processes when needed it is totally unnecessary for the > > >> >FastCGI:s to hang around when there is no demand for them, thus > > >> >this patch. It will terminate the mother FastCGI and > all children > > >> >after PHP_FASTCGI_TIMEOUT seconds with no request to any of the > > >> >children, and whenever there is demand for the FastCGI > again the > > >> >web frontend will restart the processes. > > >> > > > >> >This is excellent if you have a lot of scripts that are seldom > > >> >invoked, but that you want to run as FastCGI:s when there is > > >> >actual demand for them, and that are chroot:ed so that > you have a > > >> >diffent FastCGI PHP started for each of them. In this case you > > >> >_do_ want them to self-termninate when there is no demand. > > >> > > > >> >Cheers, > > >> > /C > > >> > > > >> >On Wed, Dec 01, 2004 at 04:18:37PM -0800, Andi Gutmans wrote: > > >> >> I don't see why this patch is needed. It's the FastCGI > > >implementation's > > >> >job > > >> >> to do the right thing and terminate the processes > according to > > >> >> some > > >> >kind of > > >> >> strategy. The FCGI processes shouldn't self destruct. > > >> >> > > >> >> Andi > > >> >> > > >> >> At 07:11 PM 12/1/2004 +0100, Christer Holgersson wrote: > > >> >> > > >> >> >Included is a patch that adds a PHP_FCGI_TIMEOUT that works > > >> >> >somewhat akin to PHP_FCGI_MAX_REQUESTS. With > PHP_FCGI_TIMEOUT > > >> >> >set to 300 the whole fcgi process will terminate > after 300 sec > > >> >> >with no request to any of the worker children - > great for those > > >> >> >seldom used dynamically created fcgi scripts. > > >> >> > > > >> >> >Cheers, > > >> >> > /Chris > > >> >> > > > >> >> >PS. The patch works just as well in 5.0.2 as in 4.3.9. > > >> >> > > > >> >> > > > >> >> >diff -rub php-4.3.9/sapi/cgi/cgi_main.c > > >> >php-4.3.9-ada/sapi/cgi/cgi_main.c > > >> >> >--- php-4.3.9/sapi/cgi/cgi_main.c 2004-07-15 > 00:38:18.000000000 > > >> >+0200 > > >> >> >+++ php-4.3.9-ada/sapi/cgi/cgi_main.c 2004-12-01 > 09:00:58.595259999 > > >> >+0100 > > >> >> >@@ -946,6 +946,24 @@ > > >> >> > /* We should exit at this point, but MacOSX doesn't > > >> >> >seem to > > >*/ > > >> >> > exit( 0 ); > > >> >> > } > > >> >> >+ > > >> >> >+ > > >> >> >+static int php_fcgi_timeout = 0; > > >> >> >+ > > >> >> >+static void reset_timeout() > > >> >> >+{ > > >> >> >+ alarm(php_fcgi_timeout); > > >> >> >+ /* fprintf(stderr, "FastCGI: reset timeout\n"); */ > > >> >> >+ signal(SIGUSR1, reset_timeout); > > >> >> >+} > > >> >> >+ > > >> >> >+static void handle_timeout() > > >> >> >+{ > > >> >> >+ /* fprintf(stderr, "FastCGI: timeout\n"); */ > > >> >> >+ fastcgi_cleanup(SIGALRM); > > >> >> >+ exit(0); > > >> >> >+} > > >> >> >+ > > >> >> > #endif > > >> >> > > > >> >> > /* {{{ main > > >> >> >@@ -980,6 +998,7 @@ > > >> >> > #endif > > >> >> > > > >> >> > #if PHP_FASTCGI > > >> >> >+ int php_fcgi_pid = getpid(); > > >> >> > int max_requests = 500; > > >> >> > int requests = 0; > > >> >> > int fastcgi = !FCGX_IsCGI(); > > >> >> >@@ -1178,6 +1197,20 @@ > > >> >> > } > > >> >> > } > > >> >> > > > >> >> >+ /* How long all children can be idle before > > >terminating > > >> >*/ > > >> >> >+ if( getenv( "PHP_FCGI_TIMEOUT" )) { > > >> >> >+ php_fcgi_timeout = atoi( getenv( > > >> >> >"PHP_FCGI_TIMEOUT" )); > > >> >> >+ if( !php_fcgi_timeout ) { > > >> >> >+ fprintf( stderr, > > >> >> >+ "PHP_FCGI_TIMEOUT is > > >> >> >+ not > > >> >valid\n" > > >> >> >); > > >> >> >+ return FAILURE; > > >> >> >+ } > > >> >> >+ /* [EMAIL PROTECTED]: children signal > > >> >> >+ parent > > >when > > >> >> >they do work, */ > > >> >> >+ /* which resets the > timeout value */ > > >> >> >+ signal(SIGALRM, handle_timeout); > > >> >> >+ signal(SIGUSR1, reset_timeout); > > >> >> >+ } > > >> >> >+ > > >> >> > /* make php call us to get _ENV vars */ > > >> >> > php_php_import_environment_variables = > > >> >> >php_import_environment_variables; > > >> >> > php_import_environment_variables = > > >> >> >cgi_php_import_environment_variables; > > >> >> >@@ -1305,6 +1338,8 @@ > > >> >> > > > >> >> > while (!fastcgi > > >> >> > || FCGX_Accept_r( &request ) >= 0) { > > >> >> >+ /* [EMAIL PROTECTED]: let > parent know we > > >> >> >+ have > > >> >work to > > >> >> >do */ > > >> >> >+ if (php_fcgi_timeout) > > >> >> >+ kill(php_fcgi_pid, > > >> >SIGUSR1); > > >> >> > #endif > > >> >> > > > >> >> > #if PHP_FASTCGI > > >> >> > > > >> >> >-- > > >> >> >PHP Internals - PHP Runtime Development Mailing List To > > >> >> >unsubscribe, visit: http://www.php.net/unsub.php > > >> >> > > > > -- > Christer Holgersson > CTO, Ardendo AB > www.ardendo.se > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > >
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php