]> granicus.if.org Git - php/commitdiff
In some SAPI (e.g. FastCGI) we don't need to setup and reset libxml callbacks on...
authorDmitry Stogov <dmitry@php.net>
Fri, 27 Aug 2010 06:12:37 +0000 (06:12 +0000)
committerDmitry Stogov <dmitry@php.net>
Fri, 27 Aug 2010 06:12:37 +0000 (06:12 +0000)
ext/libxml/libxml.c

index 83e879d044103c3129e995cb74b21d90bb15dc1f..8d07a180559df4fba681b1ba9870e33cd6d30849 100644 (file)
@@ -26,6 +26,7 @@
 #endif
 
 #include "php.h"
+#include "SAPI.h"
 
 #define PHP_XML_INTERNAL
 #include "zend_variables.h"
@@ -53,6 +54,7 @@
 
 /* a true global for initialization */
 static int _php_libxml_initialized = 0;
+static int _php_libxml_per_request_initialization = 1;
 
 typedef struct _php_libxml_func_handler {
        php_libxml_export_node export_func;
@@ -636,22 +638,55 @@ static PHP_MINIT_FUNCTION(libxml)
        INIT_CLASS_ENTRY(ce, "LibXMLError", NULL);
        libxmlerror_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
 
+       if (sapi_module.name) {
+               static const char * const supported_sapis[] = {
+                       "cgi-fcgi",
+                       "fpm-fcgi",
+                       "litespeed",
+                       NULL
+               };
+               const char * const *sapi_name;
+
+               for (sapi_name = supported_sapis; *sapi_name; sapi_name++) {
+                       if (strcmp(sapi_module.name, *sapi_name) == 0) {
+                               _php_libxml_per_request_initialization = 0;
+                               break;
+                       }
+               }
+       }
+
+       if (!_php_libxml_per_request_initialization) {
+               /* report errors via handler rather than stderr */
+               xmlSetGenericErrorFunc(NULL, php_libxml_error_handler);
+               xmlParserInputBufferCreateFilenameDefault(php_libxml_input_buffer_create_filename);
+               xmlOutputBufferCreateFilenameDefault(php_libxml_output_buffer_create_filename);
+       }
+
        return SUCCESS;
 }
 
 
 static PHP_RINIT_FUNCTION(libxml)
 {
-       /* report errors via handler rather than stderr */
-       xmlSetGenericErrorFunc(NULL, php_libxml_error_handler);
-       xmlParserInputBufferCreateFilenameDefault(php_libxml_input_buffer_create_filename);
-       xmlOutputBufferCreateFilenameDefault(php_libxml_output_buffer_create_filename);
+       if (_php_libxml_per_request_initialization) {
+               /* report errors via handler rather than stderr */
+               xmlSetGenericErrorFunc(NULL, php_libxml_error_handler);
+               xmlParserInputBufferCreateFilenameDefault(php_libxml_input_buffer_create_filename);
+               xmlOutputBufferCreateFilenameDefault(php_libxml_output_buffer_create_filename);
+       }
        return SUCCESS;
 }
 
 
 static PHP_MSHUTDOWN_FUNCTION(libxml)
 {
+       if (!_php_libxml_per_request_initialization) {
+               xmlSetGenericErrorFunc(NULL, NULL);
+               xmlSetStructuredErrorFunc(NULL, NULL);
+
+               xmlParserInputBufferCreateFilenameDefault(NULL);
+               xmlOutputBufferCreateFilenameDefault(NULL);
+       }
        php_libxml_shutdown();
 
        return SUCCESS;
@@ -661,11 +696,13 @@ static PHP_MSHUTDOWN_FUNCTION(libxml)
 static PHP_RSHUTDOWN_FUNCTION(libxml)
 {
        /* reset libxml generic error handling */
-       xmlSetGenericErrorFunc(NULL, NULL);
-       xmlSetStructuredErrorFunc(NULL, NULL);
+       if (_php_libxml_per_request_initialization) {
+               xmlSetGenericErrorFunc(NULL, NULL);
+               xmlSetStructuredErrorFunc(NULL, NULL);
 
-       xmlParserInputBufferCreateFilenameDefault(NULL);
-       xmlOutputBufferCreateFilenameDefault(NULL);
+               xmlParserInputBufferCreateFilenameDefault(NULL);
+               xmlOutputBufferCreateFilenameDefault(NULL);
+       }
 
        if (LIBXML(stream_context)) {
                zval_ptr_dtor(&LIBXML(stream_context));