]> granicus.if.org Git - php/commitdiff
MFH:
authorRasmus Lerdorf <rasmus@php.net>
Thu, 15 Jun 2006 20:49:05 +0000 (20:49 +0000)
committerRasmus Lerdorf <rasmus@php.net>
Thu, 15 Jun 2006 20:49:05 +0000 (20:49 +0000)
I don't think the call to xmlNodeSetContentLen() is needed here and
it is causing performance problems because it tries to parse the blob
and create a subtree.  Because we are escaping the string anyway, we
are never going to get a subtree, but the entity parsing that is done
by xmlNodeSetContentLen() is killing performance on large blobs of
text.  On one recent example it took a couple of minutes to parse
whereas if we just create a text node like this and set the contents
to the raw string it is down to milliseconds.

ext/soap/php_encoding.c

index 195ae4d448e50702570a4a7cd9cf1e45c465eac6..118f8bc9524473e5c3889247f971c9a288fcb45b 100644 (file)
@@ -727,7 +727,7 @@ static zval *to_zval_hexbin(encodeTypePtr type, xmlNodePtr data)
 
 static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
 {
-       xmlNodePtr ret;
+       xmlNodePtr ret, text;
        char *str;
        int new_len;
        TSRMLS_FETCH();
@@ -737,13 +737,15 @@ static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNo
        FIND_ZVAL_NULL(data, ret, style);
 
        if (Z_TYPE_P(data) == IS_STRING) {
-               str = php_escape_html_entities(Z_STRVAL_P(data), Z_STRLEN_P(data), &new_len, 0, 0, NULL TSRMLS_CC);
+               str = estrndup(Z_STRVAL_P(data), Z_STRLEN_P(data));
+               new_len = Z_STRLEN_P(data);
        } else {
                zval tmp = *data;
 
                zval_copy_ctor(&tmp);
                convert_to_string(&tmp);
-               str = php_escape_html_entities(Z_STRVAL(tmp), Z_STRLEN(tmp), &new_len, 0, 0, NULL TSRMLS_CC);
+               str = estrndup(Z_STRVAL(tmp), Z_STRLEN(tmp));
+               new_len = Z_STRLEN(tmp);
                zval_dtor(&tmp);
        }
 
@@ -765,7 +767,8 @@ static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNo
                soap_error1(E_ERROR,  "Encoding: string '%s' is not a valid utf-8 string", str);
        }
 
-       xmlNodeSetContentLen(ret, str, new_len);
+       text = xmlNewTextLen(str, new_len);
+       xmlAddChild(ret, text);
        efree(str);
 
        if (style == SOAP_ENCODED) {