- xml_set_character_data_handler($this->_parser, 'cdata');
- if (!xml_parse($this->_parser, $this->message)) {
- /* die(sprintf('XML error: %s at line %d',
- xml_error_string(xml_get_error_code($this->_parser)),
- xml_get_current_line_number($this->_parser))); */
- return false;
- }
- xml_parser_free($this->_parser);
+ xml_set_character_data_handler($this->_parser, 'cdata');
+ $chunk_size = 262144; // 256Kb, parse in chunks to avoid the RAM usage on very large messages
+ do {
+ if ( strlen($this->message) <= $chunk_size )
+ $final=true;
+ $part = substr( $this->message, 0, $chunk_size );
+ $this->message = substr( $this->message, $chunk_size );
+ if ( !xml_parse( $this->_parser, $part, $final ) )
+ return false;
+ if ( $final )
+ break;
+ } while ( true );
+ xml_parser_free($this->_parser);