ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
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;


 




Copyright © Lexa Software, 1996-2009.