php5+xml dom - проблемы со скоростью и перегрузки

23i

Guest
php5+xml dom - проблемы со скоростью и перегрузки

php 5.02 + xml dom + windows
есть класс который позволет перегнать массив пхп в xml.
при перегонки маленького массива никаких проблем,но
1. если начать переганать массив побольше то полная загрузка процессора (2 Ггц)
2. тот же маленький массив (2 элемента) + использование var_dump в последовательности: создаеться xml сущность далее используеться var_dump, потом сохранение xml приводит к тойже загрузке проца на всё катушку на неопределнно длительное время..

в чем может быть проблема?
может у кого есть или где то есть класс выполняющий подобную задачу, и ощибка у меня в классе?

собственно сам класс:

PHP:
interface xml_interface{
	//public function xmltree();
}

class xml implements xml_interface {
	
	private $root_element_name;
	private $object_class;
	private $object_values;
	private $array_keys;
	private $sub_array;
	private $root_element;
	private $main_element;
	private $main_xml_object;
	private $element;
	private $attribute;
	
	private $obj_element;
	private $obj_value;
	
	function __construct($array, $root_element_name = 'tc'){
		if(is_array($array)){
						
			$this->array = $array; 
			
			$this->xml_dom = new DOMDocument;
			$root_element = $this->xml_dom->createElement($root_element_name);
			$root_element = $this->xml_dom->appendChild($root_element);
			

			$this->xmltree($this->array , $root_element);
			
		} else {
			custom_die('class xml: __construct error - первый параметр неявляеться массивом');
		}
	}
	
	protected function xmltree($array, &$main_xml_object){
	
		foreach($array as $key => $value){
			$key_int = (int)$key;
			$key_int = (string)$key_int;
			dump($key_int,1);
			dump(strlen($key_int),1);
			dump(strlen($key),1);
			if(strlen($key_int) == strlen($key))
				$key = 'id'.$key;	
			$main_element = $this->xml_dom->createElement($key);
			$main_element = $main_xml_object->appendChild($main_element);
			
			
			switch ($value){
				case (is_object($value)):
					//$object_class = get_class($value);
					$object_values = get_object_vars($value);
					foreach($object_values as $obj_element => $obj_value){
								$attribute = $this->xml_dom->create_attribute($obj_element, $obj_value);
								$attribute = $main_element->appendChild($attribute);
					}					
					break;	
					
				case (is_array($value)):
					//$array_keys = array_keys($value);
					$this->xmltree($value, $main_element);
						
					break;
					
				case (is_string($value)):
				default:
					$element = $this->xml_dom->createTextNode($value);
					$element = $main_element->appendChild($element);
			}
		}
		
	}

	function __destruct() {
		$this->xml_dom->save('e:/1.xml');
       print "Destroying \n";
   }

}
 

23i

Guest
это интересно как?:)
я все что находил для таких же целей размером не менее 200 строк....я прост оен знаю где и до чего можно упрошять...
 

tony2001

TeaM PHPClub
23i
я хочу сказать, что ответить на конкретную проблему нормальный человек может.
но искать баги в двух листах кода вряд ли кто-то станет.
кроме того, логично предположить, что если ты сам хотя бы начнешь искать ответ, то с помощью форума ты найдешь его быстрее, чем если ты будешь сидеть и ждать.
 

tony2001

TeaM PHPClub
23i
без понятия.
ты можешь воспроизвести проблему, не я.
упрощай код до тех пор, пока проблема есть.
когда она исчезнет - остановись и вернись на шаг назад.
 

23i

Guest
значит выловил проблему
она возникает когда элемент массива - русское название, если на англ название то всё естественно ок.
пробелма в русском.
что тут можэно предпринять?
 

23i

Guest
когда елемент массива - строка из русских символов
например
PHP:
$xml_array = array('name'=>'Иван', 'credit' => array('sum' => 2500.25));
и следовательно тектом в элементе name в xml будет строка из русских символов, php уходит в неопределеннодлительную задумчивость...
 

23i

Guest
класс
PHP:
class xml implements xml_interface {
	
	private $root_element_name;
	private $object_class;
	private $object_values;
	private $array_keys;
	private $sub_array;
	private $root_element;
	private $main_element;
	private $main_xml_object;
	private $element;
	private $attribute;
	
	private $obj_element;
	private $obj_value;
	
	function __construct($array, $root_element_name = 'tc', $encoding="windows-1251"){

		if(is_array($array)){
						
			$this->array = $array; 
			
			$this->xml_dom = new DOMDocument;
			$root_element = $this->xml_dom->createElement($root_element_name);
			$root_element = $this->xml_dom->appendChild($root_element);
			

			$this->xmltree($this->array , $root_element);
			
		} else {
			custom_die('class xml: __construct error - первый параметр неявляеться массивом');
		}
	}
	
	protected function xmltree($array, &$main_xml_object){
	
		foreach($array as $key => $value){
			$key_int = (int)$key;
			$key_int = (string)$key_int;
			if(strlen($key_int) == strlen($key))
				$key = 'id'.$key;	
			$main_element = $this->xml_dom->createElement($key);
			$main_element = $main_xml_object->appendChild($main_element);
			
			
			switch ($value){
				case (is_object($value)):
					//$object_class = get_class($value);
					$object_values = get_object_vars($value);
					foreach($object_values as $obj_element => $obj_value){
								$attribute = $this->xml_dom->create_attribute($obj_element, $obj_value);
								$attribute = $main_element->appendChild($attribute);
					}					
					break;	
					
				case (is_array($value)):
					//$array_keys = array_keys($value);
					$this->xmltree($value, $main_element);
						
					break;
					
				case (is_string($value)):
				default:
					$element = $this->xml_dom->createTextNode($value);
					$element = $main_element->appendChild($element);
			}
		}
		
	}
	
	public function savefile($filename){
		try{
			$this->xml_dom->save($filename);	
		} catch (Exception $e) {
    			echo 'Caught exception: ',  $e->getMessage(), "\n";
		}

	}

	function __destruct() {
		$this->xml_dom->save('e:/1.xml');
       print "Destroying \n";
   }

}
вызываю
PHP:
$d = array('name'=>'ivan', 'credit' => array('sum' => 2500.25));

$d = new xml($d);
$d->savefile('e:/xml.xml');
 

tony2001

TeaM PHPClub
укажи кодировку:
$xml_dom->encoding = "...";

насколько мне известно, по-хорошему там должна быть UTF8 везде.
думаю, меня поправят, если я ошибаюсь.
 
Сверху