mod_fastcgi
Apacheとfcgapp.h
APIを使用して FastCGI アプリケーションを開発しています。これまでのところすべてが機能していますが、中止された接続を検出できません。ユーザーがリクエストを中止したときに中止しなければならない高価な操作を行うことがあるため、それらを制御する必要があります。
ドキュメントに示されているように SIGPIPE を使用しようとしていますが、機能していないようです。
私の問題を示すために縮小されたテスト ケースを作成しました。
#include <iostream>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <fstream>
#include "fcgio.h"
using namespace std;
void signal_handler(int signo) {
cerr << "SIGNAL RECEIVED: " << signo << endl;
}
int main(void) {
streambuf * cin_streambuf = cin.rdbuf();
streambuf * cout_streambuf = cout.rdbuf();
streambuf * cerr_streambuf = cerr.rdbuf();
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_handler = signal_handler;
sa.sa_flags = 0;
sigaction(SIGPIPE, &sa, NULL);
sigaction(SIGUSR1, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
FCGX_Request request;
int socketfd = FCGX_OpenSocket("/home/guillermo/fastcgi/socket", 10);
FCGX_Init();
FCGX_InitRequest(&request, socketfd, 0);
while (FCGX_Accept_r(&request) == 0) {
fcgi_streambuf cin_fcgi_streambuf(request.in);
fcgi_streambuf cout_fcgi_streambuf(request.out);
fcgi_streambuf cerr_fcgi_streambuf(request.err);
cin.rdbuf(&cin_fcgi_streambuf);
cout.rdbuf(&cout_fcgi_streambuf);
cerr.rdbuf(&cerr_fcgi_streambuf);
sleep(5);
cout << "Content-type: text/html\r\n"
<< "\r\n"
<< "<html>\n"
<< " <head>\n"
<< " <title>Hello, World!</title>\n"
<< " </head>\n"
<< " <body>\n"
<< " <h1>Hello!</h1>\n"
<< " </body>\n"
<< "</html>\n";
cerr << "All right" << endl;
}
cin.rdbuf(cin_streambuf);
cout.rdbuf(cout_streambuf);
cerr.rdbuf(cerr_streambuf);
return 0;
}
次の 2 つの異なる構成を試してみましたmod_fastcgi
。
FastCGIExternalServer $file -socket $socket
FastCGIServer $file -socket $socket
接続を中止するかどうかに関係なく、5 秒後に Apache エラー ログに常に「問題ありません」と表示されます。curl (Ctrl-C) とさまざまなブラウザー (停止ボタン)、および Javascript の XMLHttpRequest.abort (実際のシナリオ) でテストしました。
これは私のシステム構成です:
- Linux デビアン 3.2.46-1 x86_64
- アパッチ2 (2.2.22-13)
- mod_fastcgi (2.4.1-SNAP-0910052249)