Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Буферризация POST запрсосов
On Saturday 10 February 2007 17:12, proforg wrote:
> Присоединюсь к вопросу :)
> Как это сделать - и возможно ли вообще ?
У меня сейчас работает такая схема:
В nginx.conf:
client_body_in_file_only clean;
fastcgi_pass_request_body off;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param REQUEST_BODY_FILE $request_body_file;
Для php - патч (в аттаче), который позволяет использовать эту фичу nginx:
POST читается не по fastcgi, а напрямую из сохраненного client_body файла. За
счет этого и получается ускорение. Скриптам это изменение совершенно
прозрачно: если передается переменная REQUEST_BODY_FILE, то php читает POST
из файла, иначе - по старому (fastcgi).
Я полагаю, аналогичным образом можно сделать ускорение upload и при
проксировании, патчить надо mod_php4.c
--
Andrei Nigmatulin
GPG PUB KEY 6449830D
Now I lay me down to sleep(3)
Pray the OS my core to keep
If I die before I wake
Pray the Disk my core to take
--- php-4.4.4/sapi/cgi/cgi_main.c.orig 2006-02-22 18:11:53.000000000 +0300
+++ php-4.4.4/sapi/cgi/cgi_main.c 2006-12-26 18:10:13.000000000 +0300
@@ -80,6 +80,9 @@
#include "php_getopt.h"
#if PHP_FASTCGI
+#include <fcntl.h>
+static int request_body_fd = -1;
+
#include "fcgi_config.h"
#include "fcgiapp.h"
/* don't want to include fcgios.h, causes conflicts */
@@ -93,6 +96,8 @@
static void (*php_php_import_environment_variables)(zval *array_ptr TSRMLS_DC);
+static char *sapi_cgibin_getenv(char *name, size_t name_len TSRMLS_DC);
+
#ifndef PHP_WIN32
/* these globals used for forking children on unix systems */
/**
@@ -360,9 +365,25 @@
while (read_bytes < count_bytes) {
#if PHP_FASTCGI
if (!FCGX_IsCGI()) {
- FCGX_Request *request = (FCGX_Request
*)SG(server_context);
- tmp_read_bytes = FCGX_GetStr( pos,
count_bytes-read_bytes, request->in );
- pos += tmp_read_bytes;
+
+ if (request_body_fd == -1) {
+ char *request_body_filename =
sapi_cgibin_getenv("REQUEST_BODY_FILE", 0 TSRMLS_CC);
+ if (request_body_filename &&
*request_body_filename) {
+ request_body_fd =
open(request_body_filename, O_RDONLY);
+ }
+ }
+
+ /* If REQUEST_BODY_FILE variable is not available - use
old scheme. */
+ /* This branch also executes when sapi_deactivate()
tries to consume all bytes of request. */
+ if (request_body_fd < 0) {
+ FCGX_Request *request = (FCGX_Request
*)SG(server_context);
+ tmp_read_bytes = FCGX_GetStr( pos,
count_bytes-read_bytes, request->in );
+ pos += tmp_read_bytes;
+ }
+ else {
+ tmp_read_bytes = read(request_body_fd,
buffer+read_bytes, count_bytes-read_bytes);
+ }
+
} else {
tmp_read_bytes = read(0, buffer+read_bytes,
count_bytes-read_bytes);
}
@@ -1317,6 +1338,8 @@
#endif
#if PHP_FASTCGI
+ request_body_fd = -1;
+
SG(server_context) = (void *) &request;
#else
SG(server_context) = (void *) 1; /* avoid server_context==NULL
checks */
@@ -1643,6 +1666,9 @@
#if PHP_FASTCGI
fastcgi_request_done:
+ if (request_body_fd != -1) close(request_body_fd);
+
+ request_body_fd = -2;
#endif
{
char *path_translated;
|