Annotation of embedaddon/php/sapi/fpm/fpm/fpm_request.c, revision 1.1
1.1 ! misho 1:
! 2: /* $Id: fpm_request.c,v 1.9.2.1 2008/11/15 00:57:24 anight Exp $ */
! 3: /* (c) 2007,2008 Andrei Nigmatulin */
! 4: #ifdef HAVE_TIMES
! 5: #include <sys/times.h>
! 6: #endif
! 7:
! 8: #include "fpm_config.h"
! 9:
! 10: #include "fpm.h"
! 11: #include "fpm_php.h"
! 12: #include "fpm_str.h"
! 13: #include "fpm_clock.h"
! 14: #include "fpm_conf.h"
! 15: #include "fpm_trace.h"
! 16: #include "fpm_php_trace.h"
! 17: #include "fpm_process_ctl.h"
! 18: #include "fpm_children.h"
! 19: #include "fpm_scoreboard.h"
! 20: #include "fpm_status.h"
! 21: #include "fpm_request.h"
! 22: #include "fpm_log.h"
! 23:
! 24: #include "zlog.h"
! 25:
! 26: static const char *requests_stages[] = {
! 27: [FPM_REQUEST_ACCEPTING] = "Idle",
! 28: [FPM_REQUEST_READING_HEADERS] = "Reading headers",
! 29: [FPM_REQUEST_INFO] = "Getting request informations",
! 30: [FPM_REQUEST_EXECUTING] = "Running",
! 31: [FPM_REQUEST_END] = "Ending",
! 32: [FPM_REQUEST_FINISHED] = "Finishing",
! 33: };
! 34:
! 35: const char *fpm_request_get_stage_name(int stage) {
! 36: return requests_stages[stage];
! 37: }
! 38:
! 39: void fpm_request_accepting() /* {{{ */
! 40: {
! 41: struct fpm_scoreboard_proc_s *proc;
! 42: struct timeval now;
! 43:
! 44: fpm_clock_get(&now);
! 45:
! 46: proc = fpm_scoreboard_proc_acquire(NULL, -1, 0);
! 47: if (proc == NULL) {
! 48: zlog(ZLOG_WARNING, "failed to acquire proc scoreboard");
! 49: return;
! 50: }
! 51:
! 52: proc->request_stage = FPM_REQUEST_ACCEPTING;
! 53: proc->tv = now;
! 54: fpm_scoreboard_proc_release(proc);
! 55:
! 56: /* idle++, active-- */
! 57: fpm_scoreboard_update(1, -1, 0, 0, 0, 0, FPM_SCOREBOARD_ACTION_INC, NULL);
! 58: }
! 59: /* }}} */
! 60:
! 61: void fpm_request_reading_headers() /* {{{ */
! 62: {
! 63: struct fpm_scoreboard_proc_s *proc;
! 64:
! 65: struct timeval now;
! 66: clock_t now_epoch;
! 67: #ifdef HAVE_TIMES
! 68: struct tms cpu;
! 69: #endif
! 70:
! 71: fpm_clock_get(&now);
! 72: now_epoch = time(NULL);
! 73: #ifdef HAVE_TIMES
! 74: times(&cpu);
! 75: #endif
! 76:
! 77: proc = fpm_scoreboard_proc_acquire(NULL, -1, 0);
! 78: if (proc == NULL) {
! 79: zlog(ZLOG_WARNING, "failed to acquire proc scoreboard");
! 80: return;
! 81: }
! 82:
! 83: proc->request_stage = FPM_REQUEST_READING_HEADERS;
! 84: proc->tv = now;
! 85: proc->accepted = now;
! 86: proc->accepted_epoch = now_epoch;
! 87: #ifdef HAVE_TIMES
! 88: proc->cpu_accepted = cpu;
! 89: #endif
! 90: proc->requests++;
! 91: proc->request_uri[0] = '\0';
! 92: proc->request_method[0] = '\0';
! 93: proc->script_filename[0] = '\0';
! 94: proc->query_string[0] = '\0';
! 95: proc->query_string[0] = '\0';
! 96: proc->auth_user[0] = '\0';
! 97: proc->content_length = 0;
! 98: fpm_scoreboard_proc_release(proc);
! 99:
! 100: /* idle--, active++, request++ */
! 101: fpm_scoreboard_update(-1, 1, 0, 0, 1, 0, FPM_SCOREBOARD_ACTION_INC, NULL);
! 102: }
! 103: /* }}} */
! 104:
! 105: void fpm_request_info() /* {{{ */
! 106: {
! 107: TSRMLS_FETCH();
! 108: struct fpm_scoreboard_proc_s *proc;
! 109: char *request_uri = fpm_php_request_uri(TSRMLS_C);
! 110: char *request_method = fpm_php_request_method(TSRMLS_C);
! 111: char *script_filename = fpm_php_script_filename(TSRMLS_C);
! 112: char *query_string = fpm_php_query_string(TSRMLS_C);
! 113: char *auth_user = fpm_php_auth_user(TSRMLS_C);
! 114: size_t content_length = fpm_php_content_length(TSRMLS_C);
! 115: struct timeval now;
! 116:
! 117: fpm_clock_get(&now);
! 118:
! 119: proc = fpm_scoreboard_proc_acquire(NULL, -1, 0);
! 120: if (proc == NULL) {
! 121: zlog(ZLOG_WARNING, "failed to acquire proc scoreboard");
! 122: return;
! 123: }
! 124:
! 125: proc->request_stage = FPM_REQUEST_INFO;
! 126: proc->tv = now;
! 127:
! 128: if (request_uri) {
! 129: strlcpy(proc->request_uri, request_uri, sizeof(proc->request_uri));
! 130: }
! 131:
! 132: if (request_method) {
! 133: strlcpy(proc->request_method, request_method, sizeof(proc->request_method));
! 134: }
! 135:
! 136: if (query_string) {
! 137: strlcpy(proc->query_string, query_string, sizeof(proc->query_string));
! 138: }
! 139:
! 140: if (auth_user) {
! 141: strlcpy(proc->auth_user, auth_user, sizeof(proc->auth_user));
! 142: }
! 143:
! 144: proc->content_length = content_length;
! 145:
! 146: /* if cgi.fix_pathinfo is set to "1" and script cannot be found (404)
! 147: the sapi_globals.request_info.path_translated is set to NULL */
! 148: if (script_filename) {
! 149: strlcpy(proc->script_filename, script_filename, sizeof(proc->script_filename));
! 150: }
! 151:
! 152: fpm_scoreboard_proc_release(proc);
! 153: }
! 154: /* }}} */
! 155:
! 156: void fpm_request_executing() /* {{{ */
! 157: {
! 158: struct fpm_scoreboard_proc_s *proc;
! 159: struct timeval now;
! 160:
! 161: fpm_clock_get(&now);
! 162:
! 163: proc = fpm_scoreboard_proc_acquire(NULL, -1, 0);
! 164: if (proc == NULL) {
! 165: zlog(ZLOG_WARNING, "failed to acquire proc scoreboard");
! 166: return;
! 167: }
! 168:
! 169: proc->request_stage = FPM_REQUEST_EXECUTING;
! 170: proc->tv = now;
! 171: fpm_scoreboard_proc_release(proc);
! 172: }
! 173: /* }}} */
! 174:
! 175: void fpm_request_end(TSRMLS_D) /* {{{ */
! 176: {
! 177: struct fpm_scoreboard_proc_s *proc;
! 178: struct timeval now;
! 179: #ifdef HAVE_TIMES
! 180: struct tms cpu;
! 181: #endif
! 182: size_t memory = zend_memory_peak_usage(1 TSRMLS_CC);
! 183:
! 184: fpm_clock_get(&now);
! 185: #ifdef HAVE_TIMES
! 186: times(&cpu);
! 187: #endif
! 188:
! 189: proc = fpm_scoreboard_proc_acquire(NULL, -1, 0);
! 190: if (proc == NULL) {
! 191: zlog(ZLOG_WARNING, "failed to acquire proc scoreboard");
! 192: return;
! 193: }
! 194: proc->request_stage = FPM_REQUEST_FINISHED;
! 195: proc->tv = now;
! 196: timersub(&now, &proc->accepted, &proc->duration);
! 197: #ifdef HAVE_TIMES
! 198: timersub(&proc->tv, &proc->accepted, &proc->cpu_duration);
! 199: proc->last_request_cpu.tms_utime = cpu.tms_utime - proc->cpu_accepted.tms_utime;
! 200: proc->last_request_cpu.tms_stime = cpu.tms_stime - proc->cpu_accepted.tms_stime;
! 201: proc->last_request_cpu.tms_cutime = cpu.tms_cutime - proc->cpu_accepted.tms_cutime;
! 202: proc->last_request_cpu.tms_cstime = cpu.tms_cstime - proc->cpu_accepted.tms_cstime;
! 203: #endif
! 204: proc->memory = memory;
! 205: fpm_scoreboard_proc_release(proc);
! 206: }
! 207: /* }}} */
! 208:
! 209: void fpm_request_finished() /* {{{ */
! 210: {
! 211: struct fpm_scoreboard_proc_s *proc;
! 212: struct timeval now;
! 213:
! 214: fpm_clock_get(&now);
! 215:
! 216: proc = fpm_scoreboard_proc_acquire(NULL, -1, 0);
! 217: if (proc == NULL) {
! 218: zlog(ZLOG_WARNING, "failed to acquire proc scoreboard");
! 219: return;
! 220: }
! 221:
! 222: proc->request_stage = FPM_REQUEST_FINISHED;
! 223: proc->tv = now;
! 224: memset(&proc->accepted, 0, sizeof(proc->accepted));
! 225: proc->accepted_epoch = 0;
! 226: fpm_scoreboard_proc_release(proc);
! 227: }
! 228: /* }}} */
! 229:
! 230: void fpm_request_check_timed_out(struct fpm_child_s *child, struct timeval *now, int terminate_timeout, int slowlog_timeout) /* {{{ */
! 231: {
! 232: struct fpm_scoreboard_proc_s proc, *proc_p;
! 233:
! 234: proc_p = fpm_scoreboard_proc_acquire(child->wp->scoreboard, child->scoreboard_i, 1);
! 235: if (!proc_p) {
! 236: zlog(ZLOG_WARNING, "failed to acquire scoreboard");
! 237: return;
! 238: }
! 239:
! 240: proc = *proc_p;
! 241: fpm_scoreboard_proc_release(proc_p);
! 242:
! 243: #if HAVE_FPM_TRACE
! 244: if (child->slow_logged.tv_sec) {
! 245: if (child->slow_logged.tv_sec != proc.accepted.tv_sec || child->slow_logged.tv_usec != proc.accepted.tv_usec) {
! 246: child->slow_logged.tv_sec = 0;
! 247: child->slow_logged.tv_usec = 0;
! 248: }
! 249: }
! 250: #endif
! 251:
! 252: if (proc.request_stage > FPM_REQUEST_ACCEPTING && proc.request_stage < FPM_REQUEST_END) {
! 253: char purified_script_filename[sizeof(proc.script_filename)];
! 254: struct timeval tv;
! 255:
! 256: timersub(now, &proc.accepted, &tv);
! 257:
! 258: #if HAVE_FPM_TRACE
! 259: if (child->slow_logged.tv_sec == 0 && slowlog_timeout &&
! 260: proc.request_stage == FPM_REQUEST_EXECUTING && tv.tv_sec >= slowlog_timeout) {
! 261:
! 262: str_purify_filename(purified_script_filename, proc.script_filename, sizeof(proc.script_filename));
! 263:
! 264: child->slow_logged = proc.accepted;
! 265: child->tracer = fpm_php_trace;
! 266:
! 267: fpm_trace_signal(child->pid);
! 268:
! 269: zlog(ZLOG_WARNING, "[pool %s] child %d, script '%s' (request: \"%s %s\") executing too slow (%d.%06d sec), logging",
! 270: child->wp->config->name, (int) child->pid, purified_script_filename, proc.request_method, proc.request_uri,
! 271: (int) tv.tv_sec, (int) tv.tv_usec);
! 272: }
! 273: else
! 274: #endif
! 275: if (terminate_timeout && tv.tv_sec >= terminate_timeout) {
! 276: str_purify_filename(purified_script_filename, proc.script_filename, sizeof(proc.script_filename));
! 277: fpm_pctl_kill(child->pid, FPM_PCTL_TERM);
! 278:
! 279: zlog(ZLOG_WARNING, "[pool %s] child %d, script '%s' (request: \"%s %s\") execution timed out (%d.%06d sec), terminating",
! 280: child->wp->config->name, (int) child->pid, purified_script_filename, proc.request_method, proc.request_uri,
! 281: (int) tv.tv_sec, (int) tv.tv_usec);
! 282: }
! 283: }
! 284: }
! 285: /* }}} */
! 286:
! 287: int fpm_request_is_idle(struct fpm_child_s *child) /* {{{ */
! 288: {
! 289: struct fpm_scoreboard_proc_s *proc;
! 290:
! 291: /* no need in atomicity here */
! 292: proc = fpm_scoreboard_proc_get(child->wp->scoreboard, child->scoreboard_i);
! 293: if (!proc) {
! 294: return 0;
! 295: }
! 296:
! 297: return proc->request_stage == FPM_REQUEST_ACCEPTING;
! 298: }
! 299: /* }}} */
! 300:
! 301: int fpm_request_last_activity(struct fpm_child_s *child, struct timeval *tv) /* {{{ */
! 302: {
! 303: struct fpm_scoreboard_proc_s *proc;
! 304:
! 305: if (!tv) return -1;
! 306:
! 307: proc = fpm_scoreboard_proc_get(child->wp->scoreboard, child->scoreboard_i);
! 308: if (!proc) {
! 309: return -1;
! 310: }
! 311:
! 312: *tv = proc->tv;
! 313:
! 314: return 1;
! 315: }
! 316: /* }}} */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>