|
3 | 3 | /* (c) 2009 Jerome Loyet */
|
4 | 4 |
|
5 | 5 | #include "php.h"
|
| 6 | +#include "zend_long.h" |
6 | 7 | #include "SAPI.h"
|
7 | 8 | #include <stdio.h>
|
8 | 9 |
|
@@ -45,6 +46,103 @@ int fpm_status_init_child(struct fpm_worker_pool_s *wp) /* {{{ */
|
45 | 46 | }
|
46 | 47 | /* }}} */
|
47 | 48 |
|
| 49 | +int fpm_status_export_to_zval(zval *status) |
| 50 | +{ |
| 51 | + struct fpm_scoreboard_s scoreboard, *scoreboard_p; |
| 52 | + zval fpm_proc_stats, fpm_proc_stat; |
| 53 | + time_t now_epoch; |
| 54 | + struct timeval duration, now; |
| 55 | + double cpu; |
| 56 | + int i; |
| 57 | + |
| 58 | + |
| 59 | + scoreboard_p = fpm_scoreboard_acquire(NULL, 1); |
| 60 | + if (!scoreboard_p) { |
| 61 | + zlog(ZLOG_NOTICE, "[pool %s] status: scoreboard already in use.", scoreboard_p->pool); |
| 62 | + return -1; |
| 63 | + } |
| 64 | + |
| 65 | + /* copy the scoreboard not to bother other processes */ |
| 66 | + scoreboard = *scoreboard_p; |
| 67 | + struct fpm_scoreboard_proc_s procs[scoreboard.nprocs]; |
| 68 | + |
| 69 | + struct fpm_scoreboard_proc_s *proc_p; |
| 70 | + for(i=0; i<scoreboard.nprocs; i++) { |
| 71 | + proc_p = fpm_scoreboard_proc_acquire(scoreboard_p, i, 1); |
| 72 | + if (!proc_p){ |
| 73 | + procs[i].used=-1; |
| 74 | + continue; |
| 75 | + } |
| 76 | + procs[i] = *proc_p; |
| 77 | + fpm_scoreboard_proc_release(proc_p); |
| 78 | + } |
| 79 | + fpm_scoreboard_release(scoreboard_p); |
| 80 | + |
| 81 | + now_epoch = time(NULL); |
| 82 | + fpm_clock_get(&now); |
| 83 | + |
| 84 | + array_init(status); |
| 85 | + add_assoc_string(status, "pool", scoreboard.pool); |
| 86 | + add_assoc_string(status, "process-manager", PM2STR(scoreboard.pm)); |
| 87 | + add_assoc_long(status, "start-time", scoreboard.start_epoch); |
| 88 | + add_assoc_long(status, "start-since", now_epoch - scoreboard.start_epoch); |
| 89 | + add_assoc_long(status, "accepted-conn", scoreboard.requests); |
| 90 | +#ifdef HAVE_FPM_LQ |
| 91 | + add_assoc_long(status, "listen-queue", scoreboard.lq); |
| 92 | + add_assoc_long(status, "max-listen-queue", scoreboard.lq_max); |
| 93 | + add_assoc_long(status, "listen-queue-len", scoreboard.lq_len); |
| 94 | +#endif |
| 95 | + add_assoc_long(status, "idle-processes", scoreboard.idle); |
| 96 | + add_assoc_long(status, "active-processes", scoreboard.active); |
| 97 | + add_assoc_long(status, "total-processes", scoreboard.idle + scoreboard.active); |
| 98 | + add_assoc_long(status, "max-active-processes", scoreboard.active_max); |
| 99 | + add_assoc_long(status, "max-children-reached", scoreboard.max_children_reached); |
| 100 | + add_assoc_long(status, "slow-requests", scoreboard.slow_rq); |
| 101 | + |
| 102 | + array_init(&fpm_proc_stats); |
| 103 | + for(i=0; i<scoreboard.nprocs; i++) { |
| 104 | + if (!procs[i].used) { |
| 105 | + continue; |
| 106 | + } |
| 107 | + proc_p = &procs[i]; |
| 108 | +#ifdef HAVE_FPM_LQ |
| 109 | + /* prevent NaN */ |
| 110 | + if (procs[i].cpu_duration.tv_sec == 0 && procs[i].cpu_duration.tv_usec == 0) { |
| 111 | + cpu = 0.; |
| 112 | + } else { |
| 113 | + cpu = (procs[i].last_request_cpu.tms_utime + procs[i].last_request_cpu.tms_stime + procs[i].last_request_cpu.tms_cutime + procs[i].last_request_cpu.tms_cstime) / fpm_scoreboard_get_tick() / (procs[i].cpu_duration.tv_sec + procs[i].cpu_duration.tv_usec / 1000000.) * 100.; |
| 114 | + } |
| 115 | +#endif |
| 116 | + |
| 117 | + array_init(&fpm_proc_stat); |
| 118 | + add_assoc_long(&fpm_proc_stat, "pid", procs[i].pid); |
| 119 | + add_assoc_string(&fpm_proc_stat, "state", fpm_request_get_stage_name(procs[i].request_stage)); |
| 120 | + add_assoc_long(&fpm_proc_stat, "start-time", procs[i].start_epoch); |
| 121 | + add_assoc_long(&fpm_proc_stat, "start-since", now_epoch - procs[i].start_epoch); |
| 122 | + add_assoc_long(&fpm_proc_stat, "requests", procs[i].requests); |
| 123 | + if (procs[i].request_stage == FPM_REQUEST_ACCEPTING) { |
| 124 | + duration = procs[i].duration; |
| 125 | + } else { |
| 126 | + timersub(&now, &procs[i].accepted, &duration); |
| 127 | + } |
| 128 | + add_assoc_long(&fpm_proc_stat, "request-duration", duration.tv_sec * 1000000UL + duration.tv_usec); |
| 129 | + add_assoc_string(&fpm_proc_stat, "request-method", procs[i].request_method[0] != '\0' ? procs[i].request_method : "-"); |
| 130 | + add_assoc_string(&fpm_proc_stat, "request-uri", procs[i].request_uri); |
| 131 | + add_assoc_string(&fpm_proc_stat, "query-string", procs[i].query_string); |
| 132 | + add_assoc_long(&fpm_proc_stat, "request-length", procs[i].content_length); |
| 133 | + add_assoc_string(&fpm_proc_stat, "user", procs[i].auth_user[0] != '\0' ? procs[i].auth_user : "-"); |
| 134 | + add_assoc_string(&fpm_proc_stat, "script", procs[i].script_filename[0] != '\0' ? procs[i].script_filename : "-"); |
| 135 | +#ifdef HAVE_FPM_LQ |
| 136 | + add_assoc_double(&fpm_proc_stat, "last-request-cpu", procs[i].request_stage == FPM_REQUEST_ACCEPTING ? cpu : 0.); |
| 137 | +#endif |
| 138 | + add_assoc_long(&fpm_proc_stat, "last-request-memory", procs[i].request_stage == FPM_REQUEST_ACCEPTING ? procs[i].memory : 0); |
| 139 | + add_next_index_zval(&fpm_proc_stats, &fpm_proc_stat); |
| 140 | + } |
| 141 | + add_assoc_zval(status, "procs", &fpm_proc_stats); |
| 142 | + return 0; |
| 143 | +} |
| 144 | +/* }}} */ |
| 145 | + |
48 | 146 | int fpm_status_handle_request(void) /* {{{ */
|
49 | 147 | {
|
50 | 148 | struct fpm_scoreboard_s scoreboard, *scoreboard_p;
|
@@ -478,4 +576,3 @@ int fpm_status_handle_request(void) /* {{{ */
|
478 | 576 | return 0;
|
479 | 577 | }
|
480 | 578 | /* }}} */
|
481 |
| - |
|
0 commit comments