I finally got a chance to look at the code. Any reason you didn't just manage everything in a per request state similar to the other global function usage? You might even be able to get away with only initializing it on the first call to setting the loader and you already are performing actions in the RSHUTDOWN so no real additional overhead taking that approach.

Rob

On 9/2/11 1:14 AM, Gustavo André dos Santos Lopes wrote:
cataphract                               Fri, 02 Sep 2011 05:14:32 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=316019

Log:
- Use our external entity loader only in the context of a PHP request.

Changed paths:
     U   php/php-src/branches/PHP_5_4/ext/libxml/libxml.c
     U   php/php-src/trunk/ext/libxml/libxml.c

Modified: php/php-src/branches/PHP_5_4/ext/libxml/libxml.c
===================================================================
--- php/php-src/branches/PHP_5_4/ext/libxml/libxml.c    2011-09-02 04:55:59 UTC 
(rev 316018)
+++ php/php-src/branches/PHP_5_4/ext/libxml/libxml.c    2011-09-02 05:14:32 UTC 
(rev 316019)
@@ -674,6 +674,18 @@
        return ret;
  }

+static xmlParserInputPtr _php_libxml_pre_ext_ent_loader(const char *URL,
+               const char *ID, xmlParserCtxtPtr context)
+{
+       /* Check whether we're running in a PHP context, since the entity loader
+        * we've defined is an application level (true global) setting */
+       if (xmlGenericError == php_libxml_error_handler) {
+               return _php_libxml_external_entity_loader(URL, ID, context);
+       } else {
+               return _php_libxml_default_entity_loader(URL, ID, context);
+       }
+}
+
  PHP_LIBXML_API void php_libxml_ctx_error(void *ctx, const char *msg, ...)
  {
        va_list args;
@@ -713,7 +725,7 @@
                xmlInitParser();

                _php_libxml_default_entity_loader = 
xmlGetExternalEntityLoader();
-               xmlSetExternalEntityLoader(_php_libxml_external_entity_loader);
+               xmlSetExternalEntityLoader(_php_libxml_pre_ext_ent_loader);

                zend_hash_init(&php_libxml_exports, 0, NULL, NULL, 1);

@@ -729,6 +741,8 @@
  #endif
                xmlCleanupParser();
                zend_hash_destroy(&php_libxml_exports);
+
+               xmlSetExternalEntityLoader(_php_libxml_default_entity_loader);
                _php_libxml_initialized = 0;
        }
  }

Modified: php/php-src/trunk/ext/libxml/libxml.c
===================================================================
--- php/php-src/trunk/ext/libxml/libxml.c       2011-09-02 04:55:59 UTC (rev 
316018)
+++ php/php-src/trunk/ext/libxml/libxml.c       2011-09-02 05:14:32 UTC (rev 
316019)
@@ -674,6 +674,18 @@
        return ret;
  }

+static xmlParserInputPtr _php_libxml_pre_ext_ent_loader(const char *URL,
+               const char *ID, xmlParserCtxtPtr context)
+{
+       /* Check whether we're running in a PHP context, since the entity loader
+        * we've defined is an application level (true global) setting */
+       if (xmlGenericError == php_libxml_error_handler) {
+               return _php_libxml_external_entity_loader(URL, ID, context);
+       } else {
+               return _php_libxml_default_entity_loader(URL, ID, context);
+       }
+}
+
  PHP_LIBXML_API void php_libxml_ctx_error(void *ctx, const char *msg, ...)
  {
        va_list args;
@@ -713,7 +725,7 @@
                xmlInitParser();

                _php_libxml_default_entity_loader = 
xmlGetExternalEntityLoader();
-               xmlSetExternalEntityLoader(_php_libxml_external_entity_loader);
+               xmlSetExternalEntityLoader(_php_libxml_pre_ext_ent_loader);

                zend_hash_init(&php_libxml_exports, 0, NULL, NULL, 1);

@@ -729,6 +741,8 @@
  #endif
                xmlCleanupParser();
                zend_hash_destroy(&php_libxml_exports);
+
+               xmlSetExternalEntityLoader(_php_libxml_default_entity_loader);
                _php_libxml_initialized = 0;
        }
  }




Reply via email to