commit edae18ccf5c51ae0bcc0e9655ead7540fd42dd9f Author: Martin Pelikan <peli...@storkhole.cz> Date: Wed May 8 02:06:09 2013 +0200
Faster and safer parsing of fpm configuration. The current fpm config parser did a read(2) syscall per character, which obfuscated debugging strace/ktrace output somewhat. This also makes the 1024 characters per line limit more explicit, so the users will know what were they hitting. It might improve performance during php-fpm load (.03 vs .00 seconds on my laptop) but primarily serves to help observing fpm system call traces during deployment (in chroot for example). Signed-off-by: Martin Pelikan <martin.peli...@gmail.com> diff --git a/sapi/fpm/fpm/fpm_conf.c b/sapi/fpm/fpm/fpm_conf.c index 0a8a0e3..e004934 100644 --- a/sapi/fpm/fpm/fpm_conf.c +++ b/sapi/fpm/fpm/fpm_conf.c @@ -1447,11 +1447,11 @@ static void fpm_conf_ini_parser(zval *arg1, zval *arg2, zval *arg3, int callback int fpm_conf_load_ini_file(char *filename TSRMLS_DC) /* {{{ */ { + const int bufsize = 1024; int error = 0; - char buf[1024+1]; - int fd, n; + char buf[bufsize], *newl; + int fd, pos = 0; int nb_read = 1; - char c = '*'; int ret = 1; @@ -1473,36 +1473,48 @@ int fpm_conf_load_ini_file(char *filename TSRMLS_DC) /* {{{ */ } ini_lineno = 0; + memset(buf, 0, sizeof buf); while (nb_read > 0) { int tmp; - memset(buf, 0, sizeof(char) * (1024 + 1)); - for (n = 0; n < 1024 && (nb_read = read(fd, &c, sizeof(char))) == sizeof(char) && c != '\n'; n++) { - buf[n] = c; - } - buf[n++] = '\n'; - ini_lineno++; - ini_filename = filename; - tmp = zend_parse_ini_string(buf, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t)fpm_conf_ini_parser, &error TSRMLS_CC); - ini_filename = filename; - if (error || tmp == FAILURE) { - if (ini_include) free(ini_include); - ini_recursion--; - close(fd); - return -1; - } - if (ini_include) { - char *tmp = ini_include; - ini_include = NULL; - fpm_evaluate_full_path(&tmp, NULL, NULL, 0); - fpm_conf_ini_parser_include(tmp, &error TSRMLS_CC); - if (error) { - free(tmp); + + nb_read = read(fd, buf + pos, sizeof buf - pos); + pos = 0; + + while ((newl = strchr(buf + pos, '\n')) != NULL) { + newl[0] = '\0'; + ini_lineno++; + ini_filename = filename; + tmp = zend_parse_ini_string(buf + pos, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t)fpm_conf_ini_parser, &error TSRMLS_CC); + ini_filename = filename; + if (error || tmp == FAILURE) { + if (ini_include) free(ini_include); ini_recursion--; close(fd); return -1; } - free(tmp); + if (ini_include) { + char *tmp = ini_include; + ini_include = NULL; + fpm_evaluate_full_path(&tmp, NULL, NULL, 0); + fpm_conf_ini_parser_include(tmp, &error TSRMLS_CC); + if (error) { + free(tmp); + ini_recursion--; + close(fd); + return -1; + } + free(tmp); + } + + pos = newl - buf + 1; + } + if (nb_read > 0 && pos == 0) { + zlog(ZLOG_ERROR, "line %u too long", ini_lineno + 1); + close(fd); + return -1; } + memmove(buf, buf + pos, sizeof buf - pos); + pos = sizeof buf - pos; } ini_recursion--; -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php