summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2017-07-20 13:45:25 +0200
committerNikita Popov <nikita.ppv@gmail.com>2017-07-20 13:58:40 +0200
commitba383b82399f408da3fdb62d90d74a4314f9c689 (patch)
tree478ed99b2afe58c642ebb0280a2a081adf0e5b20
parent264387e31e091ed51f86933c6f20f212436db61c (diff)
downloadphp-git-ba383b82399f408da3fdb62d90d74a4314f9c689.tar.gz
Add basic mbstring encoding cache
Store the last used encoding and compare against it. It's quite likely that an application is going to be using the same encoding again and again. The actual mbfl_name2encoding() function could also be optimized to use a hash lookup rather than a linear scan, but we don't have a hashtable implmentation in libmbfl...
-rw-r--r--ext/mbstring/mbstring.c19
-rw-r--r--ext/mbstring/mbstring.h2
2 files changed, 20 insertions, 1 deletions
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index 62b1dc38d7..44a8a1da4c 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -705,11 +705,23 @@ static sapi_post_entry mbstr_post_entries[] = {
static const mbfl_encoding *php_mb_get_encoding(const char *encoding_name) {
if (encoding_name) {
- const mbfl_encoding *encoding = mbfl_name2encoding(encoding_name);
+ const mbfl_encoding *encoding;
+ if (MBSTRG(last_used_encoding_name)
+ && !strcasecmp(encoding_name, MBSTRG(last_used_encoding_name))) {
+ return MBSTRG(last_used_encoding);
+ }
+
+ encoding = mbfl_name2encoding(encoding_name);
if (!encoding) {
php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", encoding_name);
return NULL;
}
+
+ if (MBSTRG(last_used_encoding_name)) {
+ efree(MBSTRG(last_used_encoding_name));
+ }
+ MBSTRG(last_used_encoding_name) = estrdup(encoding_name);
+ MBSTRG(last_used_encoding) = encoding;
return encoding;
} else {
return MBSTRG(current_internal_encoding);
@@ -1545,6 +1557,8 @@ ZEND_TSRMLS_CACHE_UPDATE();
#if HAVE_MBREGEX
mbstring_globals->mb_regex_globals = php_mb_regex_globals_alloc();
#endif
+ mbstring_globals->last_used_encoding_name = NULL;
+ mbstring_globals->last_used_encoding = NULL;
}
/* }}} */
@@ -1563,6 +1577,9 @@ static PHP_GSHUTDOWN_FUNCTION(mbstring)
#if HAVE_MBREGEX
php_mb_regex_globals_free(mbstring_globals->mb_regex_globals);
#endif
+ if (mbstring_globals->last_used_encoding_name) {
+ efree(mbstring_globals->last_used_encoding_name);
+ }
}
/* }}} */
diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h
index 6862bf0392..49a1434bd8 100644
--- a/ext/mbstring/mbstring.h
+++ b/ext/mbstring/mbstring.h
@@ -192,6 +192,8 @@ ZEND_BEGIN_MODULE_GLOBALS(mbstring)
#if HAVE_MBREGEX
struct _zend_mb_regex_globals *mb_regex_globals;
#endif
+ char *last_used_encoding_name;
+ const mbfl_encoding *last_used_encoding;
ZEND_END_MODULE_GLOBALS(mbstring)
#define MB_OVERLOAD_MAIL 1