Annotation of embedaddon/php/sapi/fpm/fpm/fpm_request.c, revision 1.1.1.2
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-- */
1.1.1.2 ! misho 57: fpm_scoreboard_update(1, -1, 0, 0, 0, 0, 0, FPM_SCOREBOARD_ACTION_INC, NULL);
1.1 misho 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++ */
1.1.1.2 ! misho 101: fpm_scoreboard_update(-1, 1, 0, 0, 1, 0, 0, FPM_SCOREBOARD_ACTION_INC, NULL);
1.1 misho 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>