tony2001 Wed, 02 Dec 2009 15:05:12 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=291594
Log: add missing patch for fpm(cgi)_main.c Changed paths: U php/php-src/branches/PHP_5_3_FPM/sapi/fpm/fpm/fastcgi.c U php/php-src/branches/PHP_5_3_FPM/sapi/fpm/fpm/fastcgi.h U php/php-src/branches/PHP_5_3_FPM/sapi/fpm/fpm/fpm_main.c
Modified: php/php-src/branches/PHP_5_3_FPM/sapi/fpm/fpm/fastcgi.c =================================================================== --- php/php-src/branches/PHP_5_3_FPM/sapi/fpm/fpm/fastcgi.c 2009-12-02 13:56:50 UTC (rev 291593) +++ php/php-src/branches/PHP_5_3_FPM/sapi/fpm/fpm/fastcgi.c 2009-12-02 15:05:12 UTC (rev 291594) @@ -249,6 +249,11 @@ } } +void fcgi_set_is_fastcgi(int new_value) +{ + is_fastcgi = new_value; +} + void fcgi_set_in_shutdown(int new_value) { in_shutdown = new_value; @@ -875,7 +880,7 @@ return n; } -static inline void fcgi_close(fcgi_request *req, int force, int destroy) +void fcgi_close(fcgi_request *req, int force, int destroy) { if (destroy && req->env) { zend_hash_destroy(req->env); Modified: php/php-src/branches/PHP_5_3_FPM/sapi/fpm/fpm/fastcgi.h =================================================================== --- php/php-src/branches/PHP_5_3_FPM/sapi/fpm/fpm/fastcgi.h 2009-12-02 13:56:50 UTC (rev 291593) +++ php/php-src/branches/PHP_5_3_FPM/sapi/fpm/fpm/fastcgi.h 2009-12-02 15:05:12 UTC (rev 291594) @@ -121,8 +121,10 @@ int fcgi_accept_request(fcgi_request *req); int fcgi_finish_request(fcgi_request *req, int force_close); +void fcgi_set_is_fastcgi(int new_value); void fcgi_set_in_shutdown(int); void fcgi_set_allowed_clients(char *); +void fcgi_close(fcgi_request *req, int force, int destroy); char* fcgi_getenv(fcgi_request *req, const char* var, int var_len); char* fcgi_putenv(fcgi_request *req, char* var, int var_len, char* val); Modified: php/php-src/branches/PHP_5_3_FPM/sapi/fpm/fpm/fpm_main.c =================================================================== --- php/php-src/branches/PHP_5_3_FPM/sapi/fpm/fpm/fpm_main.c 2009-12-02 13:56:50 UTC (rev 291593) +++ php/php-src/branches/PHP_5_3_FPM/sapi/fpm/fpm/fpm_main.c 2009-12-02 15:05:12 UTC (rev 291594) @@ -63,6 +63,10 @@ # include <sys/wait.h> #endif +#if HAVE_FCNTL_H +# include <fcntl.h> +#endif + #include "zend.h" #include "zend_extensions.h" #include "php_ini.h" @@ -91,6 +95,14 @@ #include "fastcgi.h" +#ifdef FPM_AUTOCONFIG_H +#include <fpm_autoconfig.h> +#else +#include <php_config.h> +#endif +#include <fpm/fpm.h> +#include <fpm/fpm_request.h> + #ifndef PHP_WIN32 /* XXX this will need to change later when threaded fastcgi is implemented. shane */ struct sigaction act, old_term, old_quit, old_int; @@ -100,10 +112,6 @@ #ifndef PHP_WIN32 /* these globals used for forking children on unix systems */ -/** - * Number of child processes that will get created to service requests - */ -static int children = 0; /** * Set to non-zero if we are the parent process @@ -122,6 +130,10 @@ static pid_t pgroup; #endif +static int request_body_fd; + +static char *sapi_cgibin_getenv(char *name, size_t name_len TSRMLS_DC); + #define PHP_MODE_STANDARD 1 #define PHP_MODE_HIGHLIGHT 2 #define PHP_MODE_INDENT 3 @@ -134,7 +146,6 @@ static const opt_struct OPTIONS[] = { {'a', 0, "interactive"}, - {'b', 1, "bindpath"}, {'C', 0, "no-chdir"}, {'c', 1, "php-ini"}, {'d', 1, "define"}, @@ -151,6 +162,7 @@ {'w', 0, "strip"}, {'?', 0, "usage"},/* help alias (both '?' and 'usage') */ {'v', 0, "version"}, + {'y', 1, "fpm-config"}, {'z', 1, "zend-extension"}, {'T', 1, "timing"}, {'-', 0, NULL} /* end of args */ @@ -169,6 +181,7 @@ zend_bool impersonate; #endif HashTable user_config_cache; + char *error_header; } php_cgi_globals_struct; /* {{{ user_config_cache @@ -495,7 +508,27 @@ while (read_bytes < count_bytes) { if (fcgi_is_fastcgi()) { fcgi_request *request = (fcgi_request*) SG(server_context); - tmp_read_bytes = fcgi_read(request, buffer + read_bytes, count_bytes - read_bytes); + if (request_body_fd == -1) { + char *request_body_filename = sapi_cgibin_getenv((char *) "REQUEST_BODY_FILE", + sizeof("REQUEST_BODY_FILE")-1 TSRMLS_CC); + + if (request_body_filename && *request_body_filename) { + request_body_fd = open(request_body_filename, O_RDONLY); + + if (0 > request_body_fd) { + php_error(E_WARNING, "REQUEST_BODY_FILE: open('%s') failed: %s (%d)", + request_body_filename, strerror(errno), errno); + return 0; + } + } + } + + /* If REQUEST_BODY_FILE variable not available - read post body from fastcgi stream */ + if (request_body_fd < 0) { + tmp_read_bytes = fcgi_read(request, buffer + read_bytes, count_bytes - read_bytes); + } else { + tmp_read_bytes = read(request_body_fd, buffer + read_bytes, count_bytes - read_bytes); + } } else { tmp_read_bytes = read(STDIN_FILENO, buffer + read_bytes, count_bytes - read_bytes); } @@ -956,6 +989,8 @@ " -s Display colour syntax highlighted source.\n" " -v Version number\n" " -w Display source with stripped comments and whitespace.\n" + " -y, --fpm-config <file>\n" + " Specify alternative path to FastCGI process manager config file.\n" " -z <file> Load Zend extension <file>.\n" " -T <count> Measure execution time of script repeated <count> times.\n", prog, prog); @@ -1390,6 +1425,7 @@ #ifdef PHP_WIN32 STD_PHP_INI_ENTRY("fastcgi.impersonate", "0", PHP_INI_SYSTEM, OnUpdateBool, impersonate, php_cgi_globals_struct, php_cgi_globals) #endif + STD_PHP_INI_ENTRY("fastcgi.error_header", NULL, PHP_INI_SYSTEM, OnUpdateString, error_header, php_cgi_globals_struct, php_cgi_globals) PHP_INI_END() /* {{{ php_cgi_globals_ctor @@ -1408,6 +1444,7 @@ php_cgi_globals->impersonate = 0; #endif zend_hash_init(&php_cgi_globals->user_config_cache, 0, NULL, (dtor_func_t) user_config_cache_entry_dtor, 1); + php_cgi_globals->error_header = NULL; } /* }}} */ @@ -1440,14 +1477,43 @@ */ static PHP_MINFO_FUNCTION(cgi) { + php_info_print_table_start(); + php_info_print_table_row(2, "php-fpm", "active"); + php_info_print_table_row(2, "php-fpm version", PHP_FPM_VERSION); + php_info_print_table_end(); + DISPLAY_INI_ENTRIES(); } /* }}} */ +PHP_FUNCTION(fastcgi_finish_request) /* {{{ */ +{ + fcgi_request *request = (fcgi_request*) SG(server_context); + + if (fcgi_is_fastcgi() && request->fd >= 0) { + + php_end_ob_buffers(1 TSRMLS_CC); + php_header(TSRMLS_C); + + fcgi_flush(request, 1); + fcgi_close(request, 0, 0); + RETURN_TRUE; + } + + RETURN_FALSE; + +} +/* }}} */ + +function_entry cgi_fcgi_sapi_functions[] = { + PHP_FE(fastcgi_finish_request, NULL) + {NULL, NULL, NULL} +}; + static zend_module_entry cgi_module_entry = { STANDARD_MODULE_HEADER, "cgi-fcgi", - NULL, + cgi_fcgi_sapi_functions, PHP_MINIT(cgi), PHP_MSHUTDOWN(cgi), NULL, @@ -1463,16 +1529,12 @@ { int free_query_string = 0; int exit_status = SUCCESS; - int cgi = 0, c, i, len; + int cgi = 0, c; zend_file_handle file_handle; - char *s; /* temporary locals */ - int behavior = PHP_MODE_STANDARD; - int no_headers = 0; int orig_optind = php_optind; char *orig_optarg = php_optarg; - char *script_file = NULL; int ini_entries_len = 0; /* end of temporary locals */ @@ -1482,20 +1544,9 @@ int max_requests = 500; int requests = 0; - int fastcgi = fcgi_is_fastcgi(); - char *bindpath = NULL; int fcgi_fd = 0; fcgi_request request; - int repeats = 1; - int benchmark = 0; -#if HAVE_GETTIMEOFDAY - struct timeval start, end; -#else - time_t start, end; -#endif -#ifndef PHP_WIN32 - int status = 0; -#endif + char *fpm_config = NULL; #if 0 && defined(PHP_DEBUG) /* IIS is always making things more difficult. This allows @@ -1533,18 +1584,6 @@ setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif - if (!fastcgi) { - /* Make sure we detect we are a cgi - a bit redundancy here, - * but the default case is that we have to check only the first one. */ - if (getenv("SERVER_SOFTWARE") || - getenv("SERVER_NAME") || - getenv("GATEWAY_INTERFACE") || - getenv("REQUEST_METHOD") - ) { - cgi = 1; - } - } - while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { switch (c) { case 'c': @@ -1587,17 +1626,71 @@ } break; } - /* if we're started on command line, check to see if - * we are being started as an 'external' fastcgi - * server by accepting a bindpath parameter. */ - case 'b': - if (!fastcgi) { - bindpath = strdup(php_optarg); - } + case 'y': + fpm_config = php_optarg; break; - case 's': /* generate highlighted HTML from source */ - behavior = PHP_MODE_HIGHLIGHT; + + case 'e': /* enable extended info output */ + CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO; break; + + case 'm': /* list compiled in modules */ + cgi_sapi_module.startup(&cgi_sapi_module); + php_output_startup(); + php_output_activate(TSRMLS_C); + SG(headers_sent) = 1; + php_printf("[PHP Modules]\n"); + print_modules(TSRMLS_C); + php_printf("\n[Zend Modules]\n"); + print_extensions(TSRMLS_C); + php_printf("\n"); + php_end_ob_buffers(1 TSRMLS_CC); + exit_status = 0; + goto out; + + case 'i': /* php info & quit */ + cgi_sapi_module.startup(&cgi_sapi_module); + if (php_request_startup(TSRMLS_C) == FAILURE) { + SG(server_context) = NULL; + php_module_shutdown(TSRMLS_C); + return FAILURE; + } + SG(headers_sent) = 1; + SG(request_info).no_headers = 1; + php_print_info(0xFFFFFFFF TSRMLS_CC); + php_request_shutdown((void *) 0); + exit_status = 0; + goto out; + + case 'h': + case '?': + cgi_sapi_module.startup(&cgi_sapi_module); + php_output_startup(); + php_output_activate(TSRMLS_C); + SG(headers_sent) = 1; + php_cgi_usage(argv[0]); + php_end_ob_buffers(1 TSRMLS_CC); + exit_status = 0; + goto out; + + case 'v': /* show php version & quit */ + cgi_sapi_module.startup(&cgi_sapi_module); + if (php_request_startup(TSRMLS_C) == FAILURE) { + SG(server_context) = NULL; + php_module_shutdown(TSRMLS_C); + return FAILURE; + } + SG(headers_sent) = 1; + SG(request_info).no_headers = 1; + +#if ZEND_DEBUG + php_printf("PHP %s (%s) (built: %s %s) (DEBUG)\nCopyright (c) 1997-2009 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); +#else + php_printf("PHP %s (%s) (built: %s %s)\nCopyright (c) 1997-2009 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); +#endif + php_request_shutdown((void *) 0); + exit_status = 0; + goto out; } } php_optind = orig_optind; @@ -1608,9 +1701,6 @@ #endif cgi_sapi_module.executable_location = argv[0]; - if (!cgi && !fastcgi && !bindpath) { - cgi_sapi_module.additional_functions = additional_functions; - } /* startup after we get the above ini override se we get things right */ if (cgi_sapi_module.startup(&cgi_sapi_module) == FAILURE) { @@ -1660,387 +1750,31 @@ } } - if (bindpath) { - fcgi_fd = fcgi_listen(bindpath, 128); - if (fcgi_fd < 0) { - fprintf(stderr, "Couldn't create FastCGI listen socket on port %s\n", bindpath); -#ifdef ZTS - tsrm_shutdown(); -#endif - return FAILURE; - } - fastcgi = fcgi_is_fastcgi(); + if (0 > fpm_init(argc, argv, fpm_config)) { + return FAILURE; } - if (fastcgi) { - /* How many times to run PHP scripts before dying */ - if (getenv("PHP_FCGI_MAX_REQUESTS")) { - max_requests = atoi(getenv("PHP_FCGI_MAX_REQUESTS")); - if (max_requests < 0) { - fprintf(stderr, "PHP_FCGI_MAX_REQUESTS is not valid\n"); - return FAILURE; - } - } - /* make php call us to get _ENV vars */ - php_php_import_environment_variables = php_import_environment_variables; - php_import_environment_variables = cgi_php_import_environment_variables; + fcgi_fd = fpm_run(&max_requests); + parent = 0; + fcgi_set_is_fastcgi(1); - /* library is already initialized, now init our request */ - fcgi_init_request(&request, fcgi_fd); + /* make php call us to get _ENV vars */ + php_php_import_environment_variables = php_import_environment_variables; + php_import_environment_variables = cgi_php_import_environment_variables; -#ifndef PHP_WIN32 - /* Pre-fork, if required */ - if (getenv("PHP_FCGI_CHILDREN")) { - char * children_str = getenv("PHP_FCGI_CHILDREN"); - children = atoi(children_str); - if (children < 0) { - fprintf(stderr, "PHP_FCGI_CHILDREN is not valid\n"); - return FAILURE; - } - fcgi_set_mgmt_var("FCGI_MAX_CONNS", sizeof("FCGI_MAX_CONNS")-1, children_str, strlen(children_str)); - /* This is the number of concurrent requests, equals FCGI_MAX_CONNS */ - fcgi_set_mgmt_var("FCGI_MAX_REQS", sizeof("FCGI_MAX_REQS")-1, children_str, strlen(children_str)); - } else { - fcgi_set_mgmt_var("FCGI_MAX_CONNS", sizeof("FCGI_MAX_CONNS")-1, "1", sizeof("1")-1); - fcgi_set_mgmt_var("FCGI_MAX_REQS", sizeof("FCGI_MAX_REQS")-1, "1", sizeof("1")-1); - } + /* library is already initialized, now init our request */ + fcgi_init_request(&request, fcgi_fd); - if (children) { - int running = 0; - pid_t pid; - - /* Create a process group for ourself & children */ - setsid(); - pgroup = getpgrp(); -#ifdef DEBUG_FASTCGI - fprintf(stderr, "Process group %d\n", pgroup); -#endif - - /* Set up handler to kill children upon exit */ - act.sa_flags = 0; - act.sa_handler = fastcgi_cleanup; - if (sigaction(SIGTERM, &act, &old_term) || - sigaction(SIGINT, &act, &old_int) || - sigaction(SIGQUIT, &act, &old_quit) - ) { - perror("Can't set signals"); - exit(1); - } - - if (fcgi_in_shutdown()) { - goto parent_out; - } - - while (parent) { - do { -#ifdef DEBUG_FASTCGI - fprintf(stderr, "Forking, %d running\n", running); -#endif - pid = fork(); - switch (pid) { - case 0: - /* One of the children. - * Make sure we don't go round the - * fork loop any more - */ - parent = 0; - - /* don't catch our signals */ - sigaction(SIGTERM, &old_term, 0); - sigaction(SIGQUIT, &old_quit, 0); - sigaction(SIGINT, &old_int, 0); - break; - case -1: - perror("php (pre-forking)"); - exit(1); - break; - default: - /* Fine */ - running++; - break; - } - } while (parent && (running < children)); - - if (parent) { -#ifdef DEBUG_FASTCGI - fprintf(stderr, "Wait for kids, pid %d\n", getpid()); -#endif - parent_waiting = 1; - while (1) { - if (wait(&status) >= 0) { - running--; - break; - } else if (exit_signal) { - break; - } - } - if (exit_signal) { -#if 0 - while (running > 0) { - while (wait(&status) < 0) { - } - running--; - } -#endif - goto parent_out; - } - } - } - } else { - parent = 0; - } - -#endif /* WIN32 */ - } - zend_first_try { - while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 1, 2)) != -1) { - switch (c) { - case 'T': - benchmark = 1; - repeats = atoi(php_optarg); -#ifdef HAVE_GETTIMEOFDAY - gettimeofday(&start, NULL); -#else - time(&start); -#endif - break; - case 'h': - case '?': - fcgi_shutdown(); - no_headers = 1; - php_output_startup(); - php_output_activate(TSRMLS_C); - SG(headers_sent) = 1; - php_cgi_usage(argv[0]); - php_end_ob_buffers(1 TSRMLS_CC); - exit_status = 0; - goto out; - } - } - php_optind = orig_optind; - php_optarg = orig_optarg; - - /* start of FAST CGI loop */ - /* Initialise FastCGI request structure */ -#ifdef PHP_WIN32 - /* attempt to set security impersonation for fastcgi - * will only happen on NT based OS, others will ignore it. */ - if (fastcgi && CGIG(impersonate)) { - fcgi_impersonate(); - } -#endif - while (!fastcgi || fcgi_accept_request(&request) >= 0) { + while (fcgi_accept_request(&request) >= 0) { + request_body_fd = -1; SG(server_context) = (void *) &request; init_request_info(TSRMLS_C); CG(interactive) = 0; - if (!cgi && !fastcgi) { - while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { - switch (c) { + fpm_request_info(); - case 'a': /* interactive mode */ - printf("Interactive mode enabled\n\n"); - CG(interactive) = 1; - break; - - case 'C': /* don't chdir to the script directory */ - SG(options) |= SAPI_OPTION_NO_CHDIR; - break; - - case 'e': /* enable extended info output */ - CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO; - break; - - case 'f': /* parse file */ - if (script_file) { - efree(script_file); - } - script_file = estrdup(php_optarg); - no_headers = 1; - break; - - case 'i': /* php info & quit */ - if (script_file) { - efree(script_file); - } - if (php_request_startup(TSRMLS_C) == FAILURE) { - SG(server_context) = NULL; - php_module_shutdown(TSRMLS_C); - return FAILURE; - } - if (no_headers) { - SG(headers_sent) = 1; - SG(request_info).no_headers = 1; - } - php_print_info(0xFFFFFFFF TSRMLS_CC); - php_request_shutdown((void *) 0); - exit_status = 0; - goto out; - - case 'l': /* syntax check mode */ - no_headers = 1; - behavior = PHP_MODE_LINT; - break; - - case 'm': /* list compiled in modules */ - if (script_file) { - efree(script_file); - } - php_output_startup(); - php_output_activate(TSRMLS_C); - SG(headers_sent) = 1; - php_printf("[PHP Modules]\n"); - print_modules(TSRMLS_C); - php_printf("\n[Zend Modules]\n"); - print_extensions(TSRMLS_C); - php_printf("\n"); - php_end_ob_buffers(1 TSRMLS_CC); - exit_status = 0; - goto out; - -#if 0 /* not yet operational, see also below ... */ - case '': /* generate indented source mode*/ - behavior=PHP_MODE_INDENT; - break; -#endif - - case 'q': /* do not generate HTTP headers */ - no_headers = 1; - break; - - case 'v': /* show php version & quit */ - if (script_file) { - efree(script_file); - } - no_headers = 1; - if (php_request_startup(TSRMLS_C) == FAILURE) { - SG(server_context) = NULL; - php_module_shutdown(TSRMLS_C); - return FAILURE; - } - if (no_headers) { - SG(headers_sent) = 1; - SG(request_info).no_headers = 1; - } -#if ZEND_DEBUG - php_printf("PHP %s (%s) (built: %s %s) (DEBUG)\nCopyright (c) 1997-2009 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); -#else - php_printf("PHP %s (%s) (built: %s %s)\nCopyright (c) 1997-2009 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); -#endif - php_request_shutdown((void *) 0); - exit_status = 0; - goto out; - - case 'w': - behavior = PHP_MODE_STRIP; - break; - - case 'z': /* load extension file */ - zend_load_extension(php_optarg); - break; - - default: - break; - } - } - - if (script_file) { - /* override path_translated if -f on command line */ - STR_FREE(SG(request_info).path_translated); - SG(request_info).path_translated = script_file; - /* before registering argv to module exchange the *new* argv[0] */ - /* we can achieve this without allocating more memory */ - SG(request_info).argc = argc - (php_optind - 1); - SG(request_info).argv = &argv[php_optind - 1]; - SG(request_info).argv[0] = script_file; - } else if (argc > php_optind) { - /* file is on command line, but not in -f opt */ - STR_FREE(SG(request_info).path_translated); - SG(request_info).path_translated = estrdup(argv[php_optind]); - /* arguments after the file are considered script args */ - SG(request_info).argc = argc - php_optind; - SG(request_info).argv = &argv[php_optind]; - } - - if (no_headers) { - SG(headers_sent) = 1; - SG(request_info).no_headers = 1; - } - - /* all remaining arguments are part of the query string - * this section of code concatenates all remaining arguments - * into a single string, seperating args with a & - * this allows command lines like: - * - * test.php v1=test v2=hello+world! - * test.php "v1=test&v2=hello world!" - * test.php v1=test "v2=hello world!" - */ - if (!SG(request_info).query_string && argc > php_optind) { - int slen = strlen(PG(arg_separator).input); - len = 0; - for (i = php_optind; i < argc; i++) { - if (i < (argc - 1)) { - len += strlen(argv[i]) + slen; - } else { - len += strlen(argv[i]); - } - } - - len += 2; - s = malloc(len); - *s = '\0'; /* we are pretending it came from the environment */ - for (i = php_optind; i < argc; i++) { - strlcat(s, argv[i], len); - if (i < (argc - 1)) { - strlcat(s, PG(arg_separator).input, len); - } - } - SG(request_info).query_string = s; - free_query_string = 1; - } - } /* end !cgi && !fastcgi */ - - /* - we never take stdin if we're (f)cgi, always - rely on the web server giving us the info - we need in the environment. - */ - if (SG(request_info).path_translated || cgi || fastcgi) { - file_handle.type = ZEND_HANDLE_FILENAME; - file_handle.filename = SG(request_info).path_translated; - file_handle.handle.fp = NULL; - } else { - file_handle.filename = "-"; - file_handle.type = ZEND_HANDLE_FP; - file_handle.handle.fp = stdin; - } - - file_handle.opened_path = NULL; - file_handle.free_filename = 0; - - /* request startup only after we've done all we can to - * get path_translated */ - if (php_request_startup(TSRMLS_C) == FAILURE) { - if (fastcgi) { - fcgi_finish_request(&request, 1); - } - SG(server_context) = NULL; - php_module_shutdown(TSRMLS_C); - return FAILURE; - } - if (no_headers) { - SG(headers_sent) = 1; - SG(request_info).no_headers = 1; - } - - /* - at this point path_translated will be set if: - 1. we are running from shell and got filename was there - 2. we are running as cgi or fastcgi - */ - if (cgi || fastcgi || SG(request_info).path_translated) { + if (SG(request_info).path_translated) { if (php_fopen_primary_script(&file_handle TSRMLS_CC) == FAILURE) { zend_try { if (errno == EACCES) { @@ -2055,132 +1789,47 @@ /* we want to serve more requests if this is fastcgi * so cleanup and continue, request shutdown is * handled later */ - if (fastcgi) { - goto fastcgi_request_done; - } - STR_FREE(SG(request_info).path_translated); - - if (free_query_string && SG(request_info).query_string) { - free(SG(request_info).query_string); - SG(request_info).query_string = NULL; - } - - php_request_shutdown((void *) 0); - SG(server_context) = NULL; - php_module_shutdown(TSRMLS_C); - sapi_shutdown(); -#ifdef ZTS - tsrm_shutdown(); -#endif - return FAILURE; + goto fastcgi_request_done; } } - if (CGIG(check_shebang_line) && file_handle.handle.fp && (file_handle.handle.fp != stdin)) { - /* #!php support */ - c = fgetc(file_handle.handle.fp); - if (c == '#') { - while (c != '\n' && c != '\r' && c != EOF) { - c = fgetc(file_handle.handle.fp); /* skip to end of line */ - } - /* handle situations where line is terminated by \r\n */ - if (c == '\r') { - if (fgetc(file_handle.handle.fp) != '\n') { - long pos = ftell(file_handle.handle.fp); - fseek(file_handle.handle.fp, pos - 1, SEEK_SET); - } - } - CG(start_lineno) = 2; - } else { - rewind(file_handle.handle.fp); - } - } + fpm_request_executing(); - switch (behavior) { - case PHP_MODE_STANDARD: - php_execute_script(&file_handle TSRMLS_CC); - break; - case PHP_MODE_LINT: - PG(during_request_startup) = 0; - exit_status = php_lint_script(&file_handle TSRMLS_CC); - if (exit_status == SUCCESS) { - zend_printf("No syntax errors detected in %s\n", file_handle.filename); - } else { - zend_printf("Errors parsing %s\n", file_handle.filename); - } - break; - case PHP_MODE_STRIP: - if (open_file_for_scanning(&file_handle TSRMLS_CC) == SUCCESS) { - zend_strip(TSRMLS_C); - zend_file_handle_dtor(&file_handle TSRMLS_CC); - php_end_ob_buffers(1 TSRMLS_CC); - } - return SUCCESS; - break; - case PHP_MODE_HIGHLIGHT: - { - zend_syntax_highlighter_ini syntax_highlighter_ini; + php_execute_script(&file_handle TSRMLS_CC); - if (open_file_for_scanning(&file_handle TSRMLS_CC) == SUCCESS) { - php_get_highlight_struct(&syntax_highlighter_ini); - zend_highlight(&syntax_highlighter_ini TSRMLS_CC); - if (fastcgi) { - goto fastcgi_request_done; - } - zend_file_handle_dtor(&file_handle TSRMLS_CC); - php_end_ob_buffers(1 TSRMLS_CC); - } - return SUCCESS; - } - break; -#if 0 - /* Zeev might want to do something with this one day */ - case PHP_MODE_INDENT: - open_file_for_scanning(&file_handle TSRMLS_CC); - zend_indent(); - zend_file_handle_dtor(&file_handle TSRMLS_CC); - return SUCCESS; - break; -#endif +fastcgi_request_done: + if (request_body_fd != -1) { + close(request_body_fd); } + request_body_fd = -2; -fastcgi_request_done: - { - STR_FREE(SG(request_info).path_translated); + STR_FREE(SG(request_info).path_translated); - php_request_shutdown((void *) 0); + if (EG(exit_status) == 255) { + if (CGIG(error_header) && *CGIG(error_header)) { + sapi_header_line ctr = {0}; - if (exit_status == 0) { - exit_status = EG(exit_status); + ctr.line = CGIG(error_header); + ctr.line_len = strlen(CGIG(error_header)); + sapi_header_op(SAPI_HEADER_REPLACE, &ctr TSRMLS_CC); } + } - if (free_query_string && SG(request_info).query_string) { - free(SG(request_info).query_string); - SG(request_info).query_string = NULL; - } + php_request_shutdown((void *) 0); + + if (exit_status == 0) { + exit_status = EG(exit_status); } - if (!fastcgi) { - if (benchmark) { - repeats--; - if (repeats > 0) { - script_file = NULL; - php_optind = orig_optind; - php_optarg = orig_optarg; - continue; - } - } - break; + if (free_query_string && SG(request_info).query_string) { + free(SG(request_info).query_string); + SG(request_info).query_string = NULL; } - /* only fastcgi will get here */ requests++; if (max_requests && (requests == max_requests)) { fcgi_finish_request(&request, 1); - if (bindpath) { - free(bindpath); - } if (max_requests != 1) { /* no need to return exit_status of the last request */ exit_status = 0; @@ -2202,31 +1851,7 @@ } zend_end_try(); out: - if (benchmark) { - int sec; -#ifdef HAVE_GETTIMEOFDAY - int usec; - gettimeofday(&end, NULL); - sec = (int)(end.tv_sec - start.tv_sec); - if (end.tv_usec >= start.tv_usec) { - usec = (int)(end.tv_usec - start.tv_usec); - } else { - sec -= 1; - usec = (int)(end.tv_usec + 1000000 - start.tv_usec); - } - fprintf(stderr, "\nElapsed time: %d.%06d sec\n", sec, usec); -#else - time(&end); - sec = (int)(end - start); - fprintf(stderr, "\nElapsed time: %d sec\n", sec); -#endif - } - -#ifndef PHP_WIN32 -parent_out: -#endif - SG(server_context) = NULL; php_module_shutdown(TSRMLS_C); sapi_shutdown();
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php