Источник Sphinx xmlpipe2
Пример Sphinx xmlpipe2:
- xmlpipe2.php
<?php class SphinxXml2Pipe { private $db; public function __construct() { // получаем объект для работы с БД (вписать свой) $this->db = GlobalContainer::GetDB(); // чтобы не забивать кеш запросов "мусором" $this->db->Query("SET SESSION query_cache_type=OFF"); } public function run() { // ini_set("memory_limit","128M"); // Включить для тестирования в условиях ограниченного объема памяти $this->startXml(); $this->putXmlSchema(); while($this->getDocs()) { foreach($this->documents as $doc) { $this->putXmlDoc($doc); } unset($this->documents); // против утечки памяти если $doc - объект fwrite(STDOUT, $this->xml->flush(true)); // против переполнения памяти } $this->endXml(); fwrite(STDOUT, $this->xml->flush(true)); // против переполнения памяти } // "порционное" получение результатов с целью экономии памяти private $limitPerQuery = 1000, $offsetQuery = 0, $documents; private function getDocs() { // написать собственный запрос $query = "SELECT `id`, `some_other_data` FROM `my_table` LIMIT {$this->offsetQuery}, {$this->limitPerQuery}"; $this->documents = $this->db->SelectSet($query); $this->offsetQuery += $this->limitPerQuery; return is_array($this->documents) && count($this->documents) > 0; } private $xml; private function startXml() { $this->xml = new XmlWriter(); $this->xml->openMemory(); $this->xml->setIndent(true); $this->xml->setIndentString(' '); $this->xml->startDocument('1.0', 'utf-8'); $this->xml->startElement('sphinx:docset'); } private function putXmlSchema() { $this->xml->startElement('sphinx:schema'); // тип - текст $this->xml->startElement('sphinx:field'); $this->xml->writeAttribute('name', 'text'); $this->xml->endElement(); // тип - год (int 16 бит) $this->xml->startElement('sphinx:attr'); $this->xml->writeAttribute('name', 'year'); $this->xml->writeAttribute('type', 'int'); $this->xml->writeAttribute('bits', 16); $this->xml->endElement(); // тип - строка $this->xml->startElement('sphinx:attr'); $this->xml->writeAttribute('name', 'tags'); $this->xml->writeAttribute('type', 'string'); $this->xml->endElement(); // тип - булев (да/нет) $this->xml->startElement('sphinx:attr'); $this->xml->writeAttribute('name', 'popular'); $this->xml->writeAttribute('type', 'bool'); $this->xml->endElement(); $this->xml->endElement(); } private function putXmlDoc(array $doc) { $this->xml->startElement('sphinx:document'); $this->xml->writeAttribute('id', $doc['id']); $this->xml->startElement('text'); $this->xml->writeCData($doc['text']); $this->xml->endElement(); $this->xml->writeElement('year', $doc['year']); $this->xml->startElement('tags'); $this->xml->writeCData($doc['tags']); $this->xml->endElement(); $this->xml->writeElement('popular', $doc['is_popular'] == 1); $this->xml->endElement(); } private function endXml() { $this->xml->endElement(); } } $pipe = new SphinxXml2Pipe(); $pipe->run();