dmitry                                   Fri, 27 Aug 2010 06:12:37 +0000

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

Log:
In some SAPI (e.g. FastCGI) we don't need to setup and reset libxml callbacks 
on each request, we con do it only once. Probably the list of such SAPI may be 
extended.

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

Modified: php/php-src/trunk/ext/libxml/libxml.c
===================================================================
--- php/php-src/trunk/ext/libxml/libxml.c       2010-08-27 06:09:18 UTC (rev 
302841)
+++ php/php-src/trunk/ext/libxml/libxml.c       2010-08-27 06:12:37 UTC (rev 
302842)
@@ -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 @@
        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_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));

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to