Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

svn: /php/php-src/trunk/ext/libxml/ libxml.c

21 views
Skip to first unread message

Dmitry Stogov

unread,
Aug 27, 2010, 2:12:37 AM8/27/10
to php...@lists.php.net
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));

0 new messages