diff options
| author | Dmitry Stogov <dmitry@zend.com> | 2017-05-22 23:23:12 +0300 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@zend.com> | 2017-05-22 23:23:12 +0300 |
| commit | 293d99052db363dd655ebe24a3c1fed3c095012a (patch) | |
| tree | 652213aac777d407b4f276a67f73d61c1734adeb | |
| parent | 26a6d20ab50b47291eba0870a36c59f1840df602 (diff) | |
| download | php-git-293d99052db363dd655ebe24a3c1fed3c095012a.tar.gz | |
Optimized parse_url() by using "known" strings
| -rw-r--r-- | Zend/zend_string.h | 8 | ||||
| -rw-r--r-- | ext/standard/url.c | 49 |
2 files changed, 41 insertions, 16 deletions
diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 77dd083997..81db801783 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -408,6 +408,14 @@ EMPTY_SWITCH_DEFAULT_CASE() _(ZEND_STR_SEVERITY, "severity") \ _(ZEND_STR_STRING, "string") \ _(ZEND_STR_TRACE, "trace") \ + _(ZEND_STR_SCHEME, "scheme") \ + _(ZEND_STR_HOST, "host") \ + _(ZEND_STR_PORT, "port") \ + _(ZEND_STR_USER, "user") \ + _(ZEND_STR_PASS, "pass") \ + _(ZEND_STR_PATH, "path") \ + _(ZEND_STR_QUERY, "query") \ + _(ZEND_STR_FRAGMENT, "fragment") \ typedef enum _zend_known_string_id { diff --git a/ext/standard/url.c b/ext/standard/url.c index c2d78656b7..9806ed52b8 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -335,6 +335,7 @@ PHP_FUNCTION(parse_url) size_t str_len; php_url *resource; zend_long key = -1; + zval tmp; ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_STRING(str, str_len) @@ -385,22 +386,38 @@ PHP_FUNCTION(parse_url) array_init(return_value); /* add the various elements to the array */ - if (resource->scheme != NULL) - add_assoc_string(return_value, "scheme", resource->scheme); - if (resource->host != NULL) - add_assoc_string(return_value, "host", resource->host); - if (resource->port != 0) - add_assoc_long(return_value, "port", resource->port); - if (resource->user != NULL) - add_assoc_string(return_value, "user", resource->user); - if (resource->pass != NULL) - add_assoc_string(return_value, "pass", resource->pass); - if (resource->path != NULL) - add_assoc_string(return_value, "path", resource->path); - if (resource->query != NULL) - add_assoc_string(return_value, "query", resource->query); - if (resource->fragment != NULL) - add_assoc_string(return_value, "fragment", resource->fragment); + if (resource->scheme != NULL) { + ZVAL_STRING(&tmp, resource->scheme); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_SCHEME), &tmp); + } + if (resource->host != NULL) { + ZVAL_STRING(&tmp, resource->host); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_HOST), &tmp); + } + if (resource->port != 0) { + ZVAL_LONG(&tmp, resource->port); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_PORT), &tmp); + } + if (resource->user != NULL) { + ZVAL_STRING(&tmp, resource->user); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_USER), &tmp); + } + if (resource->pass != NULL) { + ZVAL_STRING(&tmp, resource->pass); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_PASS), &tmp); + } + if (resource->path != NULL) { + ZVAL_STRING(&tmp, resource->path); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_PATH), &tmp); + } + if (resource->query != NULL) { + ZVAL_STRING(&tmp, resource->query); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_QUERY), &tmp); + } + if (resource->fragment != NULL) { + ZVAL_STRING(&tmp, resource->fragment); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_FRAGMENT), &tmp); + } done: php_url_free(resource); } |
