FastCGI c++存储请求

FastCGI c++ store requests?

本文关键字:请求 存储 c++ FastCGI      更新时间:2023-10-16

我需要使用fastcgi和c++进行任何应用。一个不同于FCGX_Accept_r(…)循环的线程是进行处理的线程,所以我希望我可以在请求进入队列时存储它们,并让第二个线程在每个请求的输出流上发送响应。这就是我到目前为止得到的。

void Listen(){
    FCGX_Request request;
    FCGX_InitRequest(&request, 0, 0);
    while(FCGX_Accept_r(&request)>= 0)
    {
        AddRequest(request); //just adds it to a std::queue<FCGX_Request> queue
        request = *NewRequest();
    }
}
FCGX_Request* NewRequest()
{
    FCGX_Request* request;
    request = new FCGX_Request();
    FCGX_InitRequest(request, 0, 0);
    return request;
}

第二个线程只是检查队列中是否有内容(它们都共享)。如果有请求,它将执行任何操作,并且应该打印响应并调用FCGX_Finish_r(&request)。当我打印输出时,应用程序不会崩溃,但nginx在错误文件中放入了错误"上游读取响应头时过早关闭FastCGI stdout"。我真的不确定发生了什么。也许这与FCGX_Request中的输出流是一个指针有关。

如果我取消注释行

request = *NewRequest();

它可以打印响应,但如果我每次都不能将请求重新初始化为新的请求,那么我就不能将它们存储在队列中。

如何将这些FCGX_Requests问题存储在队列中,以供另一个线程处理?感谢

这样做:

void Listen(){
    FCGX_Request *request = NewRequest();
    while(FCGX_Accept_r(request)>= 0)
    {
        // Make your queue hold pointers
        AddRequest(request); //just adds it to a std::queue<FCGX_Request*> queue
        request = NewRequest();
    }
}
FCGX_Request* NewRequest()
{
    FCGX_Request* request = new FCGX_Request();
    FCGX_InitRequest(request, 0, 0);
    return request;
}

处理完这些请求后,不要忘记删除它们。