]> granicus.if.org Git - php/commitdiff
Avoid multipy allocating of request env
authorXinchen Hui <laruence@gmail.com>
Sat, 23 May 2015 17:07:36 +0000 (01:07 +0800)
committerXinchen Hui <laruence@gmail.com>
Sat, 23 May 2015 17:07:36 +0000 (01:07 +0800)
main/fastcgi.c
main/fastcgi.h
sapi/cgi/cgi_main.c
sapi/fpm/fpm/fpm_main.c

index 356aa1d56d1ba885a18215a0a2e0e3ab5baa090f..7ca3731fcef7ccaf97d0b1b6b41dd1753189b2e6 100644 (file)
@@ -794,10 +794,17 @@ fcgi_request *fcgi_init_request(fcgi_request *req, int listen_socket)
 #ifdef _WIN32
        req->tcp = !GetNamedPipeInfo((HANDLE)_get_osfhandle(req->listen_socket), NULL, NULL, NULL, NULL);
 #endif
+       fcgi_hash_init(&req->env);
 
        return req;
 }
 
+void fcgi_destroy_request(fcgi_request *req) {
+       if (req->env.buckets) {
+               fcgi_hash_destroy(&req->env);
+       }
+}
+
 static inline ssize_t safe_write(fcgi_request *req, const void *buf, size_t count)
 {
        int    ret;
@@ -935,7 +942,6 @@ static int fcgi_read_request(fcgi_request *req)
        req->in_len = 0;
        req->out_hdr = NULL;
        req->out_pos = req->out_buf;
-       fcgi_hash_init(&req->env);
        req->has_env = 1;
 
        if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) ||
@@ -1144,7 +1150,6 @@ void fcgi_close(fcgi_request *req, int force, int destroy)
 {
        if (destroy && req->has_env) {
                fcgi_hash_clean(&req->env);
-               fcgi_hash_destroy(&req->env);
                req->has_env = 0;
        }
 
index 079c25a011148cee6c85a3e0c76c0956d32f64b3..cd18038986f256bae0004fd8aea869d1e6ff783e 100644 (file)
@@ -195,6 +195,7 @@ int fcgi_in_shutdown(void);
 void fcgi_terminate(void);
 int fcgi_listen(const char *path, int backlog);
 fcgi_request* fcgi_init_request(fcgi_request *request, int listen_socket);
+void fcgi_destroy_request(fcgi_request *req);
 void fcgi_set_allowed_clients(char *ip);
 int fcgi_accept_request(fcgi_request *req);
 int fcgi_finish_request(fcgi_request *req, int force_close);
index fd8f66593697fb810b73a68b2a49f925fd4fa5f6..e7b5722368d0acd0c51f95355a830d7078b0cdf2 100644 (file)
@@ -2101,6 +2101,7 @@ consult the installation file that came with this distribution, or visit \n\
                                        break;
                                case 'h':
                                case '?':
+                                       fcgi_destroy_request(&request);
                                        fcgi_shutdown();
                                        no_headers = 1;
                                        SG(headers_sent) = 1;
@@ -2532,6 +2533,7 @@ fastcgi_request_done:
                        }
                        /* end of fastcgi loop */
                }
+               fcgi_destroy_request(&request);
                fcgi_shutdown();
 
                if (cgi_sapi_module.php_ini_path_override) {
index 02ca575ca742db84501ad7d030e00d3d96b52243..373aee5defa9569a0ff659d8f4da133d9fabad00 100644 (file)
@@ -1972,6 +1972,7 @@ fastcgi_request_done:
                        }
                        /* end of fastcgi loop */
                }
+               fcgi_destroy_request(&request);
                fcgi_shutdown();
 
                if (cgi_sapi_module.php_ini_path_override) {