PHP Loganalyser mit XMLReader

Bislang haben wir uns SimpleXML und DOMDocument angeschaut. Diese beiden Varianten sind immer dann intressant wenn es sich um XML Dateien handelt, die im Speicher verarbeitet werden können.

Aber was wenn der Speicher knapp oder die XML-Datei zu groß ist?

In einem solchen Fall ist ein Pull Parser zu verwenden. Dieser gibt dem Entwickler bei Bedarf den nächsten Knoten und muss dadurch immer nur einen Teil der Datei im Speicher halten. Der Nachteil dabei ist jedoch, das ein Zugriff auf einzelne Knoten nicht
so flexibel möglich ist wie mit DOM und das der Entwickler den Zustand, also wo er sich gerade im XML Doument befindet selbst verwalten muss.

class XMLReaderLoganalyser implements LogAnalyserInterface {

	/**
	* @param string $filename
	*/
	protected $filename;

	/**
	* @param XMLReader
	**/
	protected $parsedXML = null;

	/**
	* @param string $filename	
	**/
	public function setFilename($filename) {
		if(!file_exists($filename) ){
			$msg = "Input xml file does not exist";
			throw new InvalidArgumentException($msg);
		}

		$this->filename = $filename;
	}

	/**
	* @return XMLReader
	**/
	protected function getParsedXML() {
		if($this->parsedXML == null) {
			$this->parsedXML = new XMLReader();
			$this->parsedXML->open($this->filename);
		}

		return $this->parsedXML;
	}

	/**
	* @param string 
	* @return integer 
	**/
	public function getPageviewsForIp($ipToCheck) {
		$pageViews 	= 0;
		$reader 	= $this->getParsedXML();
		
	
		while($reader->read()) {
			//search the first visit node
			if($reader->name == 'visit') {
				do {
					$ipGiven = $reader->getAttribute("ip");
					if($ipGiven == $ipToCheck) {
						$pageViews++;
					}

					//jump to next visit node
				} while($reader->next());

			}
		}

		return $pageViews;
	}

}

Vor- und Nachteile von XML Reader

Vorteile

  • Minimierter Speicherverbrauch
  • Knoten können bei Bedarf in DOMDocument konvertiert werden

Nachteil

  • Kein wahlfreier Zugriff auf Knoten
  • Aufwendigere Implementierung das der Zustand und Zugriff im XML Dokument komplizierter ist und selbst verwaltet werden muss.

Navigation