1

这是 php_log_err 的源代码。我想修改它以便能够记录变量_SERVER["REQUEST_URI"]

/* {{{ php_log_err
 */
PHPAPI void php_log_err(char *log_message TSRMLS_DC)
{
        FILE *log_file;
        char error_time_str[128];
        struct tm tmbuf;
        time_t error_time;

        /* Try to use the specified logging location. */
        if (PG(error_log) != NULL) {
#ifdef HAVE_SYSLOG_H
                if (!strcmp(PG(error_log), "syslog")) {
                        php_syslog(LOG_NOTICE, "%.500s", log_message);
                        return;
                }
#endif
                log_file = VCWD_FOPEN(PG(error_log), "ab");
                if (log_file != NULL) {
                        time(&error_time);
                        strftime(error_time_str, sizeof(error_time_str), "%d-%b-%Y %H:%M:%S", php_localtime_r(&error_time, &tmbuf));
                        fprintf(log_file, "[%s] ", error_time_str);
                        fprintf(log_file, "%s", log_message);
                        fprintf(log_file, "%s", PHP_EOL);
                        fclose(log_file);
                        return;
                }
        }

        /* Otherwise fall back to the default logging location, if we have one */

        if (sapi_module.log_message) {
                sapi_module.log_message(log_message);
        }
}
/* }}} */

我有这个应该离解决方案不远,但我无法让它工作:

char key[] = "REQUEST_URI";
int key_size = sizeof(key);
zval **hsv;
zval **var;

if (SUCCESS != zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &hsv)) {
    if (SUCCESS != zend_hash_find(Z_ARRVAL_PP(hsv), (char *) key, key_size, (void **) &var)) {
        if (!(Z_STRVAL_PP(var) && Z_STRLEN_PP(var))) {
        }
    }
}
4

1 回答 1

4

没关系,我终于找到了答案……

char *ip_address;
char *uri;

ip_address = sapi_getenv("HTTP_X_FORWARDED_FOR", 20 TSRMLS_CC);
if (ip_address == NULL) {
  ip_address = sapi_getenv("REMOTE_ADDR", 11 TSRMLS_CC);
  if (ip_address == NULL) {
    ip_address = "no_ip_address";
  }
}

uri = sapi_getenv("REQUEST_URI", 11 TSRMLS_CC);
if (uri == NULL) {
  uri = "no_uri";
}

php_syslog(LOG_NOTICE, "%.500s [ip:%s][uri:%s]", log_message, ip_address, uri);
于 2009-05-15T14:58:10.793 回答