[fpc-pascal] How to use FCGI in threaded mode?
Michael Van Canneyt
michael at freepascal.org
Mon Feb 16 11:23:25 CET 2015
On Sun, 15 Feb 2015, silvioprog wrote:
> On Sun, Feb 15, 2015 at 7:11 AM, Michael Van Canneyt <michael at freepascal.org> wrote:
> Very nice.
> Some remarks:
> - KeepConnection logic already existed. It is part of the fastcgi protocol.
> Normally, the apache server must send a keepconnection option as part of the request.
> See the 'FKeepConnectionAfterRequest' variable in TFCGIrequest, it is processed when
> the FCGI_BEGIN_REQUEST block comes in and is checked after each request.
> The fact that you apparently needed to introduce special processing means the proxy
> module does not correctly set this option. To test, you can check the value of the flag
> in the request handler.
> I also suggest you look at the existing implementation of KeepConnection and see
> where that needs to be changed, instead of introducing new KeepConnection handling.
> I saw, and it works fine in nginx, but ...
> - if you really need to introduce an additional flag, please put an extra flag in
> ProtocolOptions. Something like 'poDefaultKeepConnection'.
> Do not introduce new booleans 'options' when an option set exists...
> ... in Apache, using proxy mode, keepconn always returns true. =/ So we need to add a 'poProxyKeepConnection' flag.
Wait, I do not understand.
If keepconn always returns true, then all should work as-is ? Why do you need the flag ?
What happens if you set enablereuse=off in the apache config ?
> - Don't change the constructor signature, that is bad practice.
> A TComponent constructor must be Create(AOwner : TComponent);
> if you really want to change it, just create another one:
> Constructur CreateCustom(AOwner : TComponent; KeepConnection : Boolean);
> For components, properties must always be settable after create,
> otherwise streaming does not work correctly.
> Done. Please see the code in attached (some changes in mycustfcgi too).
> After your tips, now I'm able to implement the changes in original custfcgi and send a patch. One more question before continuing: after implementing the pool, we will still need RequestsArray?
Normally yes, even more so than in the current implementation.
IMHO you will maybe need 2 arrays: Incoming (request), outgoing(response).
- New Request comes in.
- No thread to handle request is available in pool.
- Request is accepted and put in incoming requestsarray.
- Check outgoing response array, send back any responses.
- When Thread finishes a request, puts it in outgoing responses array.
Details will depend heavily on the way the pool is handled.
More information about the fpc-pascal